私はさまざまな状況でいくつかのタイプの検査を行い、 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)
空の配列をチェックするだけではどうですか? MySQLはINの後のいくつかのパラメータを待っていますので、私はそこにはないと思います。 –
'$ ids'はユーザが提供していないことを願っています。 – knittl
空の配列をチェックできない状況があります。クエリをエラーなく実行する必要がありました。私ができることは、入力パラメータを変更することだけです。クエリ実行結果の戻り値ゼロは私にとっては問題ありません。 –