小编典典

如果我希望使用PDO接受INT和NULL值,如何绑定值?

sql

$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' );
$stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT );

我上面有代码。如果一个文件夹有一个parent_folder_id,则意味着它在另一个文件夹中。如果此列为NULL,则表示它是一个根文件夹。

根据我的理解,如果$
folder_id为NULL,则将其视为0(因此,代码不会获得任何结果,因为该列中的值为NULL而不是0)。如果我将第三个参数更改为PDO ::
PARAM_NULL,仍然没有任何结果。我认为这是因为它将查询评估为“ WHERE parent_folder_id = NULL”,这与“ WHERE
parent_folder_id为NULL”不相同。

有没有一种方法可以让PDO正确处理此问题,或者如果将“ =”替换为“ is”并用正确的值替换bindValue第三个参数,我应该用内联创建我的SQL语句吗?


阅读 147

收藏
2021-04-22

共1个答案

小编典典

如果您使用的是MySQL,则可以使用非标准的NULL安全相等运算符<=>,该运算符可以比较null值或非null值。

$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id <=> :id' );
$stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT );

此运算符始终返回true或false,而不是NULL,这是您尝试将任何与equals进行比较的结果=

ANSI SQL定义了一个谓词IS [NOT] DISTINCT FROM,其工作原理类似,但并非所有供应商都支持它。

2021-04-22