2012-05-07 6 views
8
$ids = array(1,2,3); 
$in = implode(',',$ids); 

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

クエリは問題なく動作します。しかし、$idsが空の配列の場合$ids = array();空のIN SQLクエリを管理する方法は?

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

空の配列をチェックせずにクエリを実行すると、どうしてこのような状況を回避できますか?

+0

空の配列をチェックするだけではどうですか? MySQLはINの後のいくつかのパラメータを待っていますので、私はそこにはないと思います。 –

+2

'$ ids'はユーザが提供していないことを願っています。 – knittl

+0

空の配列をチェックできない状況があります。クエリをエラーなく実行する必要がありました。私ができることは、入力パラメータを変更することだけです。クエリ実行結果の戻り値ゼロは私にとっては問題ありません。 –

答えて

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('') 

これは、/他の場合からあなたを節約構造その他のすべて

+1

場合によっては、列に空の値が入っている可能性があり、このソリューションはすべての空の値を返します。これは、たとえば、外部キー列で発生する可能性があります。 – NLemay

+1

user_idが一意の識別子である場合、変換失敗エラーをスローします。 – Gqqnbig

+0

これは明らかに巧妙な解決策ですが、混乱していて直感的ではありません。あなたはこれを読むために多くを理解しなければなりません。その点で、faizan-aliのアンサーが優れています。 –

5

$ ids文字列の前に0を追加できます。すべてのIDは、すべてのデータベースで0から開始されます。

それとも、このように行うことができます。..

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

で$が空であるときは、クエリを実行しないでください。

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

EDIT:私は何yoouが必要とすると、この

$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

'$ ids'が空であれば、条件なしでクエリを実行すべきでないことをどのように知っていますか?また、SQLインジェクション? – Jon

+0

$ inが空の場合、質問で説明したようにSQLが例外をスローするので、 –

+0

私は*実行されない理由を尋ねませんでしたが、なぜ*実行してはいけないのか*質問しませんでした。 OPがこの場合にすべてのユーザを選択したくないことをどのように知っていますか? – Jon

-1

あなたは条件付き連結を設定しなければならないようなものだと思う私の誤解を修正しました。

-1

与えられたクエリでは、まったく実行しないでください。他の例について

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

他の回答のように、それは条件付きの連結可能性があり、これを管理するための

0
if((count($in)>0) 
{ 
    //execute sql query code 
} 
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) 

4

私は通常、常に "無効" の値を追加し、そのリストが空になることはありません:

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

コードを比較的きれいに保つために、追加の条件文は必要ありません。 "無効な"値は、許容される値の範囲外でなければなりません。 (上記の例では、有効な$idsは常に正であると仮定しています)

+1

正直なところ、これが最善の解決策です。 – Davor

関連する問題