使用具有NULL值的参数化查询

时间:2016-06-30 19:30:42

标签: php mysqli

所以我遇到了一个奇怪的问题......我们使用参数化查询来阻止我们的代码中的SQL注入,但是我遇到了一些这样的行为问题,而我发现了一个丑陋的方式,我的工作周围的那种打败了参数化的目的。

假设我正在进行此查询:

$db = new csmysqli('database',$host,$user,$pass);
$value = x;
$stmt = "INSERT INTO table SET value='%s'";
$result = $db->prepare($stmt, $value);
echo $result;

现在问题是......如果x是一个字符串,或者我们得到这个结果:

INSERT INTO table SET value='123';

没问题......但是,如果x为null:

INSERT INTO table SET value='NULL';< ---那里的单引号引起了一个问题....好的,所以我试着绕过它:

$value = "'x'"; // Notice the quotes now go around x
$stmt = "INSERT INTO table SET value=%s";
$result = $db->prepare($stmt, $value);
echo $result;

如果x是int或string,我们得到这个:

INSERT INTO table SET value=\'x\';

现在null工作了:

INSERT INTO table SET value=NULL;

所以问题是:

如何通过参数化正确填充普通数据和NULL数据?

编辑:

我应该提到我正在使用一个特殊的mysqli_helper脚本:

class csmysqli extends mysqli
{
    public function __construct($dbname = '', $host,$user,$pass)
    {
        parent::__construct($host, $user, $pass, $dbname);
    }

    public function query($query)
    {
        $numParams = func_num_args();
        $params = func_get_args();

        //merge in parameters only if needed
        if ($numParams > 1) {
            for ($i = 1; $i < $numParams; $i++) {
                $params[$i] = parent::real_escape_string($params[$i]);
            }

            $query = call_user_func_array('sprintf', $params);
        }

        return parent::query($query, MYSQLI_STORE_RESULT);
    }

    public function prepare($query)
    {
        $numParams = func_num_args();
        $params = func_get_args();

        //merge in parameters only if needed
        if ($numParams > 1) {
            for ($i = 1; $i < $numParams; $i++) {
                $params[$i] = parent::real_escape_string($params[$i]);
            }

            $query = call_user_func_array('sprintf', $params);
        }

        return $query;
    }
}

1 个答案:

答案 0 :(得分:0)

使用本机mysqli参数化,可以正常填充普通数据和NULL数据。

使用自制的参数化,您必须检查参数类型并采取相应措施。