繁体   English   中英

我执行Post / Redirect / Get模式的问题

[英]Problem with my implementation of the Post/Redirect/Get pattern

我总是在表单上使用Post / Redirect / Get方法。 我的表格通常总是提交给自己。 但是,当我在表单中有错误时,我不会发送任何新的标题。 这样我就可以轻松地做这样的事情

<input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" />

PHP只是一个处理2个参数的库函数,$ _ POST键和一个默认值(如果不存在)。

这意味着,如果有人在表格中输入错误,则不必再次填写表格。 缺点是重新加载页面会在浏览器中向其发出POST警告。

无论如何,有没有避免这种情况的状态,而不使用某些状态(即cookie,会话,数据库等)

我发现最好的方法是使用标头函数。 您可以将文件发布到所需的任何文件,甚至文件本身也可以进行验证,然后在失败时使用标头重定向返回到表单。 将张贴的值存储在会话中或其他可访问的变量中,因此您可以访问先前输入的数据。

当使用header(“ location:myscript.php”);时 确保包括一个exit(); 之后,否则您仍然会在刷新时收到POST警告。

myscript.php

if($_POST['submit'])
{
    //check for errrors

    if ($error)
    {
        $_SESSION['myPostVars'] = $_POST;
        header("location: myscript.php");
        exit();
    }
}

<form>
    // your form code
</form>

编辑:我刚刚注意到您编辑了问题以避免使用会话。

您可以序列化要返回的后变量,并将其放入查询字符串中(通过header()发送

如果不在会话中保存状态,则无法避免这种情况。 遇到错误时,您可能会执行以下操作:

  1. 产生一个唯一的ID
  2. $_POST变量复制到以上面的唯一ID为键的会话中
  3. 像现在一样重定向,但是将唯一ID作为查询字符串的一部分传递
  4. 更新您的库以在会话中查找此唯一ID(错误情况),而不是直接访问$_POST变量,如果在请求中未传递唯一ID或您要查找的名称不存在,请使用默认值值
  5. 在请求结束时,从会话中删除唯一ID条目。 这样可以节省过多的垃圾污染会话。 您也可以在请求开始时执行此操作,具体取决于您的库

我认为您的意思是这样的:

function Value($array, $key, $default = false)
{
    if (is_array($array) === true)
    {
        settype($key, 'array');

        foreach ($key as $value)
        {
            if (array_key_exists($value, $array) === false)
            {
                return $default;
            }

            $array = $array[$value];
        }

        return htmlspecialchars($array);
    }

    return $default;
}

<input type="text" name="email" value="<?= Value($_POST, 'email', ''); ?>" />

您可能还需要阅读本教程

您基本上做对了。 没有特别好的方法来避免“重新发布”警告。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM