0

チェックボックス形式のスポーツのリストを含むサインアップフォームがあります(mysqlテーブルから取得)。投稿時に、検証可能なフォームに関連する変数を使用してセッションを作成します。スポーツのチェックボックスを保存することを除いて、すべてが計画どおりに機能します。私はすでに配列を介して投稿値を渡しているので、配列を介して配列を渡すようなもので、運が悪いところです。ポストからショーまでチェックされたスポーツが欲しいだけです。さらに、そのリストが2回目または3回目の検証で更新された場合、配列を更新したいと思います。コードは次のとおりです。事前に感謝します。

郵便番号

if(isset($_POST['signup']) == 'Finish') { 

//start session to store variables for post-submit validation
session_start();

//sanitizes input and prevents sql injection attacks
foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
    $_SESSION[$key] = $value;
}

$_SESSION['sport'] = array_unique(array_values(array_merge($_SESSION['sport'], $data['sport'])));

フォームコード

        <table class="signup_sportstable" border="0" cellpadding="0" cellspacing="4">';

        $result = mysql_query("SELECT * FROM sports ORDER BY sport ASC");

        $i = 0;
        $max_columns = 3;
        while($row = mysql_fetch_array($result)) {
            foreach ($_SESSION['sport'] as $sport_id) {
                $checked = 'checked';
            }

            // make the variables easy to deal with
            extract($row);

            // open row if counter is zero
            if($i == 0)
            $content .= '<tr>';

            // make sure we have a valid product
            if($sport != "" && $sport != null)
            $content .= '<td><input type="checkbox" name="sport[]" value="'.$sport_id.'" id="sport[]" '.$checked.'>'.$sport.'</td>';

            // increment counter - if counter = max columns, reset counter and close row
            if(++$i == $max_columns) {
             $content .= '</tr>';
             $i=0;
            }  // end if 
        } // end while

        // clean up table
        if($i > 0) {
                for($j=$i; $j<$max_columns;$j++) $content .= "<td>&nbsp;</td>";
            $content .= '</tr>';
        }

    $content .= '
    </table>

アップデート!!!

セッションが作成されると、最初にチェックされたボックスをチェックするだけでなく、すべてのボックスをチェックすることを最初に言及するのを忘れていました。これは、コードに基づくチェック済みの条件が常に true であったためであると通知されたので、...

置換:

foreach ($_SESSION['sport'] as $sport_id) {
            $checked = 'checked';
        }

と:

if (in_array($sport_id, $_SESSION['sport'])) {
    $checked = 'checked';
} else {
    $checked = '';

現在、2 つのチェックボックスが記憶されていますが、送信するたびに、最初にチェックしたチェックボックスのすぐ右側にあるチェックボックスがチェックされます。送信をもう一度押すと、右側に別の場所が表示されます。}

4

1 に答える 1

1

まず第一に、次のことは私には奇妙に思えます。

//sanitizes input and prevents sql injection attacks
foreach($_POST as $key => $value) {
    $data[$key] = filter($value);
    $_SESSION[$key] = $value;
}

これは、すべてをに保存していることを意味し$_POSTます$_SESSIONか? $_SESSION['username']ログイン情報のためにサイトの別の部分でセッションを使用していて、たとえば にユーザー名を保存している場合、誰かが「ユーザー名」パラメーターを使用してフォームを送信することでこれを上書きできるため、それはあなたが望むものではありません。. したがって、おそらくそれをしたくないでしょう。実際に必要な POST 変数を確認し、必要な場所にサニタイズすることをお勧めします。

コードを次のように変更することをお勧めします。

$sports = array();
if (isset($_POST['sport']) && is_array($_POST['sport'])) {
    foreach ($_POST['sport'] as $sport) {
        if (is_numeric($sport)) // example sanitation, since only numeric ids are allowed
            $sports[] = $sport;
    }
    $_SESSION['sports'] = $sports;
} elseif (isset($_SESSION['sports'])) {
    $sports = $_SESSION['sports'];
}

これにより、ユーザーがスポーツを送信した場合、ユーザーはセッションでスポーツをオーバーライドできます。セッションで空のスポーツ配列を許可する場合は、最初の if ステートメントのチェックを のようなものに変更してif (isset($_POST['submit'])、フォームが送信されたかどうかを確認します (送信ボタンの名前は「送信」です)。

最初の条件が失敗した場合 (つまり、渡された新しいスポーツ配列がない場合)、セッションに保存されたスポーツ配列が使用されます。

次に、スポーツがチェックされたかどうかをチェックするコードの 2 番目の部分は、次のようになります。

$checked = in_array($id, $sports);
$content .= '<td><input type="checkbox" name="sport[]" value="'.$id.'" id="sport'.$id.'" '.($checked?'checked="checked':'').'>'.$name.'</td>';

( とが適切に設定されている$idと仮定します。)$name

更新:また、からのスポーツ配列POSTが実際に配列であるかどうかも確認してください。

于 2012-06-03T18:28:39.987 に答える