【问题标题】:On page reload after failing validation, preserve original order of SQL generated form (randomised)在验证失败后重新加载页面时,保留 SQL 生成表单的原始顺序(随机)
【发布时间】:2014-05-20 07:31:22
【问题描述】:

我有一个 PHP/mysqli 生成的表单,它在 mysqli 查询中使用 ORDER BY rand() 来随机化决策任务中的选项(使用找到的代码 here)。

我想出了一种方法来验证用户输入以匹配一组预定义的值(请参阅链接问题的答案),如果不满足验证条件,它将触发页面重新加载。但是,这会导致使用不同的随机顺序生成表单表。我想以与使用 php 加载的第一页相同的顺序显示表单表。此外,我想echo 用户在输入字段中输入值(以便用户可以看到她/他输入的内容)。

有没有一种相对简单的方法可以实现这一点?我研究过使用多维数组并将数据存储在$_SESSION 中,但似乎没有一个解决方案适用于这个问题。

【问题讨论】:

  • 您可以使用基于 JS 的验证。检查这个:plugins.jquery.com/validate
  • 谢谢,我熟悉 jQuery 验证方法。我现在正在寻找服务器端解决方案。
  • 您还可以在表单中添加隐藏字段以在其中存储所有必要的信息。
  • 而且您绝对不应该在失败后重新加载页面。使用 $_POST 数据来填充用户输入的字段。这也解决了您丢失表单状态的问题。
  • 我看不出为什么在会话中存储必要的信息应该起作用。您可以尝试的另一种方法是使用您自己选择的值(可能通过 PHP 的 rand 预先确定)为RAND() 函数播种 - 每次相同的种子值都会产生相同的“随机”结果。您可以将该值与您的表单一起传递(或将其放入会话中),如果您必须重新生成相同的表单,则将其传递给 MySQL 的 RAND(),否则您只会得到一个新的随机值。

标签: php mysql arrays


【解决方案1】:

我想出了一种使用this answerSort multidimensional array based on another array 将相同的表输出到原始表的方法,但是在验证检查失败时填充了用户输入数据。这要归功于 PHP 5 >= 5.5.0 中的 array_column

if(isset($_SESSION['origVals']) && $_SESSION['origVals'] == true){
    $postOrd = array();
        foreach($_POST["alt_ord"] as $order){
            $postOrd[] = $order;
        }
    $postId = ($_POST['alt_id']);
    $postRnk = array();
        foreach($_POST['rank_'] as $inputRnk){
            $postRnk[] = $inputRnk;
        }

    function resToArray($result){
        $rws = array();
        while($rw = $result->fetch_assoc()){
            $rws[] = $rw;
        }
            return $rws;
}

    $postsql = "SELECT id, alttext FROM `altrank`";
    $result = $link->query($postsql) or die(mysql_error($link));

    $rws = resToArray($result);

    $row = array_column($rws, null, 'id');
    $rows = array();
    foreach ($postId as $k => $id){
        $rows[] = $row[$id];
    }

    for($i = 0; $i < count($rows); $i++){
        $rows[$i]['rank'] = $postRnk[$i];
    }

    $result->close();
    unset($_SESSION['origVals']);

这适用于我想要实现的目标。我欢迎任何关于如何改进此代码的反馈。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-21
    • 2012-05-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-26
    • 1970-01-01
    相关资源
    最近更新 更多