Подтвердить что ты не робот

PHP/MySQL Вставить нулевые значения

Я борюсь с некоторым кодом PHP/MySQL. Я читаю из 1 таблицы, меняя некоторые поля, а затем записывая в другую таблицу, ничего не происходит, если вставка и одно из значений массива имеет значение null, когда я хотел бы, чтобы он вставлял нуль в базу данных (для поля допустимы пустые значения). Это выглядит примерно так:

$results = mysql_query("select * from mytable");
while ($row = mysql_fetch_assoc($results) {
    mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', {$row['null_field']});
}

Не каждая строка имеет нулевое значение, и в моем запросе есть больше полей и 2 столбца, которые могут быть или не быть нулевыми

4b9b3361

Ответ 1

Это один из примеров, когда использование подготовленных операторов действительно избавляет вас от некоторых проблем.

В MySQL, чтобы вставить нулевое значение, вы должны указать его в момент времени INSERT или оставить поле, которое требует дополнительного разветвления:

INSERT INTO table2 (f1, f2)
  VALUES ('String Value', NULL);

Однако, если вы хотите вставить значение в это поле, вы должны теперь развернуть свой код, чтобы добавить одинарные кавычки:

INSERT INTO table2 (f1, f2)
  VALUES ('String Value', 'String Value');

Подготовленные утверждения автоматически сделают это для вас. Они знают разницу между string(0) "" и null и правильно записывают ваш запрос:

$stmt = $mysqli->prepare("INSERT INTO table2 (f1, f2) VALUES (?, ?)");
$stmt->bind_param('ss', $field1, $field2);

$field1 = "String Value";
$field2 = null;

$stmt->execute();

Он избегает ваших полей для вас, гарантирует, что вы не забудете связать параметр. Нет причин оставаться с расширением mysql. Используйте mysqli и вместо этого подготовленные заявления. Вы сбережете себе мир боли.

Ответ 2

Мне кажется, вам нужны цитаты вокруг вашего {$row['null_field']}, поэтому '{$row['null_field']}'

Если у вас нет кавычек, вы в конечном итоге получите инструкцию insert, которая выглядит так: insert into table2 (f1, f2) values ('val1',), которая является синтаксической ошибкой.

Если это числовое поле, вам нужно будет выполнить над ним некоторое тестирование, и если в null_field нет значения, явно установите его на null..

Ответ 3

Для полей, где NULL допустимо, вы можете использовать var_export($var, true) для вывода литерала string, integer или NULL. Обратите внимание, что вы не будете окружать вывод кавычками, потому что они будут автоматически добавлены или опущены.

Например:

mysql_query("insert into table2 (f1, f2) values ('{$row['string_field']}', ".var_export($row['null_field'], true).")");