【问题标题】:Storing and updating checkbox array with PHP sessions使用 PHP 会话存储和更新复选框数组
【发布时间】:2012-06-05 07:43:21
【问题描述】:

我有一个注册表单,其中包含复选框形式的运动列表(从 mysql 表中提取)。在发布后,我创建了一个会话,其中包含与可以验证的表单相关的变量。除了存储运动的复选框外,一切都按计划进行。我已经通过一个数组传递我的帖子值,所以它就像通过一个数组传递一个数组,这就是我没有任何运气的地方。我只想要从帖子到显示的检查运动。此外,如果该列表在第二次或第三次验证时更新,我希望它更新数组。代码如下,先谢谢了。

邮政编码

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>

更新!!!

我一开始忘了提到,我的代码会在创建会话后检查每个框,而不是只检查最初选中的框。我被告知这是因为我根据我的代码检查的条件总是正确的,所以...

替换:

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

与:

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

现在,它会记住两个复选框,但在每次提交后,它会立即检查我第一次检查的那个右侧的那个。如果我再次点击提交,它在右边的另一个位置。 }

【问题讨论】:

    标签: php session checkbox


    【解决方案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']),以检查表单是否已提交(并且您的提交按钮名为“提交” ')。

    如果第一个条件失败(即没有传递新的运动数组),将使用存储在会话中的运动数组。

    然后,检查是否检查了一项运动的代码的第二部分将类似于:

    $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中的运动数组是否真的是一个数组。

    【讨论】:

    • 感谢您对会话的关注,但该页面只能由未经身份验证的用户访问,并且当 mysql 实际提交无错误时会话被破坏。
    • 你为什么不为此使用一个局部变量呢?我看不出将您的会话用于此类事情的意义。如果您正在使用外部库或计划将来扩展您的软件怎么办? (不过,你可以只命名你想要的属性,这没有什么问题。)
    • 根据你提交的地方,你为什么不能直接引用$_POST呢?否则,我建议使用$_SESSION['sports_post_data'] 之类的东西。这样干净多了。
    猜你喜欢
    • 1970-01-01
    • 2022-07-01
    • 1970-01-01
    • 2013-12-27
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 2016-12-14
    相关资源
    最近更新 更多