Binding "not null" in PDO?


Binding "not null" in PDO?

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

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

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

然而,我现在想做相反的事情。我想获取所有列,其中bar列是不是 null。

我知道我可以简单地用bar IS NOT NULL代替bar = :bar。然而,我希望避免这种情况,而是通过准备好的语句来完成,因为我有时必须动态地构建查询字符串,并且必须手动完成它将是大量额外的工作。

这可能吗?

不能绑定"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();
恐怕你的假设是错误的。虽然通常可以绑定NULL值,但WHERE bar = NULL语句不会返回任何行,无论是原始SQL还是PDO。整个语句将被求值为NULL,并且不会匹配任何行。

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