PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : NULL-Werte in DB eintragen


AlexD
21.08.2009, 13:54:24
Hallo zusammen,

ich hab hier im Forum schon gesucht und auch ein paar Beiträge zu dem Thema gefunden.

Lieder sind es immer varchar()-Spalten in der Datenbank, ich hab int() Spalten.
Bei mir geht es um folgendes.

In einem Formular können ein paar Felder leer sein, in der DB soll dann NULL eingetragen werden.

Datenbank bzw. Spalten so aufgebaut
hoehenmeter smallint(4) standart: NULL (NULL -> ja)

Möchte ich nun die Daten aus dem Formular in die Datenbank schreiben in dem ein int()-Feld leer geblieben ist, so kommt eine SQL-Fehlermeldung:

Notice: Incorrect integer value: '' for column 'hoehenmeter' at row 1

Auch das brachte immer diese Fehlermeldung:

if(is_null($_POST['hoehenmeter'])){
$_POST['hoehenmeter'] = NULL;
}

oder

if(empty($_POST['hoehenmeter'])){
$_POST['hoehenmeter'] = NULL;
}


Oder ist es nicht möglich bei Spalten die als int definiert wurden NULL eintragen zu lassen?!

DokuLeseHemmung
21.08.2009, 14:05:07
Soweit ich weiß, schon...!
Aber meinst du wirklich, dass es sinnvol ist das fehlerhafte INSERT Kommando geheim zu halten?


Notice: Incorrect integer value: '' for column 'hoehenmeter' at row 1
Ein leerer Sting ist kein gültiger Integer Wert.
Ein leerer Sting ist kein NULL im SQL Sinne.
Warum machst du nicht das, was du tun willst?

AlexD
21.08.2009, 14:22:11
Hi,

nein geheim möchte ich das INSERT-Kommando nicht halten... dazu gibts keinen Grund. ;)

Das ein leerer String kein int-Wert ist, ist mir klar. Darum versuchte ich es auch mit $var = NULL.


hier das gesamte Query:

if(is_null($_POST['hoehenmeter'])){
$_POST['hoehenmeter'] = NULL;
}
if(empty($_POST['max_hf'])){
$_POST['max_hf'] = NULL;
}
if(empty($_POST['min_hf'])){
$_POST['min_hf'] = NULL;
}
if(empty($_POST['durchschn_hf'])){
$_POST['durchschn_hf'] = NULL;
}
$result = mysql_query("INSERT INTO laufen_meintraining (user_id, strecken_id, individual_eintrag, individual_strecke, individual_distanz, individual_runde, runden, type_id, datum, laufzeit, details, startuhrzeit,hoehenmeter, wetter, temp, luft, wind, max_hf, min_hf, durch_hf, kcal, bemerkung)
VALUES ('".$_SESSION['user_id']."',
'".$_POST['strecken_id']."',
'".$individual_eintrag."',
'".$_POST['strecken_bezeichnung']."',
'".$distanz."',
'".$runde."',
'".$_POST['runden']."',
'".$_POST['type_id']."',
'".$_POST['jahr']."-".$_POST['monat']."-".$_POST['tag']."',
'".$_POST['std'].":".$_POST['min'].":".$_POST['sec']."',
'".$_POST['details']."',
'".$_POST['start_std'].":".$_POST['start_min']."',
'".$_POST['hoehenmeter']."',
'".$_POST['wetter']."',
'".$_POST['temperatur']."',
'".$_POST['luft']."',
'".$_POST['wind']."',
'".$_POST['max_hf']."',
'".$_POST['min_hf']."',
'".$_POST['durchschn_hf']."',
'".$_POST['kcal']."',
'".$_POST['bemerkung']."' )",$db) or trigger_error(mysql_error($db));
if(!$result){ logfile('sql',error_get_last());}

mysql_close($db);

vt1816
21.08.2009, 14:35:37
Du solltest halt kein STRING in ein INT-Feld pressen - lass die ' um $_POST['hoehenmeter'] weg (und auch bei weiteren INT-Feldern).

DokuLeseHemmung
21.08.2009, 14:50:02
Ein PHP NULL ist ganz was anderes als ein SQL NULL.
Einzig die Grundidee des "nichtvorhandenen Wertes" ist vergleichbar.

Da ein SQL Statement immer ein String ist, das PHP NULL allerdings nicht, ist es dir nicht möglich ein PHP NULL in ein SQL Statement einzubauen.

vt1816
21.08.2009, 15:32:55
Dein SQL-Statment müsste/könnte da zum Beispiel so aussehen:$sql = "INSERT INTO `test` (`F1`, `F2`, `F3`) VALUES (1, NULL, 'text')";

AlexD
21.08.2009, 15:57:26
So Problem nun gelöst, dank Eurer Hilfe.

@DokuLeseHemmung
Jep, da musse ich mir wirklich wieder im klaren werden um welche Daten es sich handelt und hab auch nochmal im der Refernez kurz nachgelesen.

@vt1810
beim Schreiben fliegen die '' leider schon automatisch rein, auch wenns sich um ein int() handelt.
Da sollte ich doch sorgfältiger sein.

Aber in Summe haben mir beide Antworten letztlich geholfen.

Zum einen definiere ich die $var jetzt nicht als NULL, sondern als String mit "NULL" und übergeb dies dann an das int()-Feld, ohne die ''.

hier für 'hoehenmeter' wie es nun funktioniert.

if(empty($_POST['hoehenmeter'])){
$_POST['hoehenmeter'] = "NULL";
}

$result = mysql_query("INSERT INTO hoehenmeter
VALUES ( ".$_POST['hoehenmeter']." )",$db) or trigger_error(mysql_error($db));
if(!$result){ logfile('sql',error_get_last());}



Vielen Dank für den Denkanstoß!!

xabbuh
22.08.2009, 01:11:18
Pack auf jeden Fall Benutzereingaben in SQL-Queries immer zwischen mysql_real_escape_string(), um SQL-Injections zu verhindern.