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);
user547794
quelle

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)";
Rakete Hazmat
quelle
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
18

Das funktioniert gut für mich:

INSERT INTO table VALUES ('', NULLIF('$date',''))

(erstes ''Inkrement-ID-Feld)

Jesenko Sokoljak
quelle
1
NULLIF akzeptiert 2 Parameter NULLIF(expr1, expr2). Siehe dev.mysql.com/doc/refman/5.7/en/…
Roy Hinkley
Ich denke, das ist besser, weil Sie in nur einer Zeile tun können
hiddeneyes02
Schön und einfach!
Hayden Thring
Nicht so einfach mit vorbereiteten Aussagen.
MrrMan
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.

dkretz
quelle
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

Shahid Sarwar
quelle
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).

Radhoo
quelle
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);
sikas
quelle
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

profitphp
quelle
1

Sie können es zum Beispiel mit tun

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'
bernte
quelle
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.

bobv
quelle