Php 如果我想让一个值在PDO中同时接受INT和NULL,那么如何绑定它?

Php 如果我想让一个值在PDO中同时接受INT和NULL,那么如何绑定它?,php,sql,pdo,Php,Sql,Pdo,我有上面的代码。如果文件夹具有父文件夹id,则表示它位于另一个文件夹中。如果此列为NULL,则表示它是根文件夹 根据我的理解,如果$folder_id为NULL,那么它会将其视为0(因此我不会得到代码的结果,因为该列中的值为NULL而不是0)。如果我将第三个参数更改为PDO::PARAM_NULL,我仍然不会得到任何结果。我认为这是因为它将查询计算为“WHERE parent\u folder\u id=NULL”,这与“WHERE parent\u folder\u id为NULL”不同 有没

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

根据我的理解,如果$folder_id为NULL,那么它会将其视为0(因此我不会得到代码的结果,因为该列中的值为NULL而不是0)。如果我将第三个参数更改为PDO::PARAM_NULL,我仍然不会得到任何结果。我认为这是因为它将查询计算为“WHERE parent\u folder\u id=NULL”,这与“WHERE parent\u folder\u id为NULL”不同

有没有办法让PDO正确地处理这个问题,或者我应该用内联if创建SQL语句,将“=”改为“Is”,并用正确的参数交换bindValue第三个参数?

可能是这样

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

如果您使用的是MySQL,您可以使用非标准,它可以比较空值或非空值

  <?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 );
    }
$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将任何内容与NULL进行比较,就会得到该值

ANSI SQL定义的谓词
与类似的
不同,但并非所有供应商都支持它。

您可以使用,
。您的查询应该是
SELECT id,name FROM folders WHERE parent\u folder\u id:id


如果您更改到另一个数据库并需要更新查询,其中一些数据库具有与
不同的
,它们的作用大致相同。

这并不能解决我得不到结果的问题,因为如果它为NULL,则我必须改为更改准备sql查询的方式。我知道如果是这样的话,我会怎么做(使用内联if),但我觉得PDO可能足够聪明,可以为我改变这一点,我只是不知道怎么做。不要太信任PDO:主要维护人员大约2年前离开了,此后项目就陷入了停滞。对不起,我在发布它时没有看到Bill的答案,答案是正确的,但是你太慢了(几秒钟的时间,呵呵)!)谢谢这就成功了,你也教了我一些东西,我以前从来没有用过(哎呀,派对上有一点,嗯?)。这会让我在将来省下很多麻烦,这是肯定的:)
  <?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 );
    }
$stmt = $dbh->prepare( 'SELECT id, name FROM folders WHERE parent_folder_id <=> :id' );
$stmt->bindValue( ':id', $folder_id, PDO::PARAM_INT );