1

PHPでフォームを使用しようとしています。

データベースからフォーム情報を入力します。

フォーム入力は行に分かれています。

フォームには、そのデータ行のみを渡すためのチェックボックスがあり、フォーム解析ドキュメントでデータを解析すると、チェックされた行のみが取得されます。

ただし、チェックボックス配列の $_POST メソッドはチェックされたもののみを返しますが、他のすべての入力配列には、チェックされていないものも含めてすべての行が含まれています。

<?php



while($row = mysql_fetch_assoc($query)){
    $id = $row["id"];
        $email = $row["user_email"];
    $androidId = $row["user_androidid"];
    $amount = $row["amount"];

    echo "<tr>
    <td><input id='data_id' name='data_id[]' size='25'  value='".$id."'/></td>
    <td><input id='mail' name='mail[]'size='25' value='".$email."'/></td>
    <td><input id='androidId' name='androidId[]' size='25' value='".$androidId."'/></td>
    <td><input id='amount' name='amount[]' size='25' value='".$amount."'/></td>
    <td>coming soon...</td>
    <td><input id='currency' name='currencyCode[]' size='25' value='USD'/></td>
    <td><input type='checkbox' name='chosen[]' value='".$id."'<td>
    </tr>";



}
?>

そして、私は次のようにテストしています:

for($i=0; $i<count($_POST["chosen"]); $i++){

echo $_POST["chosen"][$i];

}
for($i=0; $i<count($_POST["mail"]); $i++){

echo $_POST["mail"][$i];

}

特定の例では、現在 3 つの行があり、最初と最後を「チェック」します。

フォーム データを解析すると、チェックボックス配列は最初と最後の値のみを返しますが、mail[] を解析しようとすると、行 1、2、および 3 のすべての値が含まれます。

これを適切に構成する方法についてのアイデアはありますか? 確認を探しているだけで、構造に問題があると確信しています。

4

3 に答える 3

3

入力配列に同じキーを与えることで、入力配列をリンクしてみてください。この場合は$id-

while($row = mysql_fetch_assoc($query)){
    $id = $row["id"];
        $email = $row["user_email"];
    $androidId = $row["user_androidid"];
    $amount = $row["amount"];

    echo "<tr>
    <td><input id='data_id' name='data_id[".$id."]' size='25'  value='".$id."'/></td>
    <td><input id='mail' name='mail[".$id."]'size='25' value='".$email."'/></td>
    <td><input id='androidId' name='androidId[".$id."]' size='25' value='".$androidId."'/></td>
    <td><input id='amount' name='amount[".$id."]' size='25' value='".$amount."'/></td>
    <td>coming soon...</td>
    <td><input id='currency' name='currencyCode[".$id."]' size='25' value='USD'/></td>
    <td><input type='checkbox' name='chosen[".$id."]' value='".$id."'/><td>
    </tr>"; 
}

次に、投稿で、チェックされた配列のみを取得できます-

foreach($_POST["chosen"] as $key=>$value){
     echo $_POST["data_id"][$key];
     echo $_POST["mail"][$key];
     echo $_POST["androidId"][$key];
     echo $_POST["amount"][$key];
     echo $_POST["currencyCode"][$key];
     echo $_POST["chosen"][$key];
}
于 2013-06-05T15:48:34.250 に答える
1

var_dump($_POST)を実行して、送信されているものを全体的に確認することをお勧めします。なぜなら、チェックボックスがオンになっている行の情報 (およびその情報のみ) を取得していることに驚かされるからです (誤解していない限り)。まず、入力タイプで「タイプ」を指定しない場合、デフォルトのタイプは「テキスト」になります。つまり、そのテキストボックスにあるものは何でも編集できるため、送信ボタンを押すと (チェックボックスのいずれかをオンにしたかどうかに関係なく)、各テキストボックス内のすべての値が送信されます。

必要なことを行うには複数の方法があります (チェックボックスがオンになっている行に属する情報のみを処理します)。

Javascript ヘルプ:

  1. 送信ボタンが押されるたびに呼び出される disable() という関数を追加します。この関数は、チェックされていないチェック ボックスの行の値を処理し、テキスト ボックスを「無効」に設定して、サーバーに送信されないようにします。

これの利点は、チェックされたチェック ボックスに関連付けられた情報のみが送信されるため、サーバーでのフィルタリングについて心配する必要がないことです。

Cosn、JavaScript に慣れていない場合、これは明らかに役に立ちません。

PHP サーバー側:

ショーンの答えを見たところですが、それは良いものです。代わりにサーバーで検証したい場合は、それを行うことができます。ただし、ユーザーがテキスト ボックスのデータを編集できることを警告させてください。たとえば、空のままにしたり、好きなものを追加したりできます。ユーザーがそれを送信し、$_POST[input_name][$key] 経由でアクセスしようとすると、サーバーから確立したものを取得しません。

于 2013-06-05T16:16:49.607 に答える
1

おそらくこれはより良い構造であり、ID をキーとする値の配列と、選択されたキーを保持する選択された値の配列を持つことになります。あなたが持っているhtmlエラーもチェックしてください<td><input type='checkbox' name='chosen[]' value='".$id."'<td>

echo "<tr>
<td><input id='data_id' name='".$id."[data_id]' size='25'  value='".$id."'/></td>
<td><input id='mail' name='".$id."[mail]' size='25' value='".$email."'/></td>
<td><input id='androidId' name='".$id."[androidId]' size='25' value='".$androidId."'/></td>
<td><input id='amount' name='".$id."[amount]' size='25' value='".$amount."'/></td>
<td>coming soon...</td>
<td><input id='currency' name='".$id."[currency]' size='25' value='USD'/></td>
<td><input type='checkbox' name='chosen[]' value='".$id."'/></td>
</tr>";

テスト用のPHPは次のとおりです。

if ( !empty($_POST['chosen']) ) {
    foreach ( $_POST['chosen'] as $value ) {
        print_r( $_POST[$value] );
    }
}
于 2013-06-05T15:50:17.017 に答える