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

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)";

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.


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,


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


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).


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

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


1

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

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

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).

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.