Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在条件中使用可为空的值编写准备好的语句_Php_Mysql_Pdo_Prepared Statement_Nullable - Fatal编程技术网

Php 在条件中使用可为空的值编写准备好的语句

Php 在条件中使用可为空的值编写准备好的语句,php,mysql,pdo,prepared-statement,nullable,Php,Mysql,Pdo,Prepared Statement,Nullable,有没有一种方法可以编写一个准备好的语句,将一个值与条件中的另一个值进行比较,我不知道这个值是否为NULL 从'bar'中选择'foo',其中'a1`=:a1和'a2`=:a2 如果我将这个准备好的语句与a1=>null和a2=>42一起使用,那么生成的查询将是: 从'bar'中选择'foo',其中'a1`=NULL和'a2`=42' 当然,这不是我想要的。在这种情况下,我需要这个: 从'bar'中选择'foo',其中'a1'为空且'a2`='42' ^^ a1和a2都可以为空。我不想定义4个pr

有没有一种方法可以编写一个准备好的语句,将一个值与条件中的另一个值进行比较,我不知道这个值是否为NULL

从'bar'中选择'foo',其中'a1`=:a1和'a2`=:a2 如果我将这个准备好的语句与a1=>null和a2=>42一起使用,那么生成的查询将是:

从'bar'中选择'foo',其中'a1`=NULL和'a2`=42' 当然,这不是我想要的。在这种情况下,我需要这个:

从'bar'中选择'foo',其中'a1'为空且'a2`='42' ^^ a1和a2都可以为空。我不想定义4个prepare语句:

-如果两个值都不是空的,我会使用这个 从'bar'中选择'foo',其中'a1`=:a1和'a2`=:a2 -如果a1的期望值为空 从'bar'中选择'foo',其中'a1'为空且'a2`=:a2 -如果a2的期望值为空 从'bar'中选择'foo',其中'a1`=:a1和'a2'为空 -如果我希望这两个值都为空 从'bar'中选择'foo',其中'a1'为空,'a2'为空
MySQL提供了空安全比较spaceship操作符。它指定一个相等比较,该比较将返回TRUE或FALSE,并且在任一操作数为NULL时不返回NULL

作为示范:

SELECT NULL=NULL
     , NULL<=>NULL
     , 1=NULL
     , 1<=>NULL
     , 1=0
     , 1<=>0
     , 1=1
     , 1<=>1
为了回答您提出的问题,我们可以使用空安全比较太空船操作符编写一个语句,如下所示:

 SELECT `foo`
   FROM `bar`
  WHERE `a1` <=> :a1
    AND `a2` <=> :a2
 SELECT `foo`
   FROM `bar`
  WHERE ( `a1` = :a1  OR  ( `a1` IS NULL AND :a1d IS NULL ) )
    AND ( `a2` = :a2  OR  ( `a2` IS NULL AND :a2d IS NULL ) )

请注意,我们需要传入每个绑定值的值两次。在过去,PDO不允许对绑定占位符进行多个引用。不确定PDO的最新版本是否仍然如此。如上所示,解决方法是在语句中使用四个不同的占位符,并为:a1和:a1d提供相同的值。

谢谢!我不认识那个操作员,本来可以和他一起想出解决办法的,或者我自己想出来的@斯托夫:我很高兴你觉得这很有帮助。为了强调我可能没有充分强调的东西。。。该比较运算符是仅在MySQL中可用的非标准扩展。至少,我不知道还有其他数据库管理系统支持这个操作符。谢谢你提到这一点。这与我的情况无关,因为我们无论如何都不会保持dbms的独立性。
 ( a = b OR ( a IS NULL AND b IS NULL ) )
 SELECT `foo`
   FROM `bar`
  WHERE `a1` <=> :a1
    AND `a2` <=> :a2
 SELECT `foo`
   FROM `bar`
  WHERE ( `a1` = :a1  OR  ( `a1` IS NULL AND :a1d IS NULL ) )
    AND ( `a2` = :a2  OR  ( `a2` IS NULL AND :a2d IS NULL ) )