【问题标题】:Bind SOMETIMES null value with PDO将 SOMETIMES 空值与 PDO 绑定
【发布时间】:2015-07-02 14:32:41
【问题描述】:

我的数据库中只有一条记录,“action_taken”列设置为NULL。我到底要如何让 PDO 找到它???

如果我直接在 SQL 中键入查询,它会按预期工作。

注意:这只是一个测试脚本来说明我的问题。大多数时候传递的值是一个字符串,但偶尔会是 NULL。

include ('include/mysql.php');

$sql = 'SELECT * FROM returns WHERE action_taken = :action';
$sth = $dbh->prepare($sql);
$param = null;
$sth->bindValue(':action', $param, PDO::PARAM_STR);
$sth->execute();
if ($sth->rowCount())
    {
    echo 'FOUND YOU!';
    }
else
    {
    echo 'NOOOO :(';
    }

【问题讨论】:

  • 你的 where 子句需要看起来像 action_taken IS NULLaction_taken = null 无效。
  • 你不能测试 null 是否相等。 NOTHING 永远不能等于(或不等于)null。 null 是有毒且具有传染性的。任何涉及空值的操作也会使整个操作变为空。
  • 谢谢马克。我以为 PDO 会为我解决这个问题。意味着我需要对每个参数添加检查 NULL 值,然后为每种情况重写查询/绑定参数。非常不方便:(
  • 您是否建议更改数据库以使默认值为“”而不是 NULL?

标签: php mysql pdo null


【解决方案1】:

基本上,您不能说“等于 null”。它总是必须是IS null:

$sql = 'SELECT * FROM returns WHERE action_taken IS :action';

如果可能的话,你最好不要使用NULL

【讨论】:

  • 不为空怎么办?
  • 在所问问题的上下文中,只有检查它是否匹配 NULL。我建议不要使用NULL,因为那样可以使用=
猜你喜欢
  • 2011-05-31
  • 1970-01-01
  • 1970-01-01
  • 2016-01-07
  • 2019-06-05
  • 2021-06-11
  • 2016-12-26
  • 2012-09-02
  • 2015-05-18
相关资源
最近更新 更多