0

結果を表示できないので、コードの何が問題なのか、どこが間違っているのかを教えていただけないでしょうか。$_POST['checkbox'] は配列です。

<?
   $get_id=$_POST['checkbox']; 

    if(empty($get_id)) {
        echo("<h3>You didn't select anything.</h3>");
   } else {  
        $where[]  = sprintf(" id='%s'",$_POST["checkbox"]);
   }

   $where_str = " WHERE ".implode(" AND ",$where);
   $sql = "SELECT * FROM products $where_str";
   $result = mysql_query($sql, $link);

    echo "<table>";
    echo "<tr> <th>Description</th> </tr>";
        while($row = mysql_fetch_array($result)) {
            echo "<tr><td>";     
            echo $row['description'];   
            echo "</td></tr>"; 
        }
   echo "</table>"; 
?>
4

2 に答える 2

3
  1. <?PHP 5.4 以降ではサポートされていないため、短いタグの使用は控えてください。
  2. MySQL に接続していません ($link未定義)
  3. 非推奨の API ( mysql_) を使用しています。代替案についてはコメントを参照してください (mysqli_またはPDO)
  4. REQUEST_METHODのインデックスを使用して$_SERVER、スクリプトが投稿されているかどうかを判断する必要があります。

    if( $_SERVER[REQUESTED_METHOD] == 'POST' && !empty($_POST['checkbox']) ) { ... }

  5. エラーをチェックするには、エラー処理を使用する必要があります。echo $sql;チェックボックスが入力されていない場合は、次のようにします。

    SELECT * FROM products WHERE id=''

  6. スクリプトは SQL インジェクションに対して脆弱です。現在の API に切り替えるときは、バインドされたパラメーターを使用します。

  7. $_POST[checkbox]配列ですか?
  8. 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)";

これはサニタイズされておらず、依然としてインジェクションに対して脆弱であることに注意してください。

于 2013-02-23T15:22:42.977 に答える
0

あなた$_POST["checkbox"]が言うように が配列の場合、sprintf. array_popその配列の最後の値などを返すために使用してみてください。

foreach配列内の各要素を使用できます。

foreach ($_POST['checkbox'] as $checkbox) {
    $where[]  = sprintf(" id='%s'",$checkbox);
}

ID が 2 つの異なる整数に等しくなるように要求すると、おそらく無効な SQL ステートメントが作成されるだけです。

于 2013-02-23T15:15:29.690 に答える