使用 PHP PDO 准备好的语句和 MySQL 选择字段为空的行

问题描述 投票:0回答:4

我一直在将应用程序转换为使用 PDO 准备好的语句而不是 mysqli,但我遇到了一个奇怪的问题。我在数据库中有一些记录,预计其中一个字段将为空。不是“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之间的区别,所以如果在你的答案中包含它是有意义的,我真的很感激对这个主题的一些澄清......

php mysql pdo prepared-statement
4个回答
13
投票

自从写了这个问题后,mysql引入了一个spaceship运算符,它允许我们使用常规查询来匹配空值

WHERE fieldName <=> :fieldName;

将匹配

null
或任何非空值。

因此,只需立即编写您的查询并照常执行即可

$stmt = $db->prepare('SELECT field FROM table WHERE fieldName <=> :fieldName;');
$stmt->execute(['fieldName' => null]);
$result = $stmt->fetchAll(); // whatever fetch method is suitable

对于动态构建的查询,一切都是一样的。


0
投票

用于空安全比较的 ANSI 标准运算符是

is [not] distinct from
。所以你会写:

WHERE column IS NOT DISTINCT FROM :value

:value
的值可以包括
NULL

注意上面的

NOT

  • 对于相等性检查 (
    a = b
    ),请使用
    a IS NOT DISTINCT FROM b
  • 对于不等式检查 (
    a <> b
    ),请使用
    a IS DISTINCT FROM b

-2
投票

不同的问题,但所有的遮阳篷都在这里:如何使用 PDO 插入 NULL 值?

总结一下:

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

应该可以。您还可以使用:

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

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


-2
投票

在MySql中你可以使用查询

select * from atable where isnull(column_name); 

检查空值。

© www.soinside.com 2019 - 2024. All rights reserved.