MySQL Frage: MySQL Daten hinzufügen

Hallo!

Ich probiere seit über einer halben Stunde, einfach nur Daten in einer MySQL-DB einzutragen... Es gibt keinen Fehler, aber die Daten werden einfach nicht eingetragen. Weiß jemand, woran das liegt?

PHP-Datei:

  
include("../db.inc.php");  
$name = strip_tags($_POST['name']);  
$subject = strip_tags($_POST['subject']);  
$msg = strip_tags($_POST['msg']);  
$eintragen = mysql_query("INSERT INTO msgs (to, from, subject, msg) VALUES (1, 2, '$subject', '$msg')");  

Datenbank:
MySQL Datenbank

Danke für jede Hilfe.

  1. Tach!

    $eintragen = mysql_query("INSERT INTO msgs (to, from, subject, msg) VALUES (1, 2, '$subject', '$msg')");

    Betreibe Debugging! Was steht in $eintragen? Frag das zunächst mit var_dump() ab. Beachte außerdem den Kontextwechsel - strip_tags() ist nicht ausreichend.

    dedlfix.

    1. Okay.

      Habe nun den MySQL-Code etwas abgespeckt:

        
      INSERT INTO msgs (subject, msg) VALUES ('$subject', '$msg');  
      
      

      Jetzt funktioniert's. Sobald ich aber ein neues Attribut füllen will, macht er wieder gar nichts.

      var_dump() von meiner ersten Variante gibt:
      string(79) "INSERT INTO msgs (to, from, subject, msg) VALUES (1,2,'sadsa', 'daddsadaddsad')"

      1. Tach!

        Sobald ich aber ein neues Attribut füllen will, macht er wieder gar nichts.

        Dazu komen wir noch, zunächst solltest du lernen, Fehler zu erkennen und die Fehlermeldungen dazu abzufragen. "Er" macht nämlich nicht nichts, sondern teilt dir etwas mir, was du aber nicht beachtest - nämlich das Ergebnis von mysql_query().

        var_dump() von meiner ersten Variante gibt:
        string(79) "INSERT INTO msgs (to, from, subject, msg) VALUES (1,2,'sadsa', 'daddsadaddsad')"

        Nein, das kann nicht sein. Das ist das zusammengesetzte Statement, aber nicht das Ergebnis von mysql_query(), das du laut deinem geposteten Code in $eintragen abgelegt hast.

        dedlfix.

        1. Argh. Du hattest Recht.
          Bei ~~~php

          $eintragen = mysql_query("INSERT INTO msgs (to,subject, msg) VALUES (500,'$subject', '$msg')");
          var_dump($eintragen);

            
          erhalte ich: bool(false)  
            
          Bei  
          ~~~php
          $eintragen = mysql_query("INSERT INTO msgs (subject, msg) VALUES ('$subject', '$msg')");  
          var_dump($eintragen);
          

          erhalte ich: bool(true)

          Warum?!

          1. Tach!

            Bei ~~~php

            $eintragen = mysql_query("INSERT INTO msgs (to,subject, msg) VALUES (500,'$subject', '$msg')");

            var_dump($eintragen);

            
            > erhalte ich: bool(false)  
            >   
            > Bei  
            > ~~~php
            
            $eintragen = mysql_query("INSERT INTO msgs (subject, msg) VALUES ('$subject', '$msg')");  
            
            > var_dump($eintragen);
            
            

            erhalte ich: bool(true)
            Warum?!

            Diese Frage beantwortet dir das PHP-Handbuch. Es weiß zu jeder Funktion nicht nur, welche Parameter sie haben möchte sondern auch, was für ein Ergebnis sie zurückliefert. false ist ein üblicher Wert, wenn ein Fehler auftrat. Die mysql_*()-Funktionen geben nur dann eine PHP-Fehlermeldung aus, wenn es sich um einen PHP-Fehler handelt (beispielsweise bei einem falschen Parameter). MySQL-Fehler sind hingegen stumm. Ihr Wortlaut muss - wenn man ein Fehler-false bekommen hat - mit mysql_error() abgefragt werden. Wie lautet also die Meldung?

            dedlfix.

            1. bool(false) 1064: 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 'to,subject, msg) VALUES (500,'wqe', 'wqe')' at line 1

              Bekomme ich für mysql_error. Warum weiß ich aber nicht... Kannst Du mir sagen, woran das liegt?

              1. Tach!

                bool(false) 1064: 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 'to,subject, msg) VALUES (500,'wqe', 'wqe')' at line 1

                Das heißt, MySQL mag an der Stelle kein "to". Ein "from" übrigens auch nicht. "select" oder "insert" als Spaltenname ließen sich ebenfalls schlecht von den den gleichnamigen Schlüsselwörtern unterscheiden. Solange ein Spaltenname nicht auch mit einem syntaktischen Element verwechselt werden kann, ist alles in Ordnung. Um eine Verwechslung auch für Schlüsselwörter auszuschließen, kann man den Spaltennamen in Backticks einfassen. Alternativ kann man einen Namen wählen, der nicht verwechselbar ist.

                Auf Fehler zu reagieren, ist nicht nur wichtig, um solche im Prinzip vermeidbaren Syntaxfehler zu finden. Datenbanksysteme sind auch mal aus anderen Gründen vorübergehend oder dauerhaft nicht erreichbar. Der Ausfall kann auch erst nach einem erfolgreichen Connect auftreten. Robuste Programme fragen deswegen immer die Rückgabewerte ab und reagieren angemessen darauf. Was angemessen ist, muss im Einzelfall bestimmt werden. Und das nicht nur aus Programmierersicht, sondern auch am besten auch aus Anwender- und aus Administratorsicht. Das oftmals zu sehende "or die()" ist selten eine angemessene Reaktion.

                dedlfix.