Günni: ein Aufruf, 3 Datensätze gespeichert

Ich verstehe die Welt nicht ganz,

eigentlich müsste alles normalgehen, doch es werden bei jedem Aufruf 3 Datensätze gespeichert:

$statement = $pdo->prepare("INSERT INTO derg SET id_lo =:id_lo");
$result = $statement->execute(array('id_lo' => '12345' ));

EDIT Code als Code ausgezeichnet

  1. Meine Glaskugel behauptet: Womöglich wird das gezeigte

    $statement = $pdo->prepare(
        "INSERT INTO derg SET id_lo =:id_lo" );
    )
    $result = $statement->execute(
       array( 'id_lo' => '12345' )
    );
    

    aus unbekannten Gründen drei Mal ausgeführt.

    1. Aber warum? Ich denke das der Code richtig ist.

      1. Hallo Günni,

        Aber warum? Ich denke das der Code richtig ist.

        Der gezeigte Code wird dann wohl richtig drei Mal ausgeführt.

        Bis demnächst
        Matthias

        --
        Du kannst das Projekt SELFHTML unterstützen,
        indem du bei Amazon-Einkäufen Amazon smile (Was ist das?) nutzt.
      2. Hallo Günni,

        dein SQL führt eine einzige Schreiboperation durch. Wenn es nachher 3 Datensätze gibt, ist die Ursache nicht in dem Code zu suchen, den Du uns zeigst.

        Insofern ist der Hinweis der Glaskugel sehr berechtigt. Diesem Hinweis nachgehen kannst Du aber nur selbst, es sei denn, du postest deinen gesamten Code. HALT, nicht tun.

        Besser wäre, wenn Du selbst anfängst, zu debuggen.

        • mit XDEBUG den Code schrittweise ausführen (was voraussetzt, dass der Webserver auf deinem eigenen Gerät läuft)
        • den Code mit Protokoll-Ausgaben vollstopfen. Entweder mit echo ausgeben, oder - wenn Du einen Logging-Mechanismus verfügbar hast, ins Log schreiben. Solche Protokoll-Ausgaben müssen Dir zumindest verraten, welche Codestelle gerade durchlaufen wurde. Je nach den Umständen gibst Du auch noch kritische Variableninhalte aus.

        Mit echo zerreißt es Dir natürlich unweigerlich das HTML, weil diese echos mittendrin landen. Ich löse so etwas gerne mit einem globalen Array, in dem ich die Debug-Ausgaben sammle, und das ich am Ende in einem von mir kontrollierten Bereich des HTML ausgeben. Nachteil: sollte das Script mit einem fatal error abbrechen, geht die Debug-Ausgabe verloren. Das kann man, wenn es nötig wird, mit Funktionen, die über set_error_handler und set_exception_handler registriert werden, lösen.

        Protokolliere also deinen Ablauf. Danach weißt Du mehr.

        Rolf

        --
        sumpsi - posui - obstruxi
        1. Tach!

          Ergänzend:

          Protokolliere also deinen Ablauf. Danach weißt Du mehr.

          Es kann auch sein, dass das Script dreimal aufgerufen wird, weil irgendeine HTML-Referenz falsch ist und den Browser veranlasst, zwei weitere Requests zu senden, die zum Aufrufen des Scripts führen. In einem solchen Fall bringt es nichts, die Debugdaten in der Ausgabe unterzubringen. Stattdessen sollten sie dann in eine Logdatei geschrieben werden. Aber Achtung, dass man sich diese Datei nicht mittels eine TOCTTOU-Problems selbst überschreibt. Besser ist es, das Errorlog zu verwenden, wenn man darauf Zugriff hat.

          In die Ausgabe muss dann auch, welche URL aufgerufen wurde, bevor ein eventuelles Rewriting stattfand, was in $_SERVER['REQUEST_URI'] zu finden sein sollte. Und auch die Entwicklertools des Browsers können im Netzwerk-Tab Auskunft geben, was alles aufgerufen wird.

          dedlfix.

          1. Stattdessen sollten sie dann in eine Logdatei geschrieben werden.

            Genau!

            Mein Vorschlag wäre dieser: Beim Debuggen logischer Fehler kann man hierzu auch das Error-Log des Webservers nutzen. trigger_error() kann man via Konstante einen Fehlertyp mitgeben:

            $result = $statement->execute(
               array( 'id_lo' => '12345' )
            );
            trigger_error(
                'Datensatz hoffentlich geschrieben',
                E_USER_NOTICE
            );
            

            den Rest erledig etwas wie tail -fn0 /var/log/apache2/error.log in einem Terminal beim Testen.

            Literatur für Günni: Ab error_reporting bietet PHP.net eine gute Beschreibung fürs Error-Handling. Die Linkliste unter "siehe auch" ist hierbei wichtig.