MySQL i PHP - wstaw NULL zamiast pustego ciągu

86

Mam instrukcję MySQL, która wstawia niektóre zmienne do bazy danych. Niedawno dodałem 2 pola, które są opcjonalne ($ intLat, $ intLng). W tej chwili, jeśli te wartości nie są wprowadzone, przekazuję jako wartość pusty ciąg. Jak przekazać jawną wartość NULL do MySQL (jeśli jest pusta)?

$query = "INSERT INTO data (notes, id, filesUploaded, lat, lng, intLat, intLng)
          VALUES ('$notes', '$id', TRIM('$imageUploaded'), '$lat', '$long', 
                  '$intLat', '$intLng')";
mysql_query($query);
user547794
źródło

Odpowiedzi:

142

Aby przekazać NULL do MySQL, musisz to zrobić.

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

Tak więc, w kodzie, sprawdź if $intLat, $intLngto empty, czy są, stosowanie NULLzamiast '$intLat'lub '$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)";
Rocket Hazmat
źródło
9
To nie dodaje wartości NULL mysql. Spowoduje to ustawienie atrybutu na ciąg „NULL”, który różni się od wartości NULL mysql. Mówię tylko, że napisałeś dwie różne rzeczy, pierwsza jest poprawna, druga nie tak bardzo myślę.
G4bri3l
22
@ G4bri3l: W ciągu $queryznaków $intLati $intLngnie są cytowane. Tak więc, gdy zmienne są interpolowane, będzie , NULL, NULL);.
Rocket Hazmat
2
O tak, teraz to rozumiem. Ładny! Dziękuję za
poświęcenie
@ G4bri3l: Nie ma problemu. Jestem tu, aby pomóc :)
Rocket Hazmat
2
@alessadro: To pytanie jest bardzo stare. Jeśli łączysz zmienne w takie zapytanie SQL, to robisz to źle! Przejdź do korzystania z przygotowanych wyciągów w PDO lub MySQLi.
Rocket Hazmat
17

Jeśli nie przekażesz wartości, otrzymasz wartości null dla wartości domyślnych.

Ale możesz podać słowo NULL bez cudzysłowów.

dkretz
źródło
8
Domyślnie otrzyma NULL tylko wtedy, gdy stół jest ustawiony w ten sposób.
Rocket Hazmat
2
Dla mnie to właśnie oznacza „opcjonalne”.
dkretz,
17

To działa dobrze dla mnie:

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

( ''pole id pierwszego przyrostu)

Jesenko Sokoljak
źródło
1
NULLIF przyjmuje 2 parametry NULLIF(expr1, expr2). Zobacz dev.mysql.com/doc/refman/5.7/en/…
Roy Hinkley,
Myślę, że to jest lepsze, ponieważ możesz to zrobić w jednej linii
hiddeneyes02
Ładnie i prosto!
Hayden Thring,
Nie jest to takie proste z przygotowanymi oświadczeniami.
MrrMan
13

Wszystko, co musisz zrobić, to: $variable =NULL;// i przekazać to w zapytaniu wstawiającym. Spowoduje to zapisanie wartości jako NULL w bazie danych mysql

Shahid Sarwar
źródło
Nie ma potrzeby umieszczania cudzysłowów wokół „NULL”.
Louis
4

Zwykle dodajesz zwykłe wartości do mySQL, z PHP w ten sposób:

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
}

Gdy twoje wartości są puste / null ($ val1 == "" lub $ val1 == NULL) i chcesz, aby NULL zostało dodane do SQL, a nie 0 lub pusty ciąg, do następującego:

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
}

Zauważ, że wartość null musi zostać dodana jako „NULL”, a nie jako „NULL” ”. Wartości inne niż null należy dodać jako „'". $ Wart1. "'" Itd.

Mam nadzieję, że to pomoże, po prostu musiałem użyć tego do niektórych rejestratorów danych sprzętowych, niektóre z nich zbierają temperaturę i promieniowanie, a inne tylko promieniowanie. Dla tych bez czujnika temperatury potrzebowałem NULL a nie 0, z oczywistych powodów (0 to również akceptowana wartość temperatury).

radhoo
źródło
W przypadku liczb całkowitych zdefiniowanych w kolumnie inne rozwiązanie działa dobrze, ale w przypadku pól tekstowych musiałem rozbić zapytanie, jak powyżej, na konkatenację ciągów, tak jak zrobił to radhoo powyżej. $ query = "INSERT INTO uradmonitor (db_value1, db_value2) VALUES (". "NULL". ",". $ val2. ")";
Brian,
2

Twoje zapytanie może wyglądać następująco:

$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
źródło
2
$ intLat i $ intLng są opcjonalnymi.
Rocket Hazmat
To nie zadziała. Jest kilka rzeczy nie tak z tym fragmentem kodu (poza używaniem niewłaściwych zmiennych, jak zauważył Rocket). Ze względu na pierwszeństwo operatora trójargumentowego będziesz potrzebować nawiasów wokół wyrażenia. Ale co najważniejsze, nadal otaczasz wartość kolumny w pojedynczych cudzysłowach, więc wracasz do punktu wyjścia, przypisując ciąg, a nie bazę danych NULL. Używasz również NULLsłowa kluczowego PHP (bez cudzysłowów), którego wynikiem jest pusty ciąg w kontekście łańcucha, więc ponownie przypisujesz pusty ciąg .
MrWhite
1

Sprawdź zmienne przed zbudowaniem zapytania, jeśli są puste, zmień je na ciąg NULL

profitphp
źródło
1

możesz to zrobić na przykład za pomocą

UPDATE `table` SET `date`='', `newdate`=NULL WHERE id='$id'
bernte
źródło
1

Z jakiegoś powodu rozwiązanie radhoo nie zadziałałoby dla mnie. Kiedy użyłem następującego wyrażenia:

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

Wstawiono „null” (z cudzysłowami) zamiast wartości null bez cudzysłowów, dzięki czemu jest to ciąg znaków zamiast liczby całkowitej. Więc w końcu spróbowałem:

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

Puste miejsce spowodowało wstawienie do zapytania poprawnej wartości null (bez cudzysłowu).

bobv
źródło