Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/262.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Post/Redirect/Get模式的实现存在问题_Php_Post Redirect Get - Fatal编程技术网

Php Post/Redirect/Get模式的实现存在问题

Php Post/Redirect/Get模式的实现存在问题,php,post-redirect-get,Php,Post Redirect Get,我总是在表格上使用这个方法。我的表格通常都是自己填写的。但是,当表单中出现错误时,我不会发送任何新的标题。这样我就可以轻松地做这样的事情 <input type="text" name="email" value="<?php echo $this->input->post('email', '') ?>" /> 我发现最好的方法是使用header函数。您可以发布到您需要的任何文件,甚至自己进行验证,然后在验证失败时使用头重定向返回表单。将post的值存储在

我总是在表格上使用这个方法。我的表格通常都是自己填写的。但是,当表单中出现错误时,我不会发送任何新的标题。这样我就可以轻松地做这样的事情

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

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

使用标题时(“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>
if($\u POST['submit']))
{
//检查错误
如果($error)
{
$\u会话['myPostVars']=$\u POST;
标题(“位置:myscript.php”);
退出();
}
}
//您的表单代码
编辑:我刚刚注意到你编辑问题是为了避免使用会话


您可以序列化要返回的post变量,并将它们放入查询字符串中(通过header()发送)。您基本上做得不错。没有特别好的方法可以避免“重新发布”警告。

我想您的意思是:

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', ''); ?>" />
函数值($array,$key,$default=false)
{
if(is_array($array)==true)
{
settype($key,'array');
foreach($key作为$value)
{
如果(数组\键\存在($value,$array)===false)
{
返回$default;
}
$array=$array[$value];
}
返回htmlspecialchars($array);
}
返回$default;
}

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

  • 生成唯一的id
  • $\u POST
    变量复制到由上述唯一id键入的会话中
  • 像现在一样重定向,但将唯一id作为查询字符串的一部分传递
  • 更新库以在会话(错误情况)中查找此唯一id,而不是直接访问
    $\u POST
    变量,如果请求中未传递唯一id或您要查找的名称不存在,请使用默认值
  • 在请求结束时,从会话中删除唯一的id项。这样可以避免使用过多的垃圾污染会话。您也可以根据库在请求开始时执行此操作

  • 我使用的实现是来自Kohana()的输入库我不建议将post变量序列化为查询字符串。对于查询字符串的长度有一个未指定的限制,因此如果您正在发布大量数据,浏览器可能会将其截断。例如,将截断1K之后的任何内容,更不用说(I)将记录URL(ii)用户可能会篡改数据。一旦用户被删除,您需要使用会话、cookie或某种机制来预填充数据(“位置”)如果你出于某种原因不想使用会话,也许你可以将数据保存在数据库中,只传递重定向中的查询ID。你不想使用会话或其他任何特定原因吗?我只是想避免这样的事情干扰会话。如果我能避免会话,它会感觉很清楚但如果这是不可避免的,那么也许我应该使用会话。