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

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

查询工作没有问题。但是什么时候$ids是空数组$ids = array();

我正确地得到了 sql 查询错误,因为SELECT * FROM user where user_id IN ()它不是有效的查询。

如何在不检查空数组的情况下避免这种情况,即无论如何都要运行查询?

4

8 回答 8

8

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

$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('')
于 2012-05-07T11:35:03.950 回答
7

最好的管理方法是:

$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/else 结构和其他一切

于 2012-05-07T11:40:22.597 回答
5

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

或者你可以这样做..

$sql = "SELECT * FROM user where ".($ids != ''? "user_id IN ($ids)" : " 1=1");
于 2012-05-07T11:34:31.093 回答
3

我通常总是添加一个“无效”值,所以列表永远不会为空:

$in = implode(',', array_merge($ids, [-1])); // never empty!

不需要额外的条件语句,保持代码相对干净。当然,“无效”值必须超出允许值的范围。(上面的例子假设 valid$ids总是积极的。)

于 2016-10-21T11:20:36.233 回答
0
if((count($in)>0)
{
  //execute sql query code
}
于 2012-05-07T11:40:16.233 回答
-1

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

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

通常,我使用一系列db_*函数来验证我传递给查询的输入,以便我可以处理更高级的使用检查$ids数组的来源

这是一些测试代码,在许多情况下对我都很有效。

function db_number_list($lst)
{
    if(!$lst) 
        return "0"; // if there are no passed in values , return a 0 
    if (!is_array($lst)) 
        $lst = explode (",",$lst);  //if a lst was passed in,  create an array
    foreach ($lst as $k=>$val)
    {
        if(!is_numeric(trim($val)))
            unset($lst[$k]);//remove non-numeric values;
    }
    if(!count($lst)) 
        return "0"; //if nothing is in the array after removing non-numeric values,  return 0
    return implode (",",$lst);
} 

$ids=array();
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";

$ids="1,2,45,6,";
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";

$ids=array(3,6,1,"drop table x", 4);
$query = "SELECT * FROM user WHERE user_id IN (".db_number_list($ids).")";
echo "ids:'".print_r($ids,true)."'<br>$query<hr>";

输出:

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)

于 2012-05-07T14:40:02.293 回答
-1

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

if ($ids) {
  // run your code
} else {
  return false; //or whatever.
}

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

于 2012-05-07T11:35:42.223 回答
-2

您应该设置条件连接:

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

编辑:修正了我的误解。

于 2012-05-07T11:35:34.043 回答