在 mysqli 准备好的语句中使用 null
-
21-08-2019 - |
题
在 mysqli 准备好的语句中,NULL 被转换为 '' (对于字符串)或 0 (对于整数)。我想将它存储为真正的 NULL。有什么办法可以做到这一点吗?
解决方案
我知道这是一个旧线程,但可以将 true NULL 值绑定到准备好的语句(读 这).
事实上,您可以使用 mysqli_bind_parameter 将 NULL 值传递给数据库。只需创建一个变量并将 NULL 值(请参阅其联机帮助页)存储到该变量并绑定它。无论如何,对我来说效果很好。
因此它必须是这样的:
<?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
声明绑定NULL的问题,解决的办法是这样的:
有是一个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
不是评论容易成为可能。
请参阅@ creatio的回答是: https://stackoverflow.com/a/6892491/18771
在评论中提供的解决方案做准备的语句一些前期准备工作,取代与"?"
的"NULL"
标志物具有PHP null
值每PARAM。然后将修改后的查询串被使用。
下面的函数是从用户评论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;
}
(它不是真正的编码风格,我会在做,但如果它的工作原理...)的
在我身边,我每参数存储在数组中,并通过array_shift($ myArray的)传递它们在Bind_param功能。 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;
}
?>
不隶属于 StackOverflow