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

Posted

技术标签:

【中文标题】使用 PHP PDO 准备语句和 MySQL 选择字段为空的行【英文标题】:Selecting rows where a field is null using PHP PDO prepared statements and MySQL 【发布时间】:2012-11-01 10:25:54 【问题描述】:

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

【问题讨论】:

不同的问题,但所有的遮阳篷都在这里:***.com/questions/1391777/… 我已经尝试了该问题的所有不同建议,但到目前为止都没有奏效...... 如果你在null上插入或搜索,为什么需要参数化呢? @MikeBrant 因为您想搜索一个有时为空、有时不是的字段...WHERE field=:value 和 :value 可能为空或不为空 【参考方案1】:

由于写了这个问题,mysql引入了一个太空船操作符,它允许我们使用常规查询来匹配一个空值

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

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

【讨论】:

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

在MySql中你可以使用查询

select * from atable where isnull(column_name); 

检查空值。

【讨论】:

【参考方案3】:

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

总结一下:

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

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

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

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

【讨论】:

WHERE fieldName = :fieldName 适用于 "bob" 但不适用于 :fieldName 为 "NULL" 时,WHERE fieldName IS :fieldName 适用于 "NULL" 但不适用于 :fieldName 为 "bob" 时,

以上是关于使用 PHP PDO 准备语句和 MySQL 选择字段为空的行的主要内容,如果未能解决你的问题,请参考以下文章

PHP PDO 准备语句——MySQL LIKE 查询

在 PHP 中到处使用准备好的语句? (PDO)

使用 PDO 准备好的语句 MySQL 错误

如何使用 AES_ENCRYPT 和 PDO 准备语句改进大型加密数据库的 PHP 解决方法?

PHP PDO准备语句给出“无效语法”错误[重复]

从 mysql_query 转换为准备好的语句 (mysqli/PDO)?必要的?