在mysqli预处理语句中,NULL变为''(在字符串的情况下)或0(在整数的情况下).我想将它存储为真正的NULL.有没有办法做到这一点?
我知道这是一个旧线程,但是可以将一个真正的NULL值绑定到预准备语句(阅读本文).
实际上,您可以使用mysqli_bind_parameter将NULL值传递给数据库.只需创建一个变量并将NULL值(请参阅它的联机帮助页)存储到变量并绑定它.无论如何,对我来说非常棒.
因此它必须是这样的:
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安全操作符:
<=>
例:
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
注释中提供的解决方案对准备好的语句进行了一些预备工作,用每个具有PHP 值的参数替换"?"
标记.然后使用修改的查询字符串."NULL"
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; }
(这不是我原本想要的编码风格,但是如果有效的话......)