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

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

クエリは問題なく動作します。しかし、$ids空の配列はいつですか$ids = array();

SELECT * FROM user where user_id IN ()は有効なクエリではないため、SQLクエリエラーが正しく発生しました。

空の配列をチェックせずに、つまりクエリを実行させずに、このような状況を回避するにはどうすればよいですか?

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を追加できます。結局のところ、どのデータベースでもIDは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

与えられたクエリに対しては、それをまったく実行しないでください。

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

他の場合は、他の回答に示されているように、条件付き連結である可能性があります

于 2012-05-07T11:35:42.223 に答える
-1

SQLステートメントが有効であることを確認するために、さまざまな状況でいくつかの異なるタイプのチェックを行います。最も基本的なタイプのチェックでは、変数が空またはfalseでないことを確認します

$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 に答える
-2

条件付き連結を設定する必要があります。

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

編集:私の誤解を修正しました。

于 2012-05-07T11:35:34.043 に答える