15

我一直在将应用程序转换为使用 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 之间的区别,所以如果包含在你的答案中是有意义的,我真的很感激对这个主题的一些澄清......

4

3 回答 3

9

既然写了这个问题,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

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

于 2012-11-12T23:36:58.883 回答
-1

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

把它们加起来:

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

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

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

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

于 2012-11-12T23:22:11.343 回答
-2

在 MySql 中,您可以使用查询

select * from atable where isnull(column_name); 

检查空值。

于 2013-12-30T01:19:30.200 回答