использование нулей в подготовленном операторе mysqli

В подготовленном mysqli операторе NULL преобразуется в '' (в случае строки) или 0 (в случае целого). Я хотел бы сохранить его как истинный NULL. Есть ли способ сделать это?

Related of "использование нулей в подготовленном операторе mysqli"

Я знаю, что это старый поток, но можно привязать истинное значение 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; } ?>