PHP/MySQL/PDO绑定空参数不';行不通

PHP/MySQL/PDO绑定空参数不';行不通,php,mysql,parameters,pdo,null,Php,Mysql,Parameters,Pdo,Null,在以下代码中绑定null参数时遇到问题 $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->pre

在以下代码中绑定null参数时遇到问题

$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为NULL”,它将返回预期的行数。因此,问题一定是我如何处理参数,而不是我的SQL查询

我的代码比上面列出的更复杂,我需要能够使用可能为null的参数变量,因此检查变量是否为null并运行不同的查询并不理想。从技术上讲,我有自己的函数来设置参数,在这里我检查变量的内容是否为null,并适当地绑定参数,因此我不必编写不必要的查询。如果变量包含有效数据,并且参数类型为PARAM_LOB,则查询也可以正常工作


有人知道我做错了什么吗?非常感谢

如果要选择包含
Binary16Column
为null的记录,则需要使用
为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);

我认为你没有得到结果的原因是NULL是一个关键字。由于MySQL处理空值的方式,我认为当您执行空值搜索时,您必须执行的是NULL。我在本地数据库中做了一系列测试,其中有空值。它唯一有效的时间是在我使用is NULL或is NOT NULL时

很抱歉,我帮不了你什么忙(或者如果我只是告诉你你已经知道的),但是看起来你需要编写单独的查询,或者一些简单的逻辑来连接适当的WHERE逻辑,这取决于变量是否为null。

请继续阅读。NULL不是一个值;它是缺少值的标记,因此NULL永远不能等于任何东西,包括它本身

然而,有一个空安全比较运算符,也称为“飞船操作符”,它认为两个空值是等价的。p>

WHERE Binary16Column <=> :uuid
其中binary16列:uuid

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

看看@Michael,我也尝试过使用bindValue,但没有成功。不幸的是,我认为下面的xdazz和dasfisch是正确的。所以在我设置参数的函数中,我使用了preg_replace(“/=\s+”$parameter.“/”,“IS NULL”,$statement->queryString)如果变量的内容为null,则重写查询,这样我就不必在任何时候编写两倍的查询,我可能会检查某个值是否等于null。我希望PDO会重写我的查询,这样,如果我传递一个PARAM_null,就可以了。只是想知道,那么PARAM_NULL有什么意义呢?它只适用于插入/更新吗?@mattburnett PDO不会为您重写查询,您需要自行设置where条件,对于
PARAM_NULL
,并不总是必要的。如果您使用php的
null
,PDO将为您插入db的
null
。谢谢!这正是我所寻找的,并且是更好/更安全的解决方案,如果参数的变量为null,我就用正则表达式重写查询。只要它不能与自身相等,它就可以用PHP(我认为是javascript)实现$var=null;if($var===null)将起作用。一些编程语言可能会以不同的方式处理null/unde值,但在MySQL和关系数据库中,一般情况下,
null
按说明处理,需要特殊处理。