使用PHP PDO预处理语句和MySQL选择字段为空的行

时间:2012-11-12 23:12:48

标签: php mysql pdo prepared-statement

我一直在转换应用程序以使用PDO准备语句而不是mysqli,我遇到了一个奇怪的问题。我在数据库中有一些记录,预计字段将为null。不是'null'(字符串),或''(空字符串),而是NULL。我动态地构建我的查询,所以在过去当我在对象中遇到一个null变量时,我会像这样构建查询:

WHERE fieldName is null;

当字段为空时,会得到预期的结果。

现在使用PDO,我的查询没有返回任何结果,我没有收到任何错误。它只是没有返回我期望的记录。当我回显构建的查询并直接在MySQL中运行它时,我得到了预期的结果,但是在应用程序中没有返回结果。

我尝试过的一些事情包括构建如下所示的查询:

WHERE fieldName is null;

WHERE fieldName <=> null;

我也尝试过标准的准备声明:

WHERE fieldName = :fieldName

然后绑定这些语句:

$stmt->bindParam(":$field", $value);
$stmt->bindParam(":$field", $value, PDO::PARAM_NULL);
$stmt->bindParam(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_NULL);
$stmt->bindValue(":$field", null, PDO::PARAM_INT);

对此的任何帮助将不胜感激。我的PHP版本是5.3.10,MySQL是5.5.22。作为一个附带问题,我仍然不清楚bindParam和bindValue之间的区别,所以如果在你的答案中包含它是有意义的,我会非常感谢对这个主题的一些澄清......

3 个答案:

答案 0 :(得分:3)

原来是对这个问题的一些回应的组合:How do I insert NULL values using PDO?(正如约翰指出的那样)

我需要将where子句更改为:

WHERE fieldName is :fieldName;

然后传递一个field =&gt;数组执行函数的值:

$binds = array();
foreach ($wheres as $where) {
    $field = $where['field'];
    $value = $where['value'];
    $binds[":$field"] = $value;
}
$stmt->execute($binds);

即使更改了我的where子句,查询也无法使用bindValue。有人知道为什么绑定不起作用,但另一种方法呢?

答案 1 :(得分:1)

不同的问题,但所有的灵感都在这里:How do I insert NULL values using PDO?

总结一下:

$stmt->bindValue(':param', null, PDO::PARAM_INT); 

应该工作。你也可以使用:

$stmt->execute( array(":param" => NULL));

对于bindparam,您必须在变量(不是常量)中赋值,bindvalue可以使用常量等。

答案 2 :(得分:-1)

在MySql中,您可以使用查询

select * from atable where isnull(column_name); 

检查空值。