【发布时间】: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。数据库本身将分别接收准备好的语句和绑定值。它们甚至没有真正连接到查询字符串中,因此不需要引用它们!这就是我要说的。