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

cdw*_*ott 9 php mysql pdo prepared-statement

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

WHERE fieldName is null;
Run Code Online (Sandbox Code Playgroud)

当字段为空时,将获得预期的结果.

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

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

WHERE fieldName is null;
Run Code Online (Sandbox Code Playgroud)

要么

WHERE fieldName <=> null;
Run Code Online (Sandbox Code Playgroud)

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

WHERE fieldName = :fieldName
Run Code Online (Sandbox Code Playgroud)

然后绑定这些语句:

$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);
Run Code Online (Sandbox Code Playgroud)

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

cdw*_*ott 7

既然已经写了这个问题,mysql引入了一个宇宙飞船操作符,可以让我们使用正则查询来匹配一个空值

WHERE fieldName <=> :fieldName;
Run Code Online (Sandbox Code Playgroud)

将匹配一个null或任何非空值。

所以只需立即编写您的查询并照常执行

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

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

  • 我不认为可以在 PDO 语句中对“IS”条件使用占位符,尽管我很难找到明确的证据。在测试中,即使使用您提供的确切代码,我也无法让“WHERE fieldName is :fieldName”起作用。如果我使用`IS` 以外的东西,例如`=` 或`&gt;`,我可以使该代码正常工作。您能否详细说明您使用的代码,或者有任何其他建议?不过,我坚持使用 MySQL 5.1 版,所以这可以解释为什么它对我不起作用(我看到您使用的是 5.5)。 (2认同)