$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语句吗?
如果您使用的是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,其工作原理类似,但并非所有供应商都支持它。
IS [NOT] DISTINCT FROM