Martin S.: mysql UPDATE wird nur scheinbar durchgeführt

In meinem aktuellen Projekt benutze ich eine Spalte mit int-Werten für eine Sortierung. Für die Funktionalität in der Oberfläche ist es notwendig, dass bei einem Verändern der Reihenfolge zwei Werte gegeneinander getauscht werden. Hierfür führe ich die folgenden Operationen durch:

$str_query  = "SELECT * FROM tbl_articledocument ";
$str_query .= "WHERE (tbl_articledocument.id = '".$id_targetdownload."')";
$sql_result = mysql_query($str_query);

$row1 = MYSQL_FETCH_ARRAY_R($sql_result);

$str_query  = "SELECT * FROM tbl_articledocument ";
$str_query .= "WHERE (tbl_articledocument.id = '".$id_download."')";
$sql_result = mysql_query($str_query);
$row2 = MYSQL_FETCH_ARRAY_R($sql_result);

$str_query = "UPDATE tbl_articledocument SET int_row = '".$row2[0]["int_row"]."', sql_dummy = NOW() WHERE tbl_articledocument.id = '".$row1[0]["id"]."'";
$sql_result = mysql_query($str_query);
if (mysql_affected_rows() > 0) {
  $str_query = "UPDATE tbl_articledocument SET int_row = '".$row1[0]["int_row"]."', sql_dummy = NOW() WHERE tbl_articledocument.id = '".$row2[0]["id"]."'";
  $sql_result = mysql_query($str_query);
  if (mysql_affected_rows() > 0) {
    header("Location:".URL."/pages/content_edit.php?sess_id=".$sess_id."");
}

Es wird effektiv ein Austausch der Werte für int_row durchgeführt. Alle SQL-Abfragen sind korrekt, enthalten die richtigen Werte und werden korrekt durchgeführt. Wenn ich nun in der Folgeseite

$str_query  = "SELECT * FROM tbl_articledocument ";

durchführe, wurde das Update nicht durchgeführt. Wenn ich jedoch die Werte in der vorherigen Seite mit dem selben Befehl abfrage, erhalte ich die upgedateten Werte. Ein LOCK/UNLOCK der tabellen brachte wenig Erfolg, genauso ein FLUSH vor der Abfrage.

Was kann noch Ursache für das "scheinbare" Update sein? Wenn ich mir den Timestamp von den betroffenen Zeilen ausgeben lasse, wurden diese jedoch korrekt geupdatet ?!

  1. Moin!

    Grundsatzerklärung zu derartigen Problemen:

    Wann immer eine Query nur scheinbar durchgeführt wird (und sonst immer auch) ist es von erheblichem Interesse zu erfahren, was die Datenbank von selbiger hält.

    Wenn die was zu bemängeln hat kann das in der bereits millionenfach empfohlenen Art ausgegeben werden:

    $sql_result = mysql_query($str_query) OR die (echo "<hr>".mysql_error()."<hr>".$str_query."<hr>");

    Sollte dennoch der Eindruck entehen, etwas wäre nicht in der Datenbank geändert, so empfielt sich dringend ein direkter Blick in die Datenbank und die Überlegung, ob nicht irgendeine Cache- Funktion des Browsers oder eines Proxys zur Darstellung veralteter Information führt.

    Diese Information wäre bei einer Archivsuche hundertfach vorhanden gewesen. Bitte beim nächsten mal benutzen.

    Bitte und Danke.

    MFFG (Mit freundlich- friedfertigem Grinsen)

    fastix®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.
    1. Auf die von Dir beschriebenen schlauen Grundsatzlösungen bin ich bereits selber gekommen, ich habe diese auch alle schon ausprobiert, jedoch ohne negativem Ergebnis. Ebenso die Suche im Archiv, leider konnte mir bisher keiner der erhaltenen Artikel die Lösung bringen, daher ja auch meine Frage ...

      1. $sql_result = mysql_query($str_query) OR die (echo "<hr>".mysql_error()."<hr>".$str_query."<hr>");

      Kein DIE wurde ausgeführt -> Alle Anfragen okay

      2. direkter Blick in die Datenbank

      Resultat: Keine Änderung durchgeführt -> Speichern mißlungen.

      Also ...

      Frage 1: Wurde denn überhaupt ein Update durchgeführt?
      Antwort 1: Ja, denn die Timestamps der Werte sind geupdatet, nur die eigentlichen Werte, die getauscht werden sollen, sind unaktuell.

      Frage 2: Warum erhält die aktuelle Seite dann die richtigen, die Folgeseite die falschen Werte ?

      3. gecachte Browserseite ...

      Ausgeschlossen per NO-Cache, abgeschaltetem Cache im Browser und Ausgabe der aktuellen Serverzeit in der Seite -> Seite wirklich direkt vom Server.

      4. >> Diese Information wäre bei einer Archivsuche hundertfach vorhanden gewesen.

      Die Information ist vorhanden, sie half nur nix. Deswegen ja meine Frage.

      5. >> Bitte beim nächsten mal benutzen.

      Die Information, ob ich diese benutzt habe, stand Dir offensichtlich nicht zur Verfügung. Ich reiche sie nach: Ich habe diese Funktion benutzt.

      1. yo,

        Kein DIE wurde ausgeführt -> Alle Anfragen okay
        Resultat: Keine Änderung durchgeführt -> Speichern mißlungen.
        Frage 1: Wurde denn überhaupt ein Update durchgeführt?
        Antwort 1: Ja, denn die Timestamps der Werte sind geupdatet, nur die eigentlichen Werte, die getauscht werden sollen, sind unaktuell.

        aus dem bauch heraus würde ich sagen, dass das update erfolgreich ist, nur die alten werte reingeschrieben werden und nicht wie gewünscht getauscht wird. ich gehe mal davon aus, du hast es schon gemacht, aber nur um mich zu beruhigen, hast du dir mal beide update queries mit echo ausgeben lassen, um die werte zu sehen, die reingeschriebenw werden ?

        Frage 2: Warum erhält die aktuelle Seite dann die richtigen, die Folgeseite die falschen Werte ?

        vielleicht weil im aktuelle script die variablen richtiger weise bei der ausgabe vertauscht werden, aber nicht beim update ?

        Ilja

      2. Moin!

        Verstehe bitte... im Skript stand nichts von mysql_error() und das ist der häufigste Fehler, meistens mit Archivsucheverweigerung verbunden.

        Hm. Dann bleibt noch eines:
          Du bist Dir sicher, daß Du die richtige Tabelle in der richtigen Datenbank updatest?
          Laß Dir auch mal sicherheitshalber alle Querys ausgeben. -> ggf. in ein Logfile und führe diese(s)
          dann mal direkt auf der Datenbank (Oder meinetwegen PHPAdmin) aus.

        Das letzte Mal, als mir sowas passiert ist, da habe ich die Daten auf dem Localhost (=Testserver)
          geändert und dann auf dem Webserver danach geprüft: ich war ähnlich verzweifelt...

        MFFG (Mit freundlich- friedfertigem Grinsen)

        fastix®

        --
        Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.