<?PHP 5.4 以降ではサポートされていないため、短いタグの使用は控えてください。
- MySQL に接続していません (
$link未定義)
- 非推奨の API (
mysql_) を使用しています。代替案についてはコメントを参照してください (mysqli_またはPDO)
REQUEST_METHODのインデックスを使用して$_SERVER、スクリプトが投稿されているかどうかを判断する必要があります。
if( $_SERVER[REQUESTED_METHOD] == 'POST' && !empty($_POST['checkbox']) ) {
... }
エラーをチェックするには、エラー処理を使用する必要があります。echo $sql;チェックボックスが入力されていない場合は、次のようにします。
SELECT * FROM products WHERE id=''
スクリプトは SQL インジェクションに対して脆弱です。現在の API に切り替えるときは、バインドされたパラメーターを使用します。
$_POST[checkbox]配列ですか?
sprintf$_POST[checkbox]配列全体を渡すため、意図したとおりに機能しません。フォーマットするには、それを繰り返し処理する必要があります。(Ollieの回答を参照)
例
HTML が次のようになっているとします。
<form method="post" ...>
<input type="checkbox" name="checkbox[]" value="1" />
<input type="checkbox" name="checkbox[]" value="2" />
<input type="checkbox" name="checkbox[]" value="3" />
<input type="submit" name="submit" />
</form>
3 つのボックスすべてがオンになっています。次の配列が生成されます。
配列
(
[0] => 1
[1] => 2
[2] => 3
)
次のコリーのループ:
foreach ($_POST['checkbox'] as $checkbox) {
$where[] = sprintf(" id='%s'",$checkbox);
}
$where次のようになります。
配列
(
[0] => ID='1'
[1] => id='2'
[2] => id='3'
)
スクリプトの残りの部分は機能するはずです。ただし、IN演算子の使用を検討する必要があります。
これにより、ループをスキップして次のものを使用できますimplode。
$where = "'" . implode("', '", $_POST[checkbox]) . "'";
生成するもの:
「1」、「2」、「3」
と組み合わせるIN:
$sql = "SELECT ... FROM WHERE id IN ($where)";
これはサニタイズされておらず、依然としてインジェクションに対して脆弱であることに注意してください。