Der Christian: update Statement korrekt?

Hallo,

Meine Datenbank will aus irgendeinem Grund nicht updaten. DIESES FAULE DING!

Versuche den Fehler nun mittels Adlermethode i.e. in konzentrischen Kreisen ...einzukreisen.

Prinzipiell will ich in der Tabelle t einen Eintrag entry inkrementieren, wenn die Differenz zwischen PHP Variable $currTimestamp und dem in der Datenbanktabelle hinterlegtem timestamp weniger als 10000ms beträgt

Handelt es sich bei folgender um eine valide gültige und damit weihnachtsfriedliche Query?


"UPDATE t SET entry = entry + 1 WHERE $currTimestamp - timestamp < 10000 AND user = ? AND id = ?";

bzw.


"UPDATE t SET entry = entry + 1 WHERE $currTimestamp - timestamp <= 10000 AND user = ? AND id = ?"; 

user und id werden mittels prepared Statement eingefügt. Daran kann es nicht liegen, da vor Einfügen von timestamp in Query alles funktioniert hat

Müsste doch eigentlich in Ordnung sein...?

Ich bin mir fast sicher, dass ich mir nach erfolgreicher Fehlersuche mal wieder an den Kopf greifen werde... aber irgendwo ist da der Hund drin...

Wenn ich hier von eurer Seite grünes Licht bekomme, weiß ich zumindest schon mal, dass es NICHT am SQL Statement liegt... 😅

Danke und frohohohes Eh schon wissen,

Christian!

  1. Hi,

    Handelt es sich bei folgender um eine valide gültige und damit weihnachtsfriedliche Query?

    
    "UPDATE t SET entry = entry + 1 WHERE $currTimestamp - timestamp < 10000 AND user = ? AND id = ?";
    

    Handelt es sich Deiner Meinung nach bei

    UPDATE t SET entry = entry + 1 WHERE 2022-12-22T15:52:00 - timestamp < 10000
    

    um ein gültiges Statement?

    Für die anderen variablen Werte nutzt Du die ?-Ersetzung, warum nicht beim current timestamp?

    Abgesehen davon: für Differenzen zwischen Daten gibt es in mysql extra Funktionen, z.B date_diff.

    cu,
    Andreas a/k/a MudGuard

    1. Handelt es sich Deiner Meinung nach bei

      UPDATE t SET entry = entry + 1 WHERE 2022-12-22T15:52:00 - timestamp < 10000
      

      um ein gültiges Statement?

      Nein nein nein, bei der Variable $currTimestamp handelt es sich in dem Fall um round(microtime(true) * 1000);, also nicht um 2022-12-22T15:52:00.

      (Der in der Datenbanktabelle vorhandene timestamp wurde auf die gleiche Weise zu einem früheren Zeitpunkt ermittelt.)

      Für die anderen variablen Werte nutzt Du die ?-Ersetzung, warum nicht beim current timestamp?

      Naja, im Gegensatz zu user und id, die mir der Client schickt, wird timestamp ja ausschließlich am Server ermittelt, kommt nie mit dem Client in Kontakt und muss somit auch nicht prepared werden.

      Abgesehen davon: für Differenzen zwischen Daten gibt es in mysql extra Funktionen, z.B date_diff.

      Nein, bitte nicht noch einmal andere Lösungen ins Spiel bringen - mir ist eh schon schwindlig.

      cu,
      Andreas a/k/a MudGuard

      L G

      1. Hi,

        Nein nein nein, bei der Variable $currTimestamp handelt es sich in dem Fall um round(microtime(true) * 1000);, also nicht um 2022-12-22T15:52:00.

        naja, bei der Fülle an Informationen, die Du weggelassen hast, kann man ja nur raten.

        Bekommst Du eine Fehlermeldung? Wenn ja, welche?
        Oder bekommst Du nur ein unerwartetes Ergebnis?
        Wie sieht die Definition der Tabelle aus (zumindest die Typen der relevanten Spalten)?
        ...

        Nein, bitte nicht noch einmal andere Lösungen ins Spiel bringen - mir ist eh schon schwindlig.

        Oh - Du bist gar nicht an Lösungen interessiert - warum fragst Du dann überhaupt?

        cu,
        Andreas a/k/a MudGuard

        1. Hallo MudGuard,

          Oh - Du bist gar nicht an Lösungen interessiert - warum fragst Du dann überhaupt?

          date_diff würde ja eh nicht helfen, wenn er keine DATE oder DATETIME-Spalte hat. Man könnte natürlich die Tabelle ändern und eine draus machen…

          Aber warum funktioniert die Query so, wie sie ist, nicht?

          Mein Ansatz wäre, den SQL String zu protokollieren und ihn mal im phpmyadmin auszuprobieren - oder welches DB Tool auch immer eingesetzt wird.

          Alternativ könnte man sich auch die Ausgabe von

          print_r(mysqli_error_list($db));
          

          anschauen, gleich nach dem execute() des präparierten UPDATE Statements.

          Rolf

          --
          sumpsi - posui - obstruxi