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

Gaz*_*ion 7 php sql pdo

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

我有上面的代码.如果文件夹具有parent_folder_id,则表示它位于另一个文件夹中.如果此列为NULL,则表示它是根文件夹.

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

有没有办法让PDO正确处理这个问题,或者我应该用内联创建我的SQL语句,如果用"is"更改"="并将bindValue第三个参数与正确的参数交换?

Bil*_*win 6

如果您使用的是MySQL,则可以使用非标准的NULL安全等于运算符<=>,它可以比较空值或非空值.

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

此运算符始终返回true或false,而不是NULL,如果您尝试使用equals将任何内容与NULL进行比较,则会获得此结果=.

ANSI SQL定义了一个IS [NOT] DISTINCT FROM类似的谓词,但并不是所有供应商都支持它.

  • 谢谢!这就行了,你也教过我一些东西,我之前从未使用过<=>(对派对来说,一点点,呃?).这将在未来为我节省很多麻烦,这是肯定的:) (2认同)