1

複数選択フィールドがあります

<select name="duration[]" id="duration" title="Duration" multiple="multiple" size="3">
<option value="1">1 Months</option>
<option value="2">2 Months</option>
<option value="3">3 Months</option>
</select>

私のphpコードは複数の値、つまり123を1,2,3として内破し、データベースに挿入します。問題は、フィールドが必須フィールドではなく、空のままにしておくとエラーが発生することです (無効な引数が渡されました)

以下の私のphpコード

$duration = array();
$duration = $_POST['duration'];
if($duration)
   {
   foreach($duration as $value)
   {
   $months[] = $value;
   }
}
$sql = "SELECT * FROM tbl_courses WHERE duration IN (".implode($months, ',').") ";

前もって感謝します

4

6 に答える 6

2

あなたが抱えている2つの問題は、配列ではない可能性のあるユーザー入力を内破しようとすることと、コードがSQLインジェクションに対して脆弱であることです.

それらに対処するには、最初に の配列であるis_array()かどうかを確認し、次に の要素があるかどうかを確認しcount()、最後に内破array_map()しますが、SQL インジェクションを防ぐために値をフィルタリングするために使用します。これにより、SQL インジェクションが防止されるだけでなく、IN句で文字列を引用する必要があるため、クエリの構文エラーも防止されます。

function getInt($i) {
    return (int)$i;
}

$inClause = '';

if(isset($_POST['duration']) && is_array($_POST['duration']) && count($_POST['duration']) > 0)
{
    $inClause = 'WHERE ';
    $inClause .= implode(', ', array_map('getInt', $_POST['duration']));
}

$sql = "SELECT * FROM tbl_courses $inClause";
于 2012-12-06T07:45:14.820 に答える
1
$duration = array();
$duration = $_POST['duration'];
$sql = FALSE;
if($duration&&is_array($duration))
   {
   foreach($duration as $value)
   {
   $months[] = $value;
   }
 $sql = "SELECT * FROM tbl_courses WHERE duration IN (".implode($months, ',').") ";
}

if($sql){
//do something with sql
}

$duration が配列かどうかを確認するには、is_array を使用します。

于 2012-12-06T07:52:45.450 に答える
0

必要ない場合は WHERE 条件を削除するだけです

$sql = "SELECT * FROM tbl_courses";

if (count($months)>0)
    $sql .= " WHERE duration IN (".implode($months, ',').") ";

isset($_POST["x"])の代わりに使用することをお勧めしifます。

于 2012-12-06T07:37:54.873 に答える
0

$_POST['duration']としましょうnull

$duration = array();
$duration = $_POST['duration'];

foreach次に、実行される予定がないため、内破する価値がありません。1つの解決策は、コードをif( $_POST['duration'] )それぞれに配置することですif( count($months) )

于 2012-12-06T07:38:18.667 に答える
0

オプションの 1 つは型キャストです。

$duration = (array)$_POST['duration'];

クエリで $_POST['duration'] のコンテンツを使用するため、SQL インジェクション手法に注意してください。

于 2012-12-06T07:44:22.517 に答える
0

設定されていることを確認し、$_POST['duration']設定されている場合は WHERE ステートメントを作成し、設定されていない場合は空白のままにします。

$where = !$_POST['duration'] ? '' : 'WHERE duration IN ('.implode($_POST['duration'],',').')';
$sql = 'SELECT * FROM tbl_courses '.$where;

また、不要な変数宣言とループの一部を削除しまし$durationた。

SQL インジェクションから保護するために、データをサニタイズする必要があることに注意してください。この場合の最も簡単な方法は、値をループして次のようにキャストすることintです。

foreach($_POST['duration'] as $value) {
   $months[] = (int)$value;
}
$where = !$months ? '' : 'WHERE duration IN ('.implode($months,',').')';
$sql = 'SELECT * FROM tbl_courses '.$where;
于 2012-12-06T07:49:22.943 に答える