mattfi: MySQL, INSERT: Feldinhalt / Feldname vertauscht

An die nachfolgende Datei übergebe ich Formulardaten über die URL, und das funktioniert auch.
Code:

formular.php?term=Bobbycar&id_gebiet=5&def=Spielzeugauto&anm=Keine&quelle=Q&submit=Hinzuf%FCgen

Anschließende lese ich diese Daten per GET aus und stecke sie in Variable:

$term = $_GET['term'];
    $id_gebiet = $_GET['id_gebiet'];
    $def = $_GET['def'];
    $anm = $_GET['anm'];
    $quelle = $_GET['quelle'];

Es ist mir klar, dass ich auch mit den GET-Abfragevariablen direkt weiterarbeiten könnte, aber ich will erstmals keine Hochkommafehler riskieren.
Jetzt will ich diese plus zwei weitere Werte in die Datenbank schreiben:

$sql_write = "INSERT INTO DEF
                (ID_GEBIET, DEF, ANM, Q_DEF, Status, Autor)
              VALUES
                ($id_gebiet, $def, $anm, $quelle, '0', 'MattFi')";

mysql_db_query(MYSQL_DATABASE, $sql_write) or die(mysql_error());

Nun kriege ich die Fehlermeldung:
"Unknown column 'Spielzeugauto' in 'field list'".

Sehr witzig. Wieso vertauscht SQL den Feldnamen $def mit dem Feldinhalt Spielzeugauto ?

Ich bitte um Hilfe,
mattfi

  1. Hallo,

    Nun kriege ich die Fehlermeldung:
    "Unknown column 'Spielzeugauto' in 'field list'".

    Sehr witzig. Wieso vertauscht SQL den Feldnamen $def mit dem Feldinhalt Spielzeugauto ?

    weil Du diejenigen Variablen, für die das entsprechende Datenbankfeld als Text (Oder Varchar o.ä.) definiert ist, in Hochkommata setzen musst.

    $sql_write = "INSERT INTO DEF
                    (ID_GEBIET, DEF, ANM, Q_DEF, Status, Autor)
                  VALUES
                    ($id_gebiet, '$def', '$anm', '$quelle', '0', 'MattFi')";

    Ich nehme an, $id_gebiet ist numerisch, daher dort keine Hochkommata.

    Schöne Grüße
    Axel

    1. Danke, Axel.

      weil Du diejenigen Variablen, für die das entsprechende Datenbankfeld als Text (Oder Varchar o.ä.) definiert ist, in Hochkommata setzen musst.

      Allerdings verstehe ich nicht, warum dem so ist. SQL *soll* ja die Variablen parsen, und wenn es das tut, dann findet es natürlich den zugewiesenen Wert, aber eben als Wert, also als VALUE im SQL-Statement, und nicht als Spaltenüberschrift!?

      1. Hallo,

        Allerdings verstehe ich nicht, warum dem so ist. SQL *soll* ja die Variablen parsen, und wenn es das tut, dann findet es natürlich den zugewiesenen Wert, aber eben als Wert, also als VALUE im SQL-Statement, und nicht als Spaltenüberschrift!?

        Nun, das Problem ist, das NICHT SQL die Variablen parst, sondern PHP. Wenn Du diesen Ausdruck hast:
        $sql_write = "INSERT INTO DEF
                        (ID_GEBIET, DEF, ANM, Q_DEF, Status, Autor)
                      VALUES
                        ($id_gebiet, $def, $anm, $quelle, '0', 'MattFi')";
        und der Einfachheit nehmen wir an, alle 4 Variablen haben dn Inhalt "test", dann würde beim SQL-Server folgende Anfrage ankommen:

        INSERT INTO DEF (ID_GEBIET, DEF, ANM, Q_DEF, Status, Autor)
        VALUES (test, test, test, test, '0', 'MattFi')

        Da vermag er dann nicht mehr zu unterscheiden, ob eine Spalte oder ein Wert gemeint ist und geht vom ersten Fall aus. Das Verhalten ist ja in PHP ebenso. Wenn Du in PHP einen Ausdruck hat :

        $variable = test;

        geht PHP davon aus, das test eine Konstante ist und wirft einen Fehler. Er geht nicht automatisch davon aus, dass es sich hier um einen Wert handeln könnte.

        Schöne Grüße
        Axel

        1. Alles klar, danke!
          Einleuchtendes Beispiel...

  2. Hallo

    Es ist mir klar, dass ich auch mit den GET-Abfragevariablen direkt weiterarbeiten könnte, aber ich will erstmals keine Hochkommafehler riskieren.

    Du solltest unbedingt über den Einsatz von mysql_real_escape_string() nachdenken.

      
    
    > $sql_write = "INSERT INTO DEF  
    >                 (ID_GEBIET, DEF, ANM, Q_DEF, Status, Autor)  
    >               VALUES  
    >                 ($id_gebiet, $def, $anm, $quelle, '0', 'MattFi')";  
    
    

    Siehe dazu Sven Rautenbergs Ausführungen in der aktuellen Forumshauptdatei, bitte auch noch das Posting von dedlfix lesen. Und selbstverständlich gibts darüber viel im Archiv.

    Freundliche Grüße

    Vinzenz