在验证失败后重新加载页面时,保留SQL生成表单的原始顺序(随机)


On page reload after failing validation, preserve original order of SQL generated form (randomised)

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

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

是否有一个相对简单的方法我可以做到这一点?我已经研究过使用多维数组和存储$_SESSION中的数据,但没有一个解决方案似乎适用于这个问题。

我设计了一种方法,使用基于另一个数组排序多维数组的答案将相同的表输出到原始表,但在验证检查失败时填充用户输入数据。这要感谢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']);

这是我想要达到的效果。

我欢迎任何关于如何改进这段代码的反馈。