Dengue: MySQL 5, PHP 5

Hallo,
ich habe ein eigenartiges Problem, wenn ich eine SQL-Anweisung in PHP ausführen will:
Mein Script ist voller SQL-Anweisungen, die auch laufen. Aber an einer Stelle wird eine Anweisung einfach nicht ausgeführt. Das PHP-Script gelangt definitiv dorthin und es gibt weder in PHP (geprüft mit error_reporting(E-ALL);) noch in MySQL einen Fehler.

$sql = "  
  UPDATE tabelle1  
  SET spalteA = 67  
  WHERE spalteB = 145  
";  
echo $sql;  
  
mysql_query($sql);  
  
echo "test";

Beide echos werden angezeigt und die SQL-Anweisung, die "echo $sql" ausgibt, funktioniert, wenn ich sie manuell in die DB eingebe. Die IDs 67 und 145 gibt es definitiv auch.

Ich habe mal statt dem Update-Befehl eine Select-Abfrage gemacht und die funktioniert an der Stelle.

Könnt Ihr euch das erklären?

MfG
Dengue

  1. echo $begrüßung;

    Könnt Ihr euch das erklären?

    Nein, derzeit nicht, aber dein Codeausschnitt lässt sämtliche Fehlerbehandlung vermissen. Du untersuchst den Rückgabewert von mysql_query() nicht auf Fehlerstatus und unterlässt daraufhin eine Abfrage mit des Meldungstextes mit mysql_error().

    echo "$verabschiedung $name";

    1. Du untersuchst den Rückgabewert von mysql_query() nicht auf Fehlerstatus und unterlässt daraufhin eine Abfrage mit des Meldungstextes mit mysql_error().

      ich habe mysql_error() abgefragt, aber da das nix gebracht hat, habe ich es hier nicht mit dazu geschrieben.

      1. echo $begrüßung;

        » Du untersuchst den Rückgabewert von mysql_query() nicht auf Fehlerstatus und unterlässt daraufhin eine Abfrage mit des Meldungstextes mit mysql_error().
        ich habe mysql_error() abgefragt, aber da das nix gebracht hat, habe ich es hier nicht mit dazu geschrieben.

        Und was ist das Rückgabeergebnis deines mysql_query()-Aufrufs? Bitte mit var_dump() anzeigen lassen. Erst wenn feststeht, dass ein Fehler auftrat, lohnt es sich, dessen Text mit mysql_error() nachzufragen.

        Es kann gut sein, dass kein Fehler auftritt. Die Query ist hinreichend trivial und sieht in deinem Beispiel syntaktisch fehlerfrei aus. Vielleicht passen nur deine Bedingungen nicht. Hast du die Ausgabe von $sql per Copy'n'Paste im beispielsweise phpMyAdmin abgekippt oder sie dort zu Fuß neu geschrieben?

        echo "$verabschiedung $name";

        1. Hast du die Ausgabe von $sql per Copy'n'Paste im beispielsweise phpMyAdmin abgekippt oder sie dort zu Fuß neu geschrieben?

          Ich habe die Ausgabe von $sql per Copy'n'Paste ausgeführt. Und da es da überhaupt keine Fehler gab, und mysql_error() auch keine Fehler geliefert hat, gehe ich davon aus, dass die Syntax iO ist.

          1. echo $begrüßung;

            Ich habe die Ausgabe von $sql per Copy'n'Paste ausgeführt. Und da es da überhaupt keine Fehler gab, und mysql_error() auch keine Fehler geliefert hat, gehe ich davon aus, dass die Syntax iO ist.

            mysql_error() sollte ist nicht das Abfragekriterium sein sondern der Rückgabewert der mysql_*-Funktionen, bei denen potentiell Fehler auftreten können. mysql_error() abzufragen ist erst ein Folgeschritt, aber das schrieb ich ja schon. Mehr kann ich derzeit nicht tun, dein Fehler liegt anscheinend an anderer Stelle und offenbart sich mir nicht aus deiner Beschreibung.

            echo "$verabschiedung $name";

            1. Der Rückgabewert von mysql_query() ist in meinem Fall der Query selber. Wenn ich ihn dann per Copy & Paste direkt auf die DB anwende, funzt er. Die gewünschten Werte ändern sich.

              1. echo $begrüßung;

                Der Rückgabewert von mysql_query() ist in meinem Fall der Query selber. Wenn ich ihn dann per Copy & Paste direkt auf die DB anwende, funzt er. Die gewünschten Werte ändern sich.

                Das kann nicht ein. Du verwechselst das gerade mit der Ausgabe von echo $sql. mysql_query() liefert im Falle von UPDATE ein boolsches true oder false zurück.

                var_dump(mysql_query($sql));

                Im Ganzen sieht ein "ordentlicher" mysql_query()-Aufruf so aus:

                $result = mysql_query($sql);
                  if ($result) {
                    // Code im Gut-Fall
                  } else {
                    // Code im Fehlerfall.
                    // mysql_error() liefert den Text zum Fehler
                  }

                wobei man die ersten beiden Zeilen auch zusammenfassen kann

                if ($result = mysql_query($sql)) {

                echo "$verabschiedung $name";

                1. Ja, mir ist das auch aufgefallen, dass ich mich mit dem Rückgabewert vertan habe.
                  Ich habe mal direkt nach dem mysql_query() folgende Funktion angewendet:
                  echo "affected_rows ".mysql_affected_rows();

                  Ich bekomme 0 ausgegeben. Also wurden demnach 0 Datensätze bearbeitet, sodass man eigentlich davon ausgehen müsste, dass die Where-Klausel nicht passt. Aber ich habe ja schon geschrieben, dass der Inhalt aus $sql, eingefügt per Copy & Paste, funzt und die Aktion ausgeführt wird.
                  Irgendwie glaube ich jetzt an einen Bug in PHP.

                  1. Korrektur: affected_rows gibt mir eine 1 zurück. Trotzdem, dass er anzeigt, dass ein Datensatz bearbeitet wurde, wurde er aber nicht bearbeitet.

                    1. echo $begrüßung;

                      Korrektur: affected_rows gibt mir eine 1 zurück. Trotzdem, dass er anzeigt, dass ein Datensatz bearbeitet wurde, wurde er aber nicht bearbeitet.

                      Vielleicht nimmst du im Script eine andere Datenbank als beim händischen Ausführen.

                      echo "$verabschiedung $name";

                      1. Vielleicht nimmst du im Script eine andere Datenbank als beim händischen Ausführen.

                        Nein, weil alle anderen UPDATES, INSERTS und DELETES kurz vor und nach dieser mysteriösen Anweisung funzen und ich herausgefunden habe, dass von 4 verschiedenen IDs, die ich in der WHERE-Klausel getestet habe, nur bei einer dieses Problem auftritt. Diese ID existiert aber und wenn ich die SQL-Abfrage händisch ausführe funzt sie auch. Ich glaube jetzt wirklich an einen Bug.

                        1. Es ist doch nicht von der ID abhängig. Komisch, weil es kurzzeitig ging.

                          1. echo $begrüßung;

                            Es ist doch nicht von der ID abhängig. Komisch, weil es kurzzeitig ging.

                            Du kannst versuchen, komplett von vorn anzufangen und dabei nur das eine Problem nachzustellen versuchen, mit so wenig Code wie möglich, um die Sache so unkomplex wie möglich zu halten. Neue Tabelle, ein, zwei Beispieldatensätze zum Testen, und mit PHP das UPDATE absenden. Wenn dabei der Fehler auch auftritt, stell alles zum Nachvollziehen online, also PHP-Code und den Dump der Test-Tabelle. Tritt das Problem nicht auf, vergleiche den Testaufbau und das Original haargenau. Lass dir auch bei Strings die Länge ausgeben (var_dump()), nicht dass irgendwelche unsichtbaren Zeichen drin sind.

                            echo "$verabschiedung $name";

                            1. Ich glaube, dass ich endlich die Lösung gefunden habe: der UPDATE-Query wird zwar ausgeführt, aber an einer anderen Stelle scheint der alte Wert wieder reingeschrieben zu werden. Getestet habe ich das, indem ich nach dem UPDATE gleich ein SELECT auf den zu ändernden Datensatz angewendet habe.
                              Ich werde dann am Montag mal schauen, wo der Fehler liegt (wahrscheinlich ca. 50 Zeilen später).

                              Trotzdem danke für deine Bemühungen.

                              MfG
                              Dengue