Marcel: PHP Script bricht beim schreiben in die Datenbank ab

Hallo,

ich lese eine etwas größere .csv Datei in eine MySQL Tabelle ein. Das Script funktioniert an sich aber bei dem Datensatz Nr. 10870 bricht es ohne Fehlermeldung ab.
Und zwar genau bei "$result = mysql_query($query);"

Die MySQL-Abfrage bringt keine Fehlermeldung wenn ich sie in PHPMyAdmin direkt eingebe bzw rein kopiere und dann ausführe.

Was die Laufzeit des Scriptes anbelangt, so habe ich am Anfang mit time() den Wert von 1192626844 und am Ende: 1192626717 - Differenz: 127

Ist da ein Timeout? Oder an was kann das liegen?

Bin für jeden Tipp dankbar

Gruß Marcel

  1. echo $begrüßung;

    ich lese eine etwas größere .csv Datei in eine MySQL Tabelle ein. Das Script funktioniert an sich aber bei dem Datensatz Nr. 10870 bricht es ohne Fehlermeldung ab.
    [...] Oder an was kann das liegen?

    Kann man ohne konkrete Meldung so nicht sagen.

    Was die Laufzeit des Scriptes anbelangt, so habe ich am Anfang mit time() den Wert von 1192626844 und am Ende: 1192626717 - Differenz: 127
    Ist da ein Timeout?

    Das heißt also, dass dein Script bis zum Ende kommt, denn sonst könntest du die Zeit ja nicht wissen. Daraus vermute ich eher einen Fehler im MySQL-Teil als in PHP.
    (PHP wird durch max_execution_time laufzeitbegrenzt. Dann bricht aber das Script komplett ab. Eine Laufzeitmessung an seinem Ende wäre dann nicht möglich.)

    Bin für jeden Tipp dankbar

    PHP-Fehlermeldungen sind erlaubt? error_reporting steht auf E_ALL? display_errors ist eingeschaltet?
    Fehlerzustände der mysql_*()-Funktionen werden ausgewertet? Im Fehlerfall geben die näbmlich ein false zurück. Ein Meldungstext im Klartext kann dann über mysql_error() abgefragt werden. (Jetzt sag bitte nicht:

    Die MySQL-Abfrage bringt keine Fehlermeldung wenn ich sie in PHPMyAdmin direkt eingebe bzw rein kopiere und dann ausführe.

    ... denn das kann in deinem Script ganz anders aussehen.

    echo "$verabschiedung $name";

    1. Hallo!

      ich lese eine etwas größere .csv Datei in eine MySQL Tabelle ein. Das Script funktioniert an sich aber bei dem Datensatz Nr. 10870 bricht es ohne Fehlermeldung ab.
      [...] Oder an was kann das liegen?

      Kann man ohne konkrete Meldung so nicht sagen.

      Was die Laufzeit des Scriptes anbelangt, so habe ich am Anfang mit time() den Wert von 1192626844 und am Ende: 1192626717 - Differenz: 127
      Ist da ein Timeout?

      Das heißt also, dass dein Script bis zum Ende kommt, denn sonst könntest du die Zeit ja nicht wissen. Daraus vermute ich eher einen Fehler im MySQL-Teil als in PHP.
      (PHP wird durch max_execution_time laufzeitbegrenzt. Dann bricht aber das Script komplett ab. Eine Laufzeitmessung an seinem Ende wäre dann nicht möglich.)

      Nein, das Script läuft nicht bis zum Ende. Ich hab die Funktion time() innerhalb der Schleife aufgerufen. Genau wie jetzt nachträglich auch connection_status().

      PHP-Fehlermeldungen sind erlaubt? error_reporting steht auf E_ALL? display_errors ist eingeschaltet?

      Auszug aus der php.ini
      error_reporting  =  E_ALL & ~E_NOTICE
      display_errors = On

      Fehlerzustände der mysql_*()-Funktionen werden ausgewertet? Im Fehlerfall geben die näbmlich ein false zurück. Ein Meldungstext im Klartext kann dann über mysql_error() abgefragt werden. (Jetzt sag bitte nicht:

      Die MySQL-Fehler habe ich abgefragt: mit if (!$result) {$err=mysql_error(); $error_text = ".."}

      Die MySQL-Abfrage bringt keine Fehlermeldung wenn ich sie in PHPMyAdmin direkt eingebe bzw rein kopiere und dann ausführe.

      ... denn das kann in deinem Script ganz anders aussehen.

      Ich lasse mir die Abfrage mit ausgeben und kopiere sie dann in PhpMydmin. Ausserdem hat der Query, nur mit anderen Werten, vorher schon über 10.000 mal funktioniert.

      Das ist ganz schön zum verrückt werden!

      Für weitere Ideen bin ich nach wie vor offen und dankbar!

      Gruß Marcel

  2. Hallo,

    Ist da ein Timeout? Oder an was kann das liegen?

    Ich habe gerade mit connection_status() den Verbindungsstatus von PHP anzeigen lassen. Dieser ist auch nach Ablauf des Scriptes noch "0".

    Kein Timeout? Was dann sonst?

    Nochmals tausend Dank für eventuelle Tipps!

    Gruß Marcel

  3. Hello,

    leider schreibst Du nicht, _wie_ Du das Einlesen bewerkstelligst.
    Schleife in PHP
    oder ist es ein import-Statement?

    Ist die CSV-Datei in Ordnung? Könnte sie z.B. genau beim bezeichnten Datensatz eine Spalte zu wenig oder zuviel haben, oder Sonderzeichen enthalten?

    Und dann schau Dir z.B. mal an, was ein MySQL-DUMP erzeugt, den man mit phpMyAdmin erstellt.
    Der bindet immer nur eine bestimmte Anzahl von Datensätzen zu einem Statement für den Wiederimport. Ich meine, es waren 500, aber keinesfalls über 10.000.

    Bei Verwendung einer Schleife könnte ausßerdem noch vergessen worden sein, das Resultset (sollte es eins geben) wieder freizugeben.

    Harzliche Grüße vom Berg
    http://bergpost.annerschbarrich.de

    Tom

    --
    Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
    Nur selber lernen macht schlau
    Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

    1. Hallo Tom!

      Vielen Dank für deine Hinweise!

      leider schreibst Du nicht, _wie_ Du das Einlesen bewerkstelligst.
      Schleife in PHP
      oder ist es ein import-Statement?

      Die Daten lese ich in einer PHP-Schleife mit
      while ( ($data = fgetcsv ($handle, 1000, ';')) != FALSE ) {}
      ein.
      Aber daran dürfte es nicht liegen. Denn das Script bricht genau beim Zugriff auf die MySQL Datenbank ab. Das habe ich durch einige  Ausgaben mit echo "Zeile..." herausgefunden.

      Ist die CSV-Datei in Ordnung? Könnte sie z.B. genau beim bezeichnten Datensatz eine Spalte zu wenig oder zuviel haben, oder Sonderzeichen enthalten?

      Ich habe mit verschiedenen Dateien probiert. OK, ich könnte sie mal halbieren und beide Teile getrennt verwenden. Das werde ich noch probieren.

      Und dann schau Dir z.B. mal an, was ein MySQL-DUMP erzeugt, den man mit phpMyAdmin erstellt.
      Der bindet immer nur eine bestimmte Anzahl von Datensätzen zu einem Statement für den Wiederimport. Ich meine, es waren 500, aber keinesfalls über 10.000.

      Mmmh, ich kopiere natürlich immer nur eine Abfrage ala:
      SELECT id, art_nr from tabelle WHERE tabelle.art_nr LIKE 'xxx' in den PhpMyAdmin.

      Gruß Marcel

      1. Hello,

        Die Daten lese ich in einer PHP-Schleife mit

        while ( ($_data = fgetcsv ($handle, 1000, ';')) !== FALSE )  ## Einen Satz als Array holen
          {                                             #  ^ #
            ## gib uns bitte auch noch den Rest

        }

        Aber daran dürfte es nicht liegen. Denn das Script bricht genau beim Zugriff auf die MySQL Datenbank ab. Das habe ich durch einige  Ausgaben mit echo "Zeile..." herausgefunden.

        Im Prinzip sollte immer ein Array kommen. Aber ich würde nicht die Lesbarkeit der Zeile in CSV-Formatierung als Kriterium nehmen für die Schleife, sondern ein feof().

        Die Lesbarkeit ist dann nur dafür zuständig, ob der Satz ins Töpfchen oder ins Kröpfchen kommt ;-)

        Ist die CSV-Datei in Ordnung? Könnte sie z.B. genau beim bezeichnten Datensatz eine Spalte zu wenig oder zuviel haben, oder Sonderzeichen enthalten?

        Wenn sie mit Separator, Delimiter und Delimiter-Doubling erstellt wurde, also in der Form

        "Feld1";"Feld2 enthält ein "" Häkchen";"es dürfen auch
           Umbrüche in einem mit Delimiters (Enclosures) umschlossenen
           Feld enthalten sein"

        dann sollte es für die PHP-Funktion fget_csv() beio richtiger Angabe dieser Zeichen in den Funktionsargumenten keine Probleme geben.

        Beim insert in die DB muss dann natürlich auch passend escaped werden vorher.

        Harzliche Grüße vom Berg
        http://bergpost.annerschbarrich.de

        Tom

        --
        Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
        Nur selber lernen macht schlau
        Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

        1. Hello,

          while ( ($_data = fgetcsv ($handle, 1000, ';')) !== FALSE )  ## Einen Satz als Array holen
            {                                             #  ^ #
              ## gib uns bitte auch noch den Rest

          }

          reichen denn die 1000 Zeichen für die Satzlänge aus?
          Ich nehme an, dass fgetcsv() hier den Satz zerteilt, weil es mittendrin (nach 1000 Zeichen) aufhört zu lesen und dann natürlich einen Fehler produziert.

          Es fehlen ausßerdem die Einschlusszeichen (Delimiter nach SDF oder bei PHP Enclosures genannt)!

          Harzliche Grüße vom Berg
          http://bergpost.annerschbarrich.de

          Tom

          --
          Fortschritt entsteht nur durch die Auseinandersetzung der Kreativen
          Nur selber lernen macht schlau
          Ein Jammer ist auch, dass die Dummen so selbstsicher und die Klugen voller Zweifel sind. Das sollte uns häufiger zweifeln lassen :-)

  4. Hi Marcel
    ich habe sowas auch öfter,
    wenn meine Deppen mir 'ne Excel Tabelle geben und irgendwo ein ' eingebaut haben.

    Könnte mir vorstellen,
    das Du solche Zeichen im script nicht maskierst und es deswegen den PHP-Error gibt.

    Prüf mal den Datensatz nach 1870 ...

    Grüsse, Frank