Php 如何管理sql查询中的空?

Php 如何管理sql查询中的空?,php,mysql,sql,Php,Mysql,Sql,查询没有问题。但是当$ids为空数组时$ids=array() 我正确地得到了sql查询错误,因为SELECT*FROM user,其中用户id IN()不是有效的查询 在不检查空数组的情况下如何避免这种情况,即不管发生什么情况,都要运行查询?您可以在$ids字符串之前添加0。毕竟,任何数据库中都不会有从0开始的ID 或者你可以这样做 $ids = array(1,2,3); $in = implode(',',$ids); $query = "SELECT * FROM user where

查询没有问题。但是当
$ids
为空数组时
$ids=array()

我正确地得到了sql查询错误,因为
SELECT*FROM user,其中用户id IN()
不是有效的查询


在不检查空数组的情况下如何避免这种情况,即不管发生什么情况,都要运行查询?

您可以在$ids字符串之前添加0。毕竟,任何数据库中都不会有从0开始的ID

或者你可以这样做

$ids = array(1,2,3);
$in = implode(',',$ids);

$query = "SELECT * FROM user where user_id IN ($in) ";

当$in为空时,不应运行查询。我想你需要的是这样的东西

$sql = "SELECT * FROM user where ".($ids != ''? "user_id IN ($ids)" : " 1=1");
编辑

$in = implode(',',$ids);
if($in) {
     $query = "SELECT * FROM user where user_id IN ($in) ";
 }
 else {
      //alternate scenario here
 }

您应该设置条件连接:

$in = implode("','",$ids); // generate like 1','2
$query = "SELECT * FROM user where user_id IN ('$in') "; //  if has  1','2 surrond it with quote make it IN('1','2') and if empty than IN('')

编辑:修复了我的误解。

对于给定的查询,您根本不应该运行它

if (count($ids) > 0)
{
    $in = implode(',',$ids);
    $query = "SELECT * FROM user WHERE user_id IN ($in)";
    // ....
}

对于其他情况,它可能是条件连接,如其他答案所示

管理此问题的最佳方法是:

if ($ids) {
  // run your code
} else {
  return false; //or whatever.
}
if((count($in)>0)
{
  //execute sql query code
}

这样可以避免if/else结构和所有其他内容

我会在不同的情况下执行几种不同类型的检查,以确保sql语句有效。 在最基本的检查类型中,我确保变量不为空或false

$in = implode("','",$ids); // generate like 1','2
$query = "SELECT * FROM user where user_id IN ('$in') "; //  if has  1','2 surrond it with quote make it IN('1','2') and if empty than IN('')
通常,我使用一系列的
db.*
函数来验证我传递到查询中的输入,以便我可以处理更高级的用法检查
$ids
数组来自何处

这里有一些测试代码,可以在很多情况下很好地工作

$in = implode(',',$ids);
if(!$ids) $in="0";
$query = "SELECT * FROM user WHERE user_id IN ($ids)";



我通常会添加一个“无效”值,因此列表永远不会为空:

ids:'Array ( [0] => 3 [1] => 6 [2] => 1 [3] => drop table x [4] => 4 ) '
SELECT * FROM user WHERE user_id IN (3,6,1,4)
不需要额外的条件语句,从而保持代码相对干净。 当然,“无效”值必须超出允许值的范围。
(上面的示例假设有效的
$id
始终为正。)

为什么不检查空数组?MySQL只是在输入后等待一些参数,所以我想没有办法我希望
$id
不是用户提供的,如果您在将它们插入查询之前正确地转义它们。我遇到了无法检查空数组的情况。我必须让查询无误地运行。我所能做的就是更改输入参数。查询运行返回结果零对我来说是可以的。如果
$ids
为空,您如何知道查询不应在没有条件的情况下执行?另外,SQL注入?因为如果$in为空,SQL将抛出一个异常,如问题中所述。我没有问为什么不执行它,而是为什么不应该执行它。你怎么知道OP不想在这种情况下选择所有用户?我有一个无法检查空数组的情况。我必须让查询无误地运行。我所能做的就是更改输入参数。查询运行返回结果零是确定的,因为meFalcon已在下面发布了答案,这是这种情况下的最佳解决方案。在某些情况下,列可能包含空值,此解决方案将返回所有空值。例如,这可能发生在外键列中。如果user_id是唯一标识符,则会抛出转换失败错误。虽然这显然是一个聪明的解决方案,但它令人困惑,而且并不直观。你必须了解很多才能读到这篇文章。在这方面,@faizan ali的答案更好。老实说,这是最好的解决方案。
ids:'Array ( ) '
SELECT * FROM user WHERE user_id IN (0)
ids:'1,2,45,6,'
SELECT * FROM user WHERE user_id IN (1,2,45,6)
ids:'Array ( [0] => 3 [1] => 6 [2] => 1 [3] => drop table x [4] => 4 ) '
SELECT * FROM user WHERE user_id IN (3,6,1,4)
$in = implode(',', array_merge($ids, [-1])); // never empty!