web-dev-qa-db-ja.com

複数のチェックボックスから$ _POSTを取得

1つのフォームに複数のチェックボックスがあります(それぞれにコードが付いています)。

<input type="checkbox" name="check_list" value="<? echo $row['Report ID'] ?>">

$row['Report ID']はデータベースの主キーです。つまり、それぞれの値は異なります。

どのチェックボックスがチェックされたかをどうやって知ることができるでしょうか? (多分)

これは受信箱システムのためのもので、その下にあるボタンをクリックするとチェックボックスがチェックされているすべてのメッセージ($row['Report ID']のID)を削除します。

151
James Rattray

フォームの名前をcheck_list[]に設定すると、すべてのチェックボックスに配列としてアクセスできるようになります($_POST['check_list'][])。

これが要求された小さなサンプルです。

<form action="test.php" method="post">
    <input type="checkbox" name="check_list[]" value="value 1">
    <input type="checkbox" name="check_list[]" value="value 2">
    <input type="checkbox" name="check_list[]" value="value 3">
    <input type="checkbox" name="check_list[]" value="value 4">
    <input type="checkbox" name="check_list[]" value="value 5">
    <input type="submit" />
</form>
<?php
if(!empty($_POST['check_list'])) {
    foreach($_POST['check_list'] as $check) {
            echo $check; //echoes the value set in the HTML form for each checked checkbox.
                         //so, if I were to check 1, 3, and 5 it would echo value 1, value 3, value 5.
                         //in your case, it would echo whatever $row['Report ID'] is equivalent to.
    }
}
?>
314
Sean Walsh

編集@Marcが言ったことを以下のコメントに反映させます。

転記されたすべての値をループすることができます。

HTML:

<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />
<input type="checkbox" name="check_list[]" value="<?=$rowid?>" />

PHP:

foreach($_POST['check_list'] as $item){
  // query to delete where item = $item
}
21
Scone

それに応じてチェックボックスに名前を付ける必要があります。

<input type="checkbox" name="check_list[]" value="…" />

これで、チェックされたすべてのチェックボックスにアクセスできます。

// loop over checked checkboxes
foreach($_POST['check_list'] as $checkbox) {
   // do something
}

ps。正しく出力をエスケープするようにしてください(htmlspecialchars()

16
knittl
<input type="checkbox" name="check_list[<? echo $row['Report ID'] ?>]" value="<? echo $row['Report ID'] ?>">

そして投稿の後、あなたはそれらをループすることができます:

   if(!empty($_POST['check_list'])){
     foreach($_POST['check_list'] as $report_id){
        echo "$report_id was checked! ";
     }
   }

または前のページから投稿された特定の値を取得します。

if(isset($_POST['check_list'][$report_id])){
  echo $report_id . " was checked!<br/>";
}
12

申し訳ありませんが、古いトピックですが、これは@JamesRattrayと他の人が問題を抱えていたためにこれについて言及するべき重要な一片です。

PHPスクリプトに複数の値をポストしようとしているときは、(/>を使用して)inputタグを自己終了しないでください。タグを自分で閉じると、配列定義は終了し、送信時にスクリプトに送信される値は1つだけになります。実際には@Sconeの答えは/>が変更されるまでうまくいかないかもしれません。

この場合、これがWarning: Invalid argument supplied for foreach() in /home1/... PHPエラーの原因となります。

編集:以下のコメントで述べたように、さらなる研究はこれがDOCTYPEに依存していることを示唆しています。 XHTMLにDOCTYPEが設定されている場合は、入力タグを閉じる必要があります。 DOCTYPEがHTML 5の場合は、入力タグを閉じないようにする必要があります。これは、ユーザーがページを表示しているブラウザの種類や、コードで指定されているDOCTYPEにどれだけ従っているかによっても左右される可能性があります。

12
Jon Gallup

とても簡単です。注意を払うとすぐにそれを手に入れることができます! :)

HTML配列を作成し、それをphp配列に送信します。あなたのHTMLコードは次のようになります。

<input type="checkbox" name="check_list[1]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[2]" alt="Checkbox" value="checked">
<input type="checkbox" name="check_list[3]" alt="Checkbox" value="checked">

[1] [2] [3]はメッセージのIDsです。つまり、echoは代わりに$row['Report ID']になります。

その後、フォームを送信すると、PHP配列は次のようになります。

print_r($check_list)

[1] => checked [3] => checked

どちらがチェックされ、どれがチェックされなかったかによって異なります。

これから先も続けることができると確信しています。

5