MySQL und PHP - fügen Sie NULL anstelle einer leeren Zeichenfolge ein


85

Ich habe eine MySQL-Anweisung, die einige Variablen in die Datenbank einfügt. Ich habe kürzlich 2 Felder hinzugefügt, die optional sind ($ intLat, $ intLng). Im Moment, wenn diese Werte nicht eingegeben werden, gebe ich eine leere Zeichenfolge als Wert weiter. Wie übergebe ich einen expliziten NULL-Wert an MySQL (falls leer)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);

Antworten:


141

Um NULL an MySQL zu übergeben, tun Sie genau das.

INSERT INTO table (field,field2) VALUES (NULL,3)

Also, in Ihrem Code überprüfen if $intLat, $intLngsind empty, wenn sie sind, verwendet NULLanstelle von '$intLat'oder '$intLng'.

$intLat = !empty($intLat) ? "'$intLat'" : "NULL";
$intLng = !empty($intLng) ? "'$intLng'" : "NULL";

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  $intLat, $intLng)";

9
Dies fügt keinen MySQL-NULL-Wert hinzu. Dadurch wird das Attribut auf die Zeichenfolge "NULL" gesetzt, die sich vom mysql NULL-Wert unterscheidet. Ich sage nur, dass Sie zwei verschiedene Dinge geschrieben haben, das erste ist richtig, das zweite nicht so sehr, denke ich.
G4bri3l

22
@ G4bri3l: In der $queryZeichenfolge $intLatund $intLngwerden nicht in Anführungszeichen gesetzt. Wenn die Variablen interpoliert werden, ist dies der Fall , NULL, NULL);.
Rocket Hazmat

2
Oh ja, das sehe ich jetzt. Nett! Vielen Dank, dass Sie sich die Zeit genommen haben, mich darauf hinzuweisen;)
G4bri3l

@ G4bri3l: Kein Prob. Ich bin hier um zu helfen :)
Rocket Hazmat

2
@alessadro: Diese Frage ist sehr alt. Wenn Sie Variablen zu einer solchen SQL-Abfrage verketten, machen Sie es falsch! Bitte wechseln Sie zur Verwendung vorbereiteter Anweisungen in PDO oder MySQLi.
Rocket Hazmat


17

Wenn Sie keine Werte übergeben, erhalten Sie Nullen für die Standardeinstellungen.

Sie können das Wort NULL jedoch einfach ohne Anführungszeichen übergeben.


8
Er erhält standardmäßig nur NULL, wenn die Tabelle auf diese Weise eingerichtet ist.
Rocket Hazmat

2
Für mich bedeutet das "optional".
Dkretz

13

Alles, was Sie tun müssen, ist: $variable =NULL;// und übergeben Sie es in der Einfüge-Abfrage. Dadurch wird der Wert in mysql db als NULL gespeichert


Keine Anführungszeichen um "NULL".
Louis

4

Normalerweise fügen Sie mySQL reguläre Werte von PHP wie folgt hinzu:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES ('$val1', '$val2')";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Wenn Ihre Werte leer / null sind ($ val1 == "" oder $ val1 == NULL) und Sie möchten, dass NULL zu SQL hinzugefügt wird und nicht 0 oder eine leere Zeichenfolge, wie folgt:

function addValues($val1, $val2) {
    db_open(); // just some code ot open the DB 
    $query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
        (($val1=='')?"NULL":("'".$val1."'")) . ", ".
        (($val2=='')?"NULL":("'".$val2."'")) . 
        ")";
    $result = mysql_query($query);
    db_close(); // just some code to close the DB
}

Beachten Sie, dass null als "NULL" und nicht als "'NULL'" hinzugefügt werden muss. Die Nicht-Null-Werte müssen als "'". $ Val1. "'" Usw. hinzugefügt werden.

Ich hoffe, das hilft, ich musste dies nur für einige Hardware-Datenlogger verwenden, von denen einige Temperatur und Strahlung erfassen, andere nur Strahlung. Für diejenigen ohne Temperatursensor brauchte ich aus offensichtlichen Gründen NULL und nicht 0 (0 ist auch ein akzeptierter Temperaturwert).


Für spaltendefinierte Ganzzahlen funktioniert die andere Lösung einwandfrei, aber für Textfelder musste ich die Abfrage wie oben beschrieben in eine Zeichenfolgenverkettung aufteilen, wie dies oben bei radhoo der Fall war. $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian

2

Ihre Anfrage kann wie folgt lauten:

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
      VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$lng', '" . ($lat == '')?NULL:$lat . "', '" . ($long == '')?NULL:$long . "')";
mysql_query($query);

2
$ intLat und $ intLng sind die optionalen.
Rocket Hazmat

Dies wird nicht funktionieren. Mit diesem Code-Snippet sind einige Dinge falsch (abgesehen von der Verwendung der falschen Variablen, wie Rocket hervorhob). Aufgrund der Priorität des ternären Operators benötigen Sie Klammern um den Ausdruck. Entscheidend ist jedoch, dass Sie den Spaltenwert immer noch in einfache Anführungszeichen setzen, sodass Sie wieder zum ersten Platz zurückkehren und eine Zeichenfolge und keine Datenbank zuweisen NULL. Außerdem verwenden Sie das NULLSchlüsselwort PHPs (nicht in Anführungszeichen ), das als leere Zeichenfolge in einem Zeichenfolgenkontext ausgewertet wird. Daher weisen Sie erneut eine leere Zeichenfolge zu .
MrWhite

1

Überprüfen Sie die Variablen, bevor Sie die Abfrage erstellen. Wenn sie leer sind, ändern Sie sie in die Zeichenfolge NULL


1

Sie können es zum Beispiel mit tun

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'

1

Aus irgendeinem Grund würde die Lösung von radhoo für mich nicht funktionieren. Als ich den folgenden Ausdruck verwendet habe:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')?"NULL":("'".$val1."'")) . ", ".
    (($val2=='')?"NULL":("'".$val2."'")) . 
    ")";

'null' (mit Anführungszeichen) wurde anstelle von null ohne Anführungszeichen eingefügt, wodurch eine Zeichenfolge anstelle einer Ganzzahl erstellt wurde. Also habe ich endlich versucht:

$query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (".
    (($val1=='')? :("'".$val1."'")) . ", ".
    (($val2=='')? :("'".$val2."'")) . 
    ")";

Das Leerzeichen führte dazu, dass die richtige Null (ohne Anführungszeichen) in die Abfrage eingefügt wurde.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.