Klaus1: Permission denied beim PHP/MySQL Load into Table

Beitrag lesen

Hallo,

wenn ein mysql_error > 0 auftritt, kannst Du in der Schleife schon mal mit continue zum Ende der Schleife springen.

Das stimmt wohl, das ist noch keine korrekte Fehlerbehandlung

Außerdem solltest du den Filename nur einmal bestimmen und nicht für jede Verwendung neu zusammenbauen. Dann kannst Du ihn im Fehlerfall auch mit ausgeben, bzw loggen lassen.

Den Dateinamen bestimme ich mehrmals, da es mehrere Exporte aus SAP geben kann/wird, die mit unterschiedlichen Zeitstempeln erzeugt wurden.

Bevor Du das SQL-Statement aufrufst, bzw. schon, bevor Du es zusammenbaust, könntest Du mit file_exists() und mit is_readable() auch prüfen, ob der Pfad gültig und lesbar ist.

Wenn keine Dateien lesbar wären, würde glob() ein leeres Ergebis bringen. Da aber Dateien gefunden werden, aus denen auch der Zeitstempel extrahiert werden können (durch das Echo "Daten mit dem Zeitstempel..." bewiesen), ist der Lesezugriff durch PHP schonmal gewährleistet

Das TOCTTOU-Problem baust Du dir schon mig Glob() auf. Wenn Du die damit erstellte Liste erst später abarbeitest, kann die im Dateisystem schon wieder ungültig sein. Kommt darauf an, ob parallele Prozesse ablaufen. Das isg aber in einem Netzwerk üblich.

Da nur eine einzige Person berechtigt ist den Import durchzuführen und die Verarbeitung direkt innerhalb der Glob-Schleife stattfindet, sollte es keine störenden parallelen Prozesse geben.

Bau also die Directorystruktur erstmal so um, dass Du nicht mitten im Dateinamen rumfummeln musst, sondern dass es ganz klare Verzeichnisse für Quelle und Ziel gibt, in denen die Dateien sich dann befinden.

Der Dateinamen hat doch nichts mit der Directorystruktur zu tun. Die Dateinamen werden durch den SAP-Export vorgegeben und haben immer dieselbe Struktur und Länge: t_company_20191120125208.csv

Und lass Dir den nicht gefundenen Dateinamen mit ausgeben.

Der "nicht gefundene" Dateiname wird ja in der Fehlermeldung ausgegeben.

Import-Error: File '/var/lib/mysql-files/t_company_20191120125208.csv' not found (OS errno 13 - Permission denied)

Du könntest auch die Glob-Liste am Anfang ausgeben. Das kostet Dich ein müdes Runzeln und verschafft Dir Übersicht.

Im Grunde geben ich die Glob_Liste ja aus. Siehe

echo "Daten mit Zeitstempel $zeitstempel werden importiert...<br/>";

Vielleicht hätte ich erwähnen sollen, ich habe den Script-Schnipsel reduziert, da nicht nur eine Datei (t_company_xxxx.csv), sondern noch 2 weitere automatisch vom SAP erzeugt und von mir eingelesen werden. Da der Fehler aber bei allen 3, wenn er denn auftritt, identisch ist, habe ich das Script hier dahingehend verkürzt.

Könnte es vielleicht sein, dass der Glob() die Dateien anpackt und vielleicht einen Ticken zu lange festhält, sodass die Datei für den direkt im Anschluss ausgeführte "Load Data"-Befehl noch nicht wieder freigegeben ist? Das würde für mich erklären, dass es mal funktioniert und mal nicht. Ich habe hierfür mal ein sleep(3)eingebaut und werde testen lassen, sobald wieder Export-Dateien vom SAP zur Verfügung gestellt werden.

LG Klaus