【问题标题】:Binding "not null" in PDO?在 PDO 中绑定“非空”?
【发布时间】:2016-01-07 03:33:29
【问题描述】:

我最近发现可以在 PDO 中绑定空值:

$stmt = $db->prepare('SELECT * FROM foo WHERE bar = :bar');
$stmt->execute(array(':bar'=>null));
$foo = $stmt->fetchAll(PDO::FETCH_OBJ);

这将成功地从数据库中获取所有foo,其中bar 列为空。

但是,我现在想做相反的事情。我想获取 bar 列为 not null 的所有列。

我知道我可以简单地将bar = :bar 替换为bar IS NOT NULL。但是,我想避免这种情况,而是通过准备好的语句来完成,因为有时我必须动态构建查询字符串,而必须手动完成会带来很多额外的工作。

这可能吗?

【问题讨论】:

  • 您可以使用像pixie 这样的查询构建器库,然后您可以轻松构建动态查询或制作自己的查询构建器
  • 然后构建两个语句,一个用于传递值,另一个用于使用IS NOT NULL。 PDO 将引用参数。
  • @Mjh PDO/MySQL 将将参数视为值。可能涉及也可能不涉及任何报价;理想情况下,如果您使用本机准备好的语句,则不涉及任何引用。这只是将参数视为语法的一部分或作为值的区别。
  • @deceze 查看 OP 发布的代码,PDO 将引用参数。没有隐式说明参数类型是什么。
  • @Mjh 理解prepared statements是数据库支持的原生API。数据库本身将分别接收准备好的语句和绑定值。它们甚至没有真正连接到查询字符串中,因此不需要引用它们!这就是我要说的。

标签: php mysql pdo


【解决方案1】:

您不能绑定“NOT NULL”。您只能绑定。 “IS NOT NULL”不是一个值,它是完全不同的查询语法。您只需动态构建查询,值绑定无法帮助您:

$query = 'SELECT ... WHERE ';
if (/* condition is NOT NULL */) {
    $query .= 'foo IS NOT NULL';
    $stmt = $db->prepare($query);
} else {
    $query .= 'foo = :foo';
    $stmt = $db->prepare($query);
    $stmt->bindValue('foo', $foo);
}
$stmt->execute();

【讨论】:

  • 好吧,我想这就解决了。我认为这会比实际上更难。感谢您的帮助。
  • 感谢您的直接回答
【解决方案2】:

恐怕你的假设是错误的。尽管您通常可以绑定 NULL 值,但 WHERE bar = NULL 语句不会返回任何行,无论是使用原始 SQL 还是 PDO。整个语句将被评估为 NULL,并且不会匹配任何行。

相反,您可以使用 NULL 安全的等于运算符 <=> 来匹配为 NULL 或具有某些值的字段。但是要获得不为空的值,您仍然需要进行另一个查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-06-05
    • 2012-09-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    • 2013-02-20
    相关资源
    最近更新 更多