QueenBitch: SQL Abfrage: wo liegt mein Fehler

Anscheinend habe ich einen Fehler in meinem UPDATE Query (denn es passiert absolut nichts), aber wo?

$aendern = "UPDATE spr_inhalt SET in_zeile1 WHERE in_zeile1 ==".$row->in_zeile1;
$query2 = $conn->query ($aendern);

Thnx Shadowcrow

--
Lächle, Du kannst sie nicht alle töten....

akzeptierte Antworten

  1. Servus QueenBitch

    Anscheinend habe ich einen Fehler in meinem UPDATE Query (denn es passiert absolut nichts), aber wo?

    Es gibt z.B. in mysql die Methode mysql_error(), wenn ich mich recht erinnere, von der man Fehlermeldungen der Datenbank bekommt, die man sich anzeigen lassen könnte. Wenn du die Möglichkeit dazu hast und folgende Tipps nicht helfen, versuche die Fehlermeldungen der Datenbank zu bekommen und zu lesen.

    $aendern = "UPDATE spr_inhalt SET in_zeile1 WHERE in_zeile1 ==".$row->in_zeile1;
    $query2 = $conn->query ($aendern);
    

    In deinem SQL würde ich spontan auf die doppelten Gleichheitszeichen tippen. In SQL kenne ich Vergleiche mit nur einem =. Wenn außerdem in $row->in_zeile1 ein String stehen sollte, fehlen die umschließenden Anführungszeichen.

    ciao

    --
    "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
    1. Hallo henman,

      Anscheinend habe ich einen Fehler in meinem UPDATE Query (denn es passiert absolut nichts), aber wo?

      Es gibt z.B. in mysql die Methode mysql_error(), wenn ich mich recht erinnere, von der man Fehlermeldungen der Datenbank bekommt, die man sich anzeigen lassen könnte. Wenn du die Möglichkeit dazu hast und folgende Tipps nicht helfen, versuche die Fehlermeldungen der Datenbank zu bekommen und zu lesen.

      Die MySQL-Extension ist seit Ewigkeiten deprecated, und ausserdem verwendet der OP ja eh schon PDO. Hier die Verwendung der MySQL-Extension zu empfehlen halte ich für problematisch.

      LG,
      CK

      1. Servus Christian

        Die MySQL-Extension ist seit Ewigkeiten deprecated, und ausserdem verwendet der OP ja eh schon PDO. Hier die Verwendung der MySQL-Extension zu empfehlen halte ich für problematisch.

        Ich sollte mich mal wieder mit PHP beschäftigen, danke für den Hinweis.

        ciao

        --
        "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
      2. Tach!

        ausserdem verwendet der OP ja eh schon PDO.

        Das lässt sich aus dem gezeigten Code nicht erkennen. Auch die mysqli-Extension verwendet dieselbe Syntax für mysqli::query(). Und es kann sich auch um eine Eigen- oder Fremdkreation einer OOP-orientierten Datenbank-Abstraktion handeln. Man müsste schon die Instantiierung der Objekte sehen, um genaueres sagen zu können.

        dedlfix.

    2. Tach!

      Anscheinend habe ich einen Fehler in meinem UPDATE Query (denn es passiert absolut nichts), aber wo?

      Es gibt z.B. in mysql die Methode mysql_error(), wenn ich mich recht erinnere, von der man Fehlermeldungen der Datenbank bekommt, die man sich anzeigen lassen könnte. Wenn du die Möglichkeit dazu hast und folgende Tipps nicht helfen, versuche die Fehlermeldungen der Datenbank zu bekommen und zu lesen.

      Im Prinzip ist das beste Art und Weise, sich dem Fehler zu nähern. Die verwendete Funktion muss nur zum verwendeten System passen, wie schon von CK festgestellt.

      $aendern = "UPDATE spr_inhalt SET in_zeile1 WHERE in_zeile1 ==".$row->in_zeile1;
      $query2 = $conn->query ($aendern);
      

      In deinem SQL würde ich spontan auf die doppelten Gleichheitszeichen tippen. In SQL kenne ich Vergleiche mit nur einem =.

      Zum einen das, zum anderen muss man, wenn man einen Wert setzen möchte, auch was angeben, was man denn zu setzen beabsichtigt.

      Wenn außerdem in $row->in_zeile1 ein String stehen sollte, fehlen die umschließenden Anführungszeichen.

      Nicht nur die, denn es können in den Strings seinerseits Anführungszeichen stecken und dann gibts einen weiteren Syntaxfehler oder gar schlimmeres. Dazu kann man die zum System passende Maskierfunktion verwenden. Besser ist aber, Prepared Statements zu verwenden, wenn diese zur Verfügung stehen. Dann gehen Statement und Werte getrennte Wege und man muss sich nicht um eine korrekte Einbettung kümmern.

      dedlfix.

      1. In deinem SQL würde ich spontan auf die doppelten Gleichheitszeichen tippen. In SQL kenne ich Vergleiche mit nur einem =.

        Zum einen das, zum anderen muss man, wenn man einen Wert setzen möchte, auch was angeben, was man denn zu setzen beabsichtigt.

        Wollte nur wissen ob ihr auch aufpasst... hüstel

        Wenn außerdem in $row->in_zeile1 ein String stehen sollte, fehlen die umschließenden Anführungszeichen.

        Nicht nur die, denn es können in den Strings seinerseits Anführungszeichen stecken und dann gibts einen weiteren Syntaxfehler oder gar schlimmeres. Dazu kann man die zum System passende Maskierfunktion verwenden. Besser ist aber, Prepared Statements zu verwenden, wenn diese zur Verfügung stehen. Dann gehen Statement und Werte getrennte Wege und man muss sich nicht um eine korrekte Einbettung kümmern.

        Jaaa, jetzt so noch der korrektur kleinerer Fehler ändert er die meisten Einträge:

        $aendern = "UPDATE spr_inhalt SET in_zeile1='$newstr' WHERE in_zeile1 = '$row->in_zeile1'";
        if (!$conn->query($aendern)) {
        	printf("Errormessage: %s\n", $conn->error);
        			}
        

        Bei einigen Einträgen motzt er noch - liegt wohl an den ' im String, auf zum maskieren...

        Danke

        Shadowcrow

        --
        Lächle, Du kannst sie nicht alle töten....
    3. Es gibt z.B. in mysql die Methode mysql_error(), wenn ich mich recht erinnere, von der man Fehlermeldungen der Datenbank bekommt, die man sich anzeigen lassen könnte. Wenn du die Möglichkeit dazu hast und folgende Tipps nicht helfen, versuche die Fehlermeldungen der Datenbank zu bekommen und zu lesen.

      Jo, über mysqli::$error werden schon Fehlermeldungen angezeigt (danke für die Erinnerung), hilfreich ist das aber nicht unbedingt:

      ⇒Errormessage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''spr_inhalt' SET 'in_zeile1=Wir kennen die Geschwindigkeit des Lichts. Aber' at line 1

      In deinem SQL würde ich spontan auf die doppelten Gleichheitszeichen tippen. In SQL kenne ich Vergleiche mit nur einem =. Wenn außerdem in $row->in_zeile1 ein String stehen sollte, fehlen die umschließenden Anführungszeichen.

      Uuups, äh war´s aber wohl nicht.

      --
      Lächle, Du kannst sie nicht alle töten....
      1. Servus QueenBitch

        ⇒Errormessage: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''spr_inhalt' SET 'in_zeile1=Wir kennen die Geschwindigkeit des Lichts. Aber' at line 1

        In deinem SQL würde ich spontan auf die doppelten Gleichheitszeichen tippen. In SQL kenne ich Vergleiche mit nur einem =. Wenn außerdem in $row->in_zeile1 ein String stehen sollte, fehlen die umschließenden Anführungszeichen.

        Uuups, äh war´s aber wohl nicht.

        Doch. Es fehlen Anführungszeichen, wie man in der Fehlermeldung erkennt. (Klar, das steht da nicht wortwörtlich drin, aber es kommt der Hinweis, dass die Syntax falsch ist und man sieht den Query.)

        Und dass die Gleichheitszeichen nicht bemängelt wurden, mag daran liegen, dass der Syntax-Fehler wegen der fehlenden Anführungszeichen die restliche Analyse des Queries unterbrochen hat.

        Noch ein Hinweis: SQL-Queries werden gerne einzeilig geschrieben. Damit aber die SQL-Fehlermeldung noch hilfreicher wird, kann man (zumindest beim Debugging) mehrere Zeilen benutzen. Dann steht am Ende nicht immer "at line 1", sondern die betreffende Zeile.

        Beispiel

        // statt einer Zeile...
        $query = 'SELECT foo,bar FROM table where answer=42';
        
        // mehrere nutzen
        $query = 'SELECT 
            foo,
            bar
            FROM 
            table 
            WHERE 
            answer=42';
        

        Das wird dann auch einen Deut lesbarer, finde ich.

        ciao

        --
        "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
        1. Hallo henman,

          Noch ein Hinweis: SQL-Queries werden gerne einzeilig geschrieben.

          Ja, eine echte Unmode! SQL ist auch Code, und der sollte umgebrochen und formatiert werden wie jeder andere Code.

          LG,
          CK

        2. Uuups, äh war´s aber wohl nicht.

          Doch. Es fehlen Anführungszeichen, wie man in der Fehlermeldung erkennt. (Klar, das steht da nicht wortwörtlich drin, aber es kommt der Hinweis, dass die Syntax falsch ist und man sieht den Query.)

          Und dass die Gleichheitszeichen nicht bemängelt wurden, mag daran liegen, dass der Syntax-Fehler wegen der fehlenden Anführungszeichen die restliche Analyse des Queries unterbrochen hat.

          Das fiel mir 3 Sekunden nach absenden des Posts auf...

          Noch ein Hinweis: SQL-Queries werden gerne einzeilig geschrieben. Damit aber die SQL-Fehlermeldung noch hilfreicher wird, kann man (zumindest beim Debugging) mehrere Zeilen benutzen. Dann steht am Ende nicht immer "at line 1", sondern die betreffende Zeile.

          Das wird dann auch einen Deut lesbarer, finde ich.

          Clever, ja das ist besser....

          Thanx Shadowcrow

          --
          Lächle, Du kannst sie nicht alle töten....
  2. Hallo QueenBitch,

    Anscheinend habe ich einen Fehler in meinem UPDATE Query (denn es passiert absolut nichts), aber wo?

    $aendern = "UPDATE spr_inhalt SET in_zeile1 WHERE in_zeile1 ==".$row->in_zeile1;
    $query2 = $conn->query ($aendern);
    

    Der Gleichheitsoperator in SQL ist =. Stell das so um:

    $query = $conn->prepare("UPDATE spr_inhalt SET in_zeile1 WHERE in_zeile1 = ?");
    $result = $query->execute(array($row->in_zeile1));
    

    Ausserdem kann ich dir nur empfehlen, während der Entwicklung den error mode auf Exceptions zu stellen:

    $conn->setAttribute("PDO::ATTR_ERRMODE", PDO::ERRMODE_EXCEPTION);
    

    Damit bekommst du eine Exception um die Ohren geschmissen, wenn du etwas falsch machst, in der der SQL-Fehler drin steht.

    LG,
    CK