我一直在将应用程序转换为使用 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之间的区别,所以如果在你的答案中包含它是有意义的,我真的很感激对这个主题的一些澄清......
自从写了这个问题后,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
对于动态构建的查询,一切都是一样的。
用于空安全比较的 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
不同的问题,但所有的遮阳篷都在这里:如何使用 PDO 插入 NULL 值?
总结一下:
$stmt->bindValue(':param', null, PDO::PARAM_INT);
应该可以。您还可以使用:
$stmt->execute( array(":param" => NULL));
对于bindparam,您必须给出变量中的值(不是常量),bindvalue 您可以使用常量等。
在MySql中你可以使用查询
select * from atable where isnull(column_name);
检查空值。