MySQL e PHP: inserisci NULL anziché una stringa vuota


88

Ho un'istruzione MySQL che inserisce alcune variabili nel database. Recentemente ho aggiunto 2 campi che sono opzionali ($ intLat, $ intLng). In questo momento, se questi valori non vengono inseriti, passo una stringa vuota come valore. Come faccio a passare un valore NULL esplicito a MySQL (se vuoto)?

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

Risposte:


143

Per passare un NULL a MySQL, fai proprio questo.

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

Quindi, nel tuo codice, controlla if $intLat, $intLngsono empty, se lo sono, usa NULLinvece di '$intLat'o '$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
Questo non aggiunge un valore NULL mysql. Questo imposta l'attributo sulla stringa "NULL" che è diversa dal valore mysql NULL. Sto solo dicendo che hai scritto due cose diverse, la prima è corretta, la seconda non così tanto credo.
G4bri3l

23
@ G4bri3l: nella $querystringa $intLate $intLngnon sono quotati. Quindi, quando le variabili vengono interpolate, lo sarà , NULL, NULL);.
Rocket Hazmat

2
Oh sì, ora lo vedo. Bello! Grazie per aver
dedicato

@ G4bri3l: Nessun problema. Sono qui per aiutarti :)
Rocket Hazmat

3
@alessadro: questa domanda è molto vecchia. Se stai concatenando variabili in una query SQL come quella, lo stai facendo in modo sbagliato! Passa a utilizzare le dichiarazioni preparate in PDO o MySQLi.
Rocket Hazmat

17

Se non passi i valori, otterrai valori nulli per i valori predefiniti.

Ma puoi semplicemente passare la parola NULL senza virgolette.


8
Otterrà NULL solo per impostazione predefinita, se la tabella è impostata in questo modo.
Rocket Hazmat

2
Per me questo è ciò che significa "opzionale".
dkretz


13

Tutto quello che devi fare è: $variable =NULL;// e passarlo nella query di inserimento. Questo memorizzerà il valore come NULL in mysql db


Non c'è bisogno di virgolette attorno al "NULL".
Louis

4

Normalmente, aggiungi valori regolari a mySQL, da PHP in questo modo:

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
}

Quando i tuoi valori sono vuoti / nulli ($ val1 == "" o $ val1 == NULL) e desideri che NULL venga aggiunto a SQL e non 0 o una stringa vuota, a quanto segue:

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
}

Notare che null deve essere aggiunto come "NULL" e non come "'NULL'". I valori non nulli devono essere aggiunti come "'". $ Val1. "'", Ecc.

Spero che questo aiuti, ho dovuto usarlo per alcuni data logger hardware, alcuni dei quali raccolgono temperatura e radiazioni, altri solo radiazioni. Per quelli senza il sensore di temperatura avevo bisogno di NULL e non 0, per ovvi motivi (0 è anche un valore di temperatura accettato).


Per gli interi definiti dalla colonna, l'altra soluzione funziona bene, ma per i campi di testo, ho dovuto suddividere la query come sopra in una concatenazione di stringhe, come ha fatto radhoo sopra. $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian

2

la tua query può andare come segue:

$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 e $ intLng sono quelli opzionali.
Rocket Hazmat

Questo non funzionerà. Ci sono parecchie cose sbagliate in questo frammento di codice (a parte l'uso di variabili sbagliate, come ha sottolineato Rocket). A causa della precedenza dell'operatore ternario, avrai bisogno delle parentesi attorno all'espressione. Ma soprattutto, stai ancora racchiudendo il valore della colonna tra virgolette singole, quindi sei tornato al punto di partenza, assegnando una stringa, non un database NULL. Inoltre, stai usando la NULLparola chiave PHP (non quotata), che restituisce una stringa vuota in un contesto di stringa, quindi di nuovo, stai assegnando una stringa vuota .
MrWhite

1

Controllare le variabili prima di costruire la query, se sono vuote, modificarle nella stringa NULL


1

puoi farlo ad esempio con

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

1

Per qualche motivo, la soluzione di Radhoo non funzionerebbe per me. Quando ho usato la seguente espressione:

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

"null" (con virgolette) è stato inserito invece di null senza virgolette, rendendolo una stringa anziché un numero intero. Quindi ho finalmente provato:

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

Lo spazio ha comportato l'inserimento nella query del valore nullo corretto (non quotato).

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.