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

时间:2011-08-16 17:31:03

标签: php sql pdo

$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正确处理这个问题,还是应该用内联创建我的SQL语句,如果用“is”更改“=”并将bindValue第三个参数与正确的参数交换?

3 个答案:

答案 0 :(得分:6)

如果您使用的是MySQL,则可以使用非标准NULL-safe equal operator <=>,它可以比较空值或非空值。

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

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

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

答案 1 :(得分:2)

您可以使用NULL-safe equal operator<=>。您的查询应为SELECT id, name FROM folders WHERE parent_folder_id <=> :id

如果您更改到另一个数据库并需要更新查询,则其中一些数据库的NOT DISTINCT FROM具有相同的功能。

答案 2 :(得分:0)

也许这个?

<?php 
    $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' );
    if (is_null($folder_id)) {  
    $stmt->bindParam( ':id',null, PDO::PARAM_NULL );
    } else {
    $stmt->bindParam( ':id', $folder_id, PDO::PARAM_INT );
    }

虽未经过测试

编辑:

更像这样:

  <?php 
  if (is_null($folder_id)) {    
       $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id IS NULL' );
  } else {
       $stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id = :id' );
       $stmt->bindParam( ':id', $folder_id, PDO::PARAM_INT );
    }

我知道这不是最优的,但PDO仍然是错误的......