在 MySQLI 预准备语句中使用 null

using nulls in a mysqli prepared statement

提问人:ceejayoz 提问时间:12/16/2008 最后编辑:ceejayoz 更新时间:10/13/2021 访问量:34424

问:

在 mysqli 预准备语句中,NULL 将转换为 ''(如果是字符串)或 0(如果是整数)。我想将其存储为真正的 NULL。有什么办法可以做到这一点吗?

php mysql null mysqli 预备语句

评论

1赞 Bradmage 2/8/2016
我简直不敢相信我为此挣扎了多久,答案几乎是显而易见的。严格地说:你不能。结构上:bind_param。通过代码:+1 给每个人。(我会坚持下去,因为仍然没有注射问题。请随时纠正。$query_param_01 = (null===$param_01) ? "?" : "NULL";{$query_param_01}

答:

4赞 Tomalak 12/17/2008 #1

对 mysqli_stmt::bind_param 上 PHP 文档的评论表明,传入并不容易。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;
} 

(这并不是我本来会做的编码风格,但如果它有效......

评论

3赞 Bill Karwin 12/17/2008
FWIW,这在“WHERE column_name != ?”中断,因为与 NULL 的比较始终为 NULL。这也打破了“WHERE question = 'et tu, brute?'”
-2赞 Syndrael 8/6/2009 #2

我将所有参数存储在一个数组中,并使用 将它们传递给函数。NULL 是这样被接受的。bind_paramarray_shift($myArray)

46赞 creatio 8/1/2011 #3

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

评论

3赞 Fernando Silva 5/8/2014
很好,正是我需要知道的,只是让它更通用一点:,所以基本上任何 null 条目都会转换为真正的 NULL,但要小心嵌套数组,如果您使用那些,请使其递归^^ 不过这应该是选定的答案,谢谢foreach($param as $k => $v) { if($v == '') $param[$k] = NULL; }
46赞 random_user_name 4/27/2012 #4

对于任何因为在语句中绑定 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);
?>
-3赞 Robert 1/1/2015 #5
<?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;
}
?>