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)