26

在 mysqli 准备好的语句中,NULL 变成 ''(在字符串的情况下)或 0(在整数的情况下)。我想将其存储为真正的 NULL。有没有办法做到这一点?

4

5 回答 5

43

可以将一个真正的 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 值。

于 2011-07-31T21:39:26.993 回答
40

对于任何因为在他们的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);
?>
于 2012-04-26T20:15:40.640 回答
3

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;
} 

(这不是我真正会使用的编码风格,但如果它有效......)

于 2008-12-16T16:12:44.857 回答
-2

我将所有参数存储在一个数组中,并bind_param使用array_shift($myArray). NULL 就是这样被接受的。

于 2009-08-05T18:57:52.793 回答
-3
<?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;
}
?>
于 2014-12-31T21:27:49.127 回答