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

Php 验证失败后重新加载页面时,保留SQL生成表单的原始顺序(随机),php,mysql,arrays,Php,Mysql,Arrays,我有一个PHP/mysqli生成的表单,它在mysqli查询中使用orderbyrand()对决策任务中的选项进行随机排序(使用找到的代码) 我想出了一种方法来验证用户输入,以匹配预定义的一组值(请参见链接问题的答案),如果不满足验证条件,将触发页面重新加载。但是,这会导致使用不同的随机顺序生成表单表。我希望使用php以与第一次页面加载相同的顺序显示表单表。此外,我希望在输入字段中回显用户输入值(以便用户可以看到输入的内容) 有没有一个相对简单的方法可以做到这一点?我曾研究过使用多维数组并将数据

我有一个PHP/mysqli生成的表单,它在mysqli查询中使用
orderbyrand()
对决策任务中的选项进行随机排序(使用找到的代码)

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


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

我找到了一种方法,将相同的表输出到原始的using to,但在验证检查失败时填充了用户输入数据。这是因为PHP5>=5.5.0中的
array\u 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']);
if(isset($\u会话['origVals'])&&&$\u会话['origVals']==true){
$postOrd=array();
foreach($\u POST[“alt\u ord”]作为$order){
$postOrd[]=$order;
}
$postId=($_POST['alt_id']);
$postRnk=array();
foreach($\以$inputRnk的形式发布['rank']{
$postRnk[]=$inputRnk;
}
函数resToArray($result){
$rws=array();
而($rw=$result->fetch_assoc()){
$rws[]=$rw;
}
返回$rws;
}
$postsql=“从'altrank`'中选择id,alttext”;
$result=$link->query($postsql)或die(mysql_error($link));
$rws=重新排序($result);
$row=array_column($rws,null,'id');
$rows=array();
foreach($k=>$id){
$rows[]=$row[$id];
}
对于($i=0;$iclose();
取消设置($_会话['origVals');

这正是我想要实现的。我欢迎任何关于如何改进代码的反馈。

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