Jo: MySql-Anfrage ergibt als Ergebnis bool false. Wo ist der Fehler?

Hallo! Das folgende funktioniert immerhin soweit, als dass es keinen Abbruch durch einen Fehler gibt. Erst $result = mysql_query($sql); ergibt als Wert bool false.
Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?

Grüße
Jo

$sql = "INSERT INTO ".$GLOBALS["mysql\_db"].".Artikel (Nr ,Titel ,Teaser ,Einleitung ,Haupttext ,ErstelltDatumUhrzeit ,FreiAbDatumUhrzeit)
VALUES ('1', $mP_titel , $mP_teaser , $mP_einleitung , $mP_haupttext , NOW( ) , NOW( ) );";

$link = mysql_connect($GLOBALS["mysqlhost"], $GLOBALS["mysqluser"], $GLOBALS["mysqlpasswort"])
      OR die(mysql_error());
  $db_selected = mysql_select_db($GLOBALS["mysql_db"], $link);
  if (!$db_selected) {
      die ('Kann '.$GLOBALS["mysql_db"].' nicht benutzen : ' . mysql_error());
  }
   $result = mysql_query($sql);
  var_dump ($result);  // Gibt bool false aus
  mysql_free_result($result);
  mysql_close($link);

  1. Hi,

    Das folgende funktioniert immerhin soweit, als dass es keinen Abbruch durch einen Fehler gibt. Erst $result = mysql_query($sql); ergibt als Wert bool false.
    Ist in den folgenden Zeilen ein Fehler?

    Ja - du fragst die Datenbank nach dem Fehler nicht mal mehr, was die Ursache war.
    Nutze auch an der Stelle mysql_error.

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
  2. Moin!

    Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?

    mysql_error() sagt dir, was die Datenbank an deinem Query nicht toll findet. Das solltest du immer aufrufen als minimale Fehlerbehandlung, wenn mysql_query false zurückgibt.

    Aber ich rate mal: Die Datenbank bemängelt, dass die Inhalte der ganzen $mp...-Variablen nicht in Anführungszeichen stehen, und ich bemängele, dass diese Variablen keinerlei Escaping unterzogen werden.

    mysql_real_escape_string() gehört auf jeden Inhalt angewendet, den du in den Query-String reinschreiben willst! Ansonsten machst du dich anfällig für SQL-Injection.

    - Sven Rautenberg

    1. Moin!

      Ist in den folgenden Zeilen ein Fehler? Oder wenn nicht, woran könnte es liegen?

      mysql_error() sagt dir, was die Datenbank an deinem Query nicht toll findet. Das solltest du immer aufrufen als minimale Fehlerbehandlung, wenn mysql_query false zurückgibt.

      Aber ich rate mal: Die Datenbank bemängelt, dass die Inhalte der ganzen $mp...-Variablen nicht in Anführungszeichen stehen, und ich bemängele, dass diese Variablen keinerlei Escaping unterzogen werden.

      mysql_real_escape_string() gehört auf jeden Inhalt angewendet, den du in den Query-String reinschreiben willst! Ansonsten machst du dich anfällig für SQL-Injection.

      • Sven Rautenberg

      mysql_error ergab tatsächlich den Fehler bei der ersten $mP_... Variablen
      var_dump ergabe: string(42) "Unknown column 'testtitel' in 'field list'"
      Wenn ich die $mP_...Vars durch Strings ersetze, also z.B. gleich $mP_titel durch 'testtitel' klappt alles.
      Welche Anführungszeichen muss ich denn jetzt hier verwenden?
      Die Vorlage für das INSERT habe ich aus phpMyAdmin, und dann angepaßt, nur bei den Anführungszeichen ist es mir jetzt nicht klar, welche ich da noch verwenden soll?

      Als Escape verwende ich:
         $mP_titel = htmlentities(nl2br($GLOBALS["mP_titel"]),ENT_QUOTES);
         usw....
      Geht das auch? Oder erfaßt das nicht alle gefährlichen Zeichen?

      Danke für alle Antworten schon mal!

      Grüße
      Jo

      1. Moin!

        mysql_error ergab tatsächlich den Fehler bei der ersten $mP_... Variablen
        var_dump ergabe: string(42) "Unknown column 'testtitel' in 'field list'"
        Wenn ich die $mP_...Vars durch Strings ersetze, also z.B. gleich $mP_titel durch 'testtitel' klappt alles.
        Welche Anführungszeichen muss ich denn jetzt hier verwenden?

        Genau die, die du erwähnt hast. Lass dir den erzeugten SQL-String mal ausgeben, dann siehst du, was bei der Datenbank ankommt, und siehst auch den Unterschied zu der Variante mit festen Strings.

        Die Vorlage für das INSERT habe ich aus phpMyAdmin, und dann angepaßt, nur bei den Anführungszeichen ist es mir jetzt nicht klar, welche ich da noch verwenden soll?

        Als Escape verwende ich:
           $mP_titel = htmlentities(nl2br($GLOBALS["mP_titel"]),ENT_QUOTES);
           usw....
        Geht das auch? Oder erfaßt das nicht alle gefährlichen Zeichen?

        Nein, das geht nicht.

        htmlentities() ist sowieso überflüssig, htmlspecialchars() reicht vollkommen aus, denn egal welche Zeichencodierung du verwendest: Du kriegst sowieso nur solche Zeichen zurück, die in dieser Codierung enthalten sind, so dass du dafür keine besonderen Entities benötigst für Zeichen, die in der Codierung nicht darstellbar wären.

        Allerdings: htmlspecialchars() wird angewendet, wenn man aus der Datenbank etwas ausgelesen hat und es jetzt in HTML ausgeben will - also so, dass die Zeichen nicht als HTML wirksam werden, sondern exakt so angezeigt werden, wie sie im Text enthalten sind.

        Deshalb ist deine Platzierung von nl2br() auch falsch. Die gehört NACH htmlspecialchars() angewendet. Aber ebenfalls erst bei der Ausgabe der Daten.

        Das korrekte Escaping für das Schreiben in die Datenbank erledigt mysql_real_escape_string(), wie schon erwähnt.

        - Sven Rautenberg

        1. Welche Anführungszeichen muss ich denn jetzt hier verwenden?

          Genau die, die du erwähnt hast. Lass dir den erzeugten SQL-String mal ausgeben, dann siehst du, was bei der Datenbank ankommt, und siehst auch den Unterschied zu der Variante mit festen Strings.

          OK. Das klappt jetzt. Die Einträge landen jetzt in der Datenbank.

          Wie ist das mit den verschiedenen Anführungszeichen: " ' ´ Kann man die alle miteinander verschachteln? Ich kann mich nicht erinnern, ob phpmyadmin vor ein paar Jahren, als ich es das letzt mal verwendet habe, die SQL-Strings auch mit geschrieben hat.

          htmlentities() htmlspecialchars() ...

          Da muss ich nochmal nachlesen, was was ist.

          Das korrekte Escaping für das Schreiben in die Datenbank erledigt mysql_real_escape_string(), wie schon erwähnt.

          Das muß ich zwar auch nochmal nachlesen, aber ich verstehe das jetzt so:
          mysql_real_escape_string() muss man nur beim Schreiben in die Datenbank verwenden. Beim Lesen kommt dann wieder der originale String als Ergebnis?

          Vielen Dank schon mal für die Hilfe beim Fehlerfinden! (Auch an Chris B!)

          Grüße
          Jo

    2. P.S. Sind die von phpMyAdmin angezeigten Anführungszeichen >`< gleichwertig mit >'<? Kann ich die verschachteln? (Habe es versucht, aber das hat nicht geklappt. Aber womöglich hatte ich die >'< beim Verschachteln irgendwie falsch gesetzt.

      P.P.S. Hier muß es einen Fehler in der Forumssoftware geben.
      "Der Text enthält drei oder mehr gleiche Zeichen hintereinander oder enthält keine Satzzeichen (-2.00 Punkte). Sind Sie sicher, dass Sie das Posting so abschicken wollen?

      Der Text enthält weniger als oder genau zwei Zeilenumbrüche (-3.00 Punkte). Sind Sie sicher, dass Sie das Posting so abschicken wollen?"
      Das stimmt ja garnicht! :P

      1. Hi,

        P.S. Sind die von phpMyAdmin angezeigten Anführungszeichen >`< gleichwertig mit >'<? Kann ich die verschachteln?

        http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
        http://dev.mysql.com/doc/refman/5.1/en/identifiers.html

        MfG ChrisB

        --
        Light travels faster than sound - that's why most people appear bright until you hear them speak.
  3. Die eigentliche Frage ist gelöst.
    Es fehlten die einfachen Anführungszeichen um die $mp_... Variablen.
    Es funktioniert jetzt also mit:

    $sql = "INSERT INTO ".$GLOBALS["mysql\_db"].".Artikel (Nr ,Titel ,Teaser ,Einleitung ,Haupttext ,ErstelltDatumUhrzeit ,FreiAbDatumUhrzeit)
    VALUES ('1', '$mP_titel' , '$mP_teaser' , '$mP_einleitung' , '$mP_haupttext' , NOW( ) , NOW( ) );";

    Allgemein zu den Anführungszeichen:

    http://dev.mysql.com/doc/refman/5.1/en/string-syntax.html
    http://dev.mysql.com/doc/refman/5.1/en/identifiers.html

    Danke nochmal
    und gute Nacht für heute!
    Jo