MySQL и PHP - вставьте NULL, а не пустую строку


88

У меня есть инструкция MySQL, которая вставляет некоторые переменные в базу данных. Недавно я добавил 2 необязательных поля ($ intLat, $ intLng). Прямо сейчас, если эти значения не введены, я передаю в качестве значения пустую строку. Как передать в MySQL явное значение NULL (если оно пусто)?

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

Ответы:


143

Чтобы передать MySQL NULL, вы делаете именно это.

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
Это не добавляет значение mysql NULL. Это устанавливает атрибут в строку «NULL», которая отличается от значения NULL в mysql. Я просто говорю, что вы написали две разные вещи, первое - правильно, второе - не очень, я думаю.
G4bri3l

23
@ G4bri3l: в $queryстроке $intLatи $intLngне заключены в кавычки. Итак, когда переменные интерполированы, так и будет , NULL, NULL);.
Rocket Hazmat

2
О да, теперь я это вижу. Ницца! Спасибо, что
нашли

@ G4bri3l: Нет проблем. Я здесь, чтобы помочь :)
Rocket Hazmat

3
@alessadro: Это очень старый вопрос. Если вы объединяете переменные в такой SQL-запрос, значит, вы делаете это неправильно! Пожалуйста, переключитесь на использование подготовленных операторов в PDO или MySQLi.
Rocket Hazmat

17

Если вы не передадите значения, вы получите значения NULL по умолчанию.

Но вы можете просто передать слово NULL без кавычек.


8
По умолчанию он получит только NULL, если таблица настроена таким образом.
Rocket Hazmat 06

2
Для меня это то, что означает «необязательный».
dkretz 06

17

Для меня это отлично работает:

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

(первое ''увеличивает поле идентификатора)


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

Я думаю, это лучше, потому что вы можете сделать всего одну строчку
hiddeneyes02 02

Красиво и просто!
Hayden

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

13

Все, что вам нужно сделать, это: $variable =NULL;// и передать его в запросе вставки. Это сохранит значение как NULL в mysql db


Нет необходимости в кавычках вокруг "NULL".
Луи

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) и вы хотите, чтобы в SQL добавлялся NULL, а не 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. "'" И т. Д.

Надеюсь, это поможет, мне просто пришлось использовать это для некоторых аппаратных логгеров данных, некоторые из них собирают температуру и излучение, другие - только излучение. Для тех, у кого нет датчика температуры, мне нужен NULL, а не 0 по очевидным причинам (0 также является допустимым значением температуры).


Для целых чисел, определенных в столбцах, другое решение работает нормально, но для текстовых полей мне пришлось разбить запрос, как указано выше, на конкатенацию строк, как это сделал radhoo выше. $ query = "ВСТАВИТЬ В uradmonitor (db_value1, db_value2) VALUES (". "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 - необязательные.
Rocket Hazmat 06

Так не пойдет. В этом фрагменте кода есть несколько ошибок (помимо использования неправильных переменных, как указал Рокет). Из-за приоритета тернарного оператора вам понадобятся круглые скобки вокруг выражения. Но что очень важно, вы по-прежнему заключаете значение столбца в одинарные кавычки, поэтому вы возвращаетесь к исходной точке, присваивая строку, а не базу данных 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.