В подготовленном mysqli операторе NULL преобразуется в '' (в случае строки) или 0 (в случае целого). Я хотел бы сохранить его как истинный NULL. Есть ли способ сделать это?
Я знаю, что это старый поток, но можно привязать истинное значение NULL к подготовленным операциям (прочитайте это ).
Фактически вы можете использовать mysqli_bind_parameter для передачи значения NULL в базу данных. просто создайте переменную и сохраните значение NULL (см. man-страницу для него) переменной и привяжите ее. Отлично работает для меня.
Таким образом, это должно быть что-то вроде:
<?php $mysqli = new mysqli('localhost', 'my_user', 'my_password', 'world'); // person is some object you have defined earlier $name = $person->name(); $age = $person->age(); $nickname = ($person->nickname() != '') ? $person->nickname() : NULL; // prepare the statement $stmt = $mysqli->prepare("INSERT INTO Name, Age, Nickname VALUES (?, ?, ?)"); $stmt->bind_param('sis', $name, $age, $nickname); ?>
Это должно вставить в базу данных значение NULL.
Для всех, кто смотрит на это, потому что у них возникают проблемы с привязкой NULL в их инструкции WHERE
, решение таково:
Существует безопасный оператор mysql NULL, который необходимо использовать:
<=>
Пример:
<?php $price = NULL; // NOTE: no quotes - using php NULL $stmt = $mysqli->prepare("SELECT id FROM product WHERE price <=> ?"); // Will select products where the price is null $stmt->bind_param($price); ?>
Комментарии к документации PHP по mysqli_stmt::bind_param
указывают на то, что передача в NULL
не mysqli_stmt::bind_param
возможна.
См. Ответ @ creatio: https://stackoverflow.com/a/6892491/18771
Решения, предлагаемые в комментариях, делают некоторые предварительные подготовительные работы по подготовленному заявлению, заменяя "?"
маркеры с "NULL"
для каждого параметра, который имеет значение PHP null
. Затем используется модифицированная строка запроса.
Следующая функция из комментария пользователя 80119 :
function preparse_prepared($sQuery, &$saParams) { $nPos = 0; $sRetval = $sQuery; foreach ($saParams as $x_Key => $Param) { //if we find no more ?'s we're done then if (($nPos = strpos($sQuery, '?', $nPos + 1)) === false) { break; } //this test must be done second, because we need to //increment offsets of $nPos for each ?. //we have no need to parse anything that isn't NULL. if (!is_null($Param)) { continue; } //null value, replace this ? with NULL. $sRetval = substr_replace($sRetval, 'NULL', $nPos, 1); //unset this element now unset($saParams[$x_Key]); } return $sRetval; }
неfunction preparse_prepared($sQuery, &$saParams) { $nPos = 0; $sRetval = $sQuery; foreach ($saParams as $x_Key => $Param) { //if we find no more ?'s we're done then if (($nPos = strpos($sQuery, '?', $nPos + 1)) === false) { break; } //this test must be done second, because we need to //increment offsets of $nPos for each ?. //we have no need to parse anything that isn't NULL. if (!is_null($Param)) { continue; } //null value, replace this ? with NULL. $sRetval = substr_replace($sRetval, 'NULL', $nPos, 1); //unset this element now unset($saParams[$x_Key]); } return $sRetval; }
(На самом деле это не стиль кодирования, который я бы сделал, но если он работает …)
на моей стороне я храню все параметры в массиве и передаю их в функции Bind_param с помощью array_shift ($ myArray). NULL принимается так … S.
<?php $mysqli=new mysqli('localhost','root','','test'); $mysqli->query("CREATE TABLE test_NULL (id int(11))"); if($query=$mysqli->prepare("insert into test_NULL VALUES(?)")){ $query->bind_param('i',$null); //note that $null is undefined $query->execute(); }else{ echo __LINE__.' '.$mysqli->error; } ?>