Я борюсь с некоторым кодом 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 столбца, которые могут быть или не быть нулевыми
Это один из примеров, когда использование подготовленных инструкций действительно избавляет вас от некоторых проблем.
В 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
и его готовые заявления . Вы спасете себе мир боли.
Я думаю, вам нужны цитаты вокруг вашего {$row['null_field']}
, поэтому '{$row['null_field']}'
Если у вас нет кавычек, вы иногда получите инструкцию insert, которая выглядит так: insert into table2 (f1, f2) values ('val1',)
которая является синтаксической ошибкой.
Если это числовое поле, вам нужно будет провести над ним некоторое тестирование, и если в null_field нет значения, явно установите его на null.
Для полей, где допустим 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).")");