MySQL та PHP - вставляйте NULL, а не порожній рядок


85

У мене є оператор MySQL, який вставляє деякі змінні в базу даних. Нещодавно я додав 2 поля, які є необов’язковими ($ intLat, $ intLng). Зараз, якщо ці значення не введені, я передаю порожній рядок як значення. Як передати явне значення NULL в MySQL (якщо порожнє)?

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

Відповіді:


141

Щоб передати NULL в MySQL, ви робите саме це.

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

Таким чином, у вашому коді, перевірити if $intLat, $intLngце empty, якщо вони є, використовувати NULLзамість '$intLat'або '$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
Це не додає значення NULL mysql. Це встановлює атрибут для рядка "NULL", який відрізняється від значення NULL mysql. Я просто кажу, що ви написали дві різні речі, перша - це правильно, друга - не так вже й багато.
G4bri3l

22
@ G4bri3l: У $queryрядку $intLatі $intLngне цитуються. Отже, коли змінні інтерпольовані, це буде , NULL, NULL);.
Racket Hazmat

2
О так, я бачу це зараз. Приємно! Дякую, що
знайшли

@ G4bri3l: немає проблеми. Я тут, щоб допомогти :)
Rocket Hazmat

2
@alessadro: Це питання дуже давнє. Якщо ви об'єднуєте змінні в такий запит SQL, то ви робите це неправильно! Будь ласка, перейдіть на використання підготовлених тверджень у PDO або MySQLi.
Racket Hazmat,

17

Якщо ви не передасте значення, ви отримаєте нульові значення за замовчуванням.

Але ви можете просто передати слово NULL без лапок.


8
Він отримає значення NULL за замовчуванням, лише якщо таблиця встановлена ​​таким чином.
Racket Hazmat

2
Для мене це означає "необов’язковий".
dkretz

17

Для мене це чудово працює:

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

( ''поле ідентифікатора першого кроку)


1
NULLIF приймає 2 параметри NULLIF(expr1, expr2). Див. Dev.mysql.com/doc/refman/5.7/en/…
Рой Хінклі

Я думаю, що це краще, тому що ви можете робити лише один рядок
hiddeneyes02,

Приємно і просто!
Hayden Thring,

Не все так просто з підготовленими висловлюваннями.
MrrMan

13

Все, що вам потрібно зробити, це: $variable =NULL;// і передати його в запит на вставку. Це збереже значення як NULL у mysql db


Не потрібно лапок навколо "НУЛЯ".
Луї

4

Зазвичай ви додаєте регулярні значення в mySQL, з PHP, як це:

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
}

Коли ваші значення порожні / нульові ($ val1 == "" або $ val1 == NULL), і ви хочете, щоб NULL було додано до SQL, а не 0 або порожній рядок, до наступного:

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
}

Зверніть увагу, що null потрібно додавати як "NULL", а не як "'NULL'". Ненульові значення потрібно додати як "'". $ Val1. "'" Тощо.

Сподіваюся, це допомагає, мені просто довелося використовувати це для деяких апаратних реєстраторів даних, деякі з них збирають температуру та випромінювання, інші лише випромінювання. Для тих, хто не має температурного датчика, мені було потрібно НУЛЬ, а не 0, зі зрозумілих причин (0 також є прийнятим значенням температури).


Для цілих чисел, визначених стовпцями, інше рішення працює нормально, але для текстових полів мені довелося розбити запит, як зазначено вище, на об’єднання рядків, як це робив Radhoo вище. $ query = "ВСТАВИТИ У uradmonitor (db_value1, db_value2) ЦІННОСТІ (". "NULL". ",". $ val2. ")";
Брайан

2

ваш запит може бути таким:

$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 та $ intLng є необов’язковими.
Racket Hazmat

Це не спрацює. У цьому фрагменті коду є чимало помилок (крім використання неправильних змінних, як зазначив Рокет). Через перевагу тернарного оператора вам знадобляться дужки навколо виразу. Але найважливіше, що ви все ще оточуєте значення стовпця одинарними лапками, тому ви повертаєтеся до квадрата, призначаючи рядок, а не базу даних NULL. Крім того, ви використовуєте NULLключове слово PHP (без котирувань), яке обчислює порожній рядок у контексті рядка, тому знову призначаєте порожній рядок .
MrWhite

1

Перевірте змінні перед побудовою запиту, якщо вони порожні, змініть їх на рядок NULL


1

це можна зробити, наприклад, за допомогою

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

1

З якоїсь причини рішення radhoo для мене не спрацювало. Коли я використав такий вираз:

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

'null' (із лапками) було вставлено замість null без лапок, роблячи це рядком замість цілого числа. Тож я нарешті спробував:

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

В результаті порожнього результату в запит було вставлено правильний нуль (без котирувань).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.