PHP / MySQL的/ PDO结合空参数不起作用(PHP/MySQL/PDO binding n

2019-07-17 16:37发布

我无法在下面的代码绑定一个空参数

$nullVariable = NULL;
$sql = new PDO('mysql:host=' . $Server, $User, $Password);
$sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
$statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid");
$statement->bindParam(":uuid", $nullVariable, PDO::PARAM_NULL);
$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);

结果变量将是一个空数组。 如果我不使用的参数和修改我的查询“WHERE Binary16Column IS NULL”返回行的预期数量。 所以这个问题必须与我是如何处理的参数,而不是我的SQL查询。

我的代码比上面列出的更复杂,我需要能够使用它可以为null参数变量,所以检查看变量为空并运行不同的查询是不太理想。 从技术上讲,我有我自己的设定参数的功能,这就是我检查,如果变量的内容为空,并适当结合的参数,所以我没有编写查询不必要数量。 查询作品也如果变量包含有效的数据工作正常,并且参数类型是PARAM_LOB。

有谁知道我做错了吗? 非常感谢!

Answer 1:

阅读上三值逻辑 。 NULL不是一个值; 它是不存在的值的标记,所以NULL永远不能等于任何东西,包括本身。

然而,有一个空安全的比较操作也被称为“飞船运营商”,这确实考虑两个空值是等价的。

WHERE Binary16Column <=> :uuid

......应该做你所期望的。



Answer 2:

如果你想选择与记录Binary16Column为空,则需要使用IS NULL作为条件,但不是= NULL

SELECT * FROM Table WHERE Binary16Column IS NULL

你需要做的:

$uuid = /**some value**/;

$sql = new PDO('mysql:host=' . $Server, $User, $Password);
$sql->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

if ($uuid === null) {
  $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column IS NULL");
} else {
  $statement = $sql->prepare("SELECT * FROM Table WHERE Binary16Column = :uuid");
  $statement->bindParam(":uuid", $uuid);
}

$statement->execute();
$results = $statement->fetchAll(PDO::FETCH_ASSOC);


Answer 3:

我想你没有得到一个结果,因为NULL是一个关键字的原因。 因为MySQL的方式将NULL值,我想你将不得不做的是NULL,当你执行NULL值的搜索。 我做了一些测试在我的本地数据库,在那里我有NULL值。 只知道它工作的时间是我使用IS NULL或IS NOT NULL时。

我很抱歉,我不能更多的帮助(或者,如果我只是告诉你你已经知道),但好像你将不得不编写单独的查询,或者一些简单的逻辑来连接相应的WHERE逻辑根据一个变量是否为空或不是。



文章来源: PHP/MySQL/PDO binding null parameter doesn't work