$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 ()
不是有效的查询。
如何在不检查空数组的情况下避免这种情况,即无论如何都要进行查询运行?
答案 0 :(得分:7)
当$ 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('')
答案 1 :(得分:6)
管理此方法的最佳方法是:
$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结构和其他所有内容
答案 2 :(得分:5)
你可以在$ ids字符串之前加0。毕竟,任何数据库中的No ID都将从0开始。
或者你可以这样做..
$sql = "SELECT * FROM user where ".($ids != ''? "user_id IN ($ids)" : " 1=1");
答案 3 :(得分:4)
我通常总是添加“无效”值,因此列表永远不会为空:
$in = implode(',', array_merge($ids, [-1])); // never empty!
不需要额外的条件语句,保持代码相对干净。
当然,“无效”值必须在允许值的范围之外。
(上面的示例假定有效$ids
始终为正。)
答案 4 :(得分:0)
if((count($in)>0)
{
//execute sql query code
}
答案 5 :(得分:0)
我在不同的情况下做了几种不同类型的检查,以确保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)
答案 6 :(得分:-1)
您应该设置条件连接:
if (count($ids) > 0)
{
$in = implode(',',$ids);
$query = "SELECT * FROM user WHERE user_id IN ($in)";
// ....
}
编辑:解决了我的误解。
答案 7 :(得分:-1)
对于给定的查询,您根本不应该运行它。
if ($ids) {
// run your code
} else {
return false; //or whatever.
}
对于其他情况,它可以是条件连接,如其他答案中所示