Yadgar: MySQL: Leerstrings werden nicht zu NULL

Hi(gh)!

Folgendes Problem: in der gegenwärtig von mir per Eingabeformular bearbeiteten MySQL-Datenbanktabelle ist in den meisten Feldern NULL als Defaultwert (falls nichts anderes eingegeben wird) vorgesehen. Merkwürdigerweise werden Leerstrings in $_POST nur bei Feldern vom Typ VARCHAR dort als NULL eingetragen, bei Feldern numerischer Typen dagegen als 0 bzw. 0.0 interpretiert (ich überprüfe meine Eingaben mit PHPMyAdmin).

Der relevante Code sieht so aus (exemplarisch für das Feld "Tiefe"):

      if ($_POST['Tiefe'] == "")  
        $Tiefe = NULL;  
      else  
        $Tiefe = $_POST['Tiefe'];  
  
[...]  
  
        $query = 'INSERT INTO orgeln (Hersteller, Marke, Modell, Typ, Markteinfuehrung, Ende_Produktion, Neupreis, Waehrung, Breite_cm, Hoehe_cm, Tiefe_cm, Gewicht_kg, Klappbar, Zerlegbar, Gehaeuseform, Registerspeicher, Einfingerakkorde, Rhythmische_Akkorde, Akkordspeicher, Automatikbass, Arpeggio, Zugriegel, Kniehebel, Portamentomanual, Anzahl_Schweller, Beleuchtung, Abdeckung, Gesamtleistung_Watt, Massenspeicher, Voll_erfasst) VALUES ("'.mysql_real_escape_string($herstellerID).'","'.mysql_real_escape_string($markenID).'","'.mysql_real_escape_string($_POST['Modell']).'", "'.mysql_real_escape_string($typID).'","'.mysql_real_escape_string($Markteinfuehrung).'", "'.mysql_real_escape_string($EndeProduktion).'","'.mysql_real_escape_string($Neupreis).'", "'.mysql_real_escape_string($Waehrung).'", "'.mysql_real_escape_string($Breite).'","'.mysql_real_escape_string($Hoehe).'", "'.mysql_real_escape_string($Tiefe).'","'.mysql_real_escape_string($Gewicht).'","'.mysql_real_escape_string($klappbar).'", "'.mysql_real_escape_string($zerlegbar).'","'.mysql_real_escape_string($gehaeuseformenID).'", "'.mysql_real_escape_string($Registerspeicher).'","'.mysql_real_escape_string($Einfingerakkorde).'", "'.mysql_real_escape_string($RhythmischeAkkorde).'","'.mysql_real_escape_string($Akkordspeicher).'", "'.mysql_real_escape_string($Automatikbass).'","'.mysql_real_escape_string($Arpeggio).'", "'.mysql_real_escape_string($Zugriegel).'","'.mysql_real_escape_string($Kniehebel).'", "'.mysql_real_escape_string($Portamentomanual).'","'.mysql_real_escape_string($Schweller).'", "'.mysql_real_escape_string($Beleuchtung).'","'.mysql_real_escape_string($Abdeckung).'", "'.mysql_real_escape_string($Gesamtleistung).'","'.mysql_real_escape_string($Massenspeicher).'", "'.mysql_real_escape_string($komplett).'")';  

Woran liegt das? Den in den Query-String eingefügten Variablen wurde laut var_dump() tatsächlich der Wert NULL zugewiesen... könnte es etwas mit real_escape_string() zu tun haben?

Bis bald im Khyberspace!

Yadgar

  1. Hakuna matata!

    Beim Zusammenbauen deiner Query schließt du jeden Wert in Stringbregrenzer ein, das ist ein Fehler. Der String 'NULL' hat in MySQL eine andere Bedeutung als NULL oder der leere String ''. Wenn du NULL als Wert einfügen willst, dann musst du beim Zusammenbauen der Query darauf achten, dass er keine Stringbegrenzer drumherum stehen:

    INSERT INTO tablename (col1, col2) VALUES ( 'foobar', NULL );
    anstatt:
    INSERT INTO tablename (col1, col2) VALUES ( 'foobar', 'NULL' );

    Mir ist jetzt schon häufiger aufgefallen, dass du Probeme mit dem richtigen Maskieren hast, das scheint eine Schwäche von dir zu sein. Eine moderne Datenbank-Schnittstelle (lies PDO), kann dir dieses umständliche Gefrickel ersparen. Vielleicht wird es doch mal Zeit für ein Upgrade?

    --
    “All right, then, I'll go to hell.” – Huck Finn
    1. Hallo

      Beim Zusammenbauen deiner Query schließt du jeden Wert in Stringbregrenzer ein, das ist ein Fehler. Der String 'NULL' hat in MySQL eine andere Bedeutung als NULL oder der leere String ''. Wenn du NULL als Wert einfügen willst, dann musst du beim Zusammenbauen der Query darauf achten, dass er keine Stringbegrenzer drumherum stehen:

      INSERT INTO tablename (col1, col2) VALUES ( 'foobar', NULL );
      anstatt:
      INSERT INTO tablename (col1, col2) VALUES ( 'foobar', 'NULL' );

      Das Gleiche gilt auch für Zahlen. Auch die sind nicht in Stringbegrenzer einzuschließen. Zudem ist die Behandlung einer Zahl mit mysql_real_escape_string nicht zielführend, da sie eben kein String ist. Stattdessen passt z.B. für Ganzzahlen intval. Die Funktion macht stumpf alles zu einer Ganzzahl und wenn's vom Typ und Wert nicht passt, wird eine 0 draus (Was nicht passt, wird passend gemacht! Siehe auch die Beispiele in der verlinkten Handbuchseite).

      INSERT INTO tablename (col1, col2, col3) VALUES ( 'foobar', NULL, 4 );

      Tschö, Auge

      --
      Verschiedene Glocken läuteten in der Stadt, und jede von ihnen vertrat eine ganz persönliche Meinung darüber, wann es Mitternacht war.
      Terry Pratchett, "Wachen! Wachen!"
      ie:{ fl:| br:> va:) ls:[ fo:) rl:( ss:| de:> js:| zu:}
      Veranstaltungsdatenbank Vdb 0.3