当前位置:  开发笔记 > 编程语言 > 正文

在mysqli预处理语句中使用null

如何解决《在mysqli预处理语句中使用null》经验,为你挑选了3个好方法。

在mysqli预处理语句中,NULL变为''(在字符串的情况下)或0(在整数的情况下).我想将它存储为真正的NULL.有没有办法做到这一点?



1> creatio..:

我知道这是一个旧线程,但是可以将一个真正的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值插入数据库.


很好,正是我需要知道的,只是让它更通用:`foreach($ param as $ k => $ v){if($ v =='')$ param [$ k] = NULL; 所以基本上任何空条目都会被转换为真正的NULL,但仔细使用嵌套数组,如果你使用那些就使它递归^^这应该是选择的答案,但是

2> random_user_..:

对于任何人来看这个,因为他们在WHERE语句中绑定NULL时遇到问题,解决方案是这样的:

有一个必须使用的mysql NULL安全操作符:

<=>

例:

prepare("SELECT id FROM product WHERE price <=> ?"); // Will select products where the price is null
$stmt->bind_param($price);
?>



3> Tomalak..:

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

(这不是我原本想要的编码风格,但是如果有效的话......)


FWIW,这打破了"WHERE column_name!=?" 因为与NULL的比较总是NULL.这也打破了"WHERE question ='et tu,brute?'"
推荐阅读
勤奋的瞌睡猪_715
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有