использование нулей в подготовленном заявлении mysqli
-
21-08-2019 - |
Вопрос
В подготовленном mysqli операторе NULL преобразуется в " (в случае строки) или 0 (в случае целого числа).Я хотел бы сохранить его как true NULL .Есть ли какой-нибудь способ сделать это?
Решение
Я знаю, что это старый поток, но можно привязать истинное нулевое значение к подготовленным операторам (читать это).
Фактически, вы можете использовать mysqli_bind_parameter для передачи нулевого значения в базу данных.просто создайте переменную и сохраните нулевое значение (смотрите Его на странице руководства) в переменной и привяжите ее.В любом случае, у меня это отлично работает.
Таким образом, это должно быть что-то вроде:
<?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 в их WHERE
утверждение, решение заключается в следующем:
Существует mysql НУЛЕВОЙ безопасный оператор это должно быть использовано:
<=>
Пример:
<?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
это было нелегко осуществить.
Пожалуйста, ознакомьтесь с ответом @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;
}
(На самом деле это не тот стиль кодирования, в котором я бы это сделал, но если это сработает ...)
что касается меня, я сохраняю все параметры в массиве и передаю их в функцию 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;
}
?>