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 столбца, которые могут быть или не быть нулевыми
Ответы
Ответ 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).")");