PHP / MySQL Вставить нулевые значения - PullRequest
27 голосов
/ 16 марта 2011

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

$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 столбцов, которые могут быть или не быть нулевыми

Ответы [ 3 ]

57 голосов
/ 16 марта 2011

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

В 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 и вместо этого подготовленные операторы .Вы спасете себя от боли.

5 голосов
/ 16 марта 2011

Я думаю, вам нужны кавычки вокруг {$row['null_field']}, поэтому '{$row['null_field']}'

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

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

4 голосов
/ 14 марта 2014

Для полей, где 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).")");
...