【问题标题】:PHP header() redirect with POST variables [duplicate]PHP header()使用POST变量重定向[重复]
【发布时间】:2011-05-15 23:28:18
【问题描述】:

我正在使用 PHP,并且正在制作一个表单发布到的操作页面。该页面检查错误,然后如果一切正常,它将它们重定向到已发布数据的页面。如果没有,我需要将它们重定向回错误所在的页面和 POST 变量。以下是其工作原理的要点。

HTML 看起来像这样...

<form name="example" action="action.php" method="POST">
  <input type="text" name="one">
  <input type="text" name="two">
  <input type="text" name="three">
  <input type="submit" value="Submit!">
</form>

action.php 看起来像这样...

if(error_check($_POST['one']) == true){
    header('Location: form.php');
    // Here is where I need the data to POST back to the form page.
} else {
    // function to insert data into database
    header('Location: posted.php');
}

如果出现错误,我需要将其 POST 回第一页。 我不能使用 GET,因为输入会太大。 如果可能的话,我不想使用 SESSION。 这可能吗?

【问题讨论】:

  • 根据phpfreaks.com/forums/php-coding-help/…的一些帖子,您也许可以使用header("Location: javascript:window.history.go(-1);");(未测试)
  • 嗯...如果需要,我也希望尝试添加错误消息。那是不允许的。

标签: php html post header


【解决方案1】:

为您的东西使用 smarty 模板,然后将 POST 数组设置为 smarty 数组并打开模板。在模板中只是回显数组,所以如果它通过:

if(correct){
    header("Location: passed.php");
} else {
    $smarty->assign("variables", $_POST);
    $smarty->display("register_error.php");
    exit;
}

我还没有尝试过,但我会尝试将其作为解决方案,并让您知道我发现了什么。但当然,这种方法假设您使用的是 smarty。

如果不是,您可以在错误页面上重新创建表单并将信息回显到表单中,或者您可以在 get from 中发回不重要的数据并获取它

例如

register.php?name=mr_jones&address==......
echo $_GET[name];

【讨论】:

    【解决方案2】:
    // from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
    function do_post_request($url, $data, $optional_headers = null)
    {
      $params = array('http' => array(
                  'method' => 'POST',
                  'content' => $data
                ));
      if ($optional_headers !== null) {
        $params['http']['header'] = $optional_headers;
      }
      $ctx = stream_context_create($params);
      $fp = @fopen($url, 'rb', false, $ctx);
      if (!$fp) {
        throw new Exception("Problem with $url, $php_errormsg");
      }
      $response = @stream_get_contents($fp);
      if ($response === false) {
        throw new Exception("Problem reading data from $url, $php_errormsg");
      }
      return $response;
    }
    

    【讨论】:

    • 这值得更多关注...
    • 你如何使用它来重定向到具有相同表单的特定页面?
    【解决方案3】:

    如果您不想使用会话,您唯一可以做的就是 POST 到同一页面。无论如何,哪个 IMO 是最好的解决方案。

    // form.php
    
    <?php
    
        if (!empty($_POST['submit'])) {
            // validate
    
            if ($allGood) {
                // put data into database or whatever needs to be done
    
                header('Location: nextpage.php');
                exit;
            }
        }
    
    ?>
    
    <form action="form.php">
        <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
        ...
    </form>
    

    这可以做得更优雅,但你明白了......

    【讨论】:

    • 这就是我目前一直在做的事情,但我正试图在不同的页面上进行服务器操作以保持整洁......
    • 只是好奇,POST 数据会在 nextpage.php 上可用吗?
    • @jerjer 不,这就是为什么您需要在同一页面上进行所有处理或使用会话在页面之间持久化数据的原因。
    • @Yoshi 您可以在必要时简单地拆分文件和include HTML 表单。
    • 这可能是我听过的最好的主意。
    【解决方案4】:

    无法将 POST 重定向到其他地方。当您发布请求后,浏览器将从服务器获得响应,然后完成 POST。之后的一切都是一个新的请求。当您在其中指定位置标头时,浏览器将始终使用 GET 方法来获取下一页。

    您可以使用一些 Ajax 在后台提交表单。这样,您的表单值将保持不变。如果服务器接受,您仍然可以重定向到其他页面。如果服务器不接受,则可以显示错误信息,让用户更正输入并再次发送。

    【讨论】:

    • 好主意,你回答了我的问题。但是,我在这个项目中回避 Javascript。
    • 不是这样。 header('HTTP/1.1 307 Temporary Redirect') 和 header('HTTP/1.1 308 Permanent Redirect') 使用以下 header('Location: new_url') 保持原来的重定向方法。
    • 您意识到这个答案来自 2010 年,当时这些状态代码不存在或至少在很大程度上不受支持。如果您有这方面的知识,您可以发布一个完整的答案,展示如何利用这些新的状态代码来解决 OP 的问题。我想很多人会觉得这很有用。
    • @JanThomä。如果一个问题对于新人需要帮助仍然有效,那么经过的时间是无关紧要的。我只是在再次研究这个问题时才回到这个页面。我无法在这里提供答案,但我确实提供了一个完整的 php PayPal 支付页面示例:stackoverflow.com/questions/2865289/…
    【解决方案5】:

    在通过 POST 发送表单数据之前验证表单数据是有益的。您应该创建一个 JavaScript 函数来检查表单是否有错误,然后发送表单。这将防止数据被一遍又一遍地发送,可能会降低浏览器的速度并使用服务器上的传输量。

    编辑:

    如果担心安全性,执行 AJAX 请求来验证数据将是最好的方法。 AJAX 请求的响应将确定是否应提交表单。

    【讨论】:

    • 您仍然应该检查服务器上的数据,否则您可能会遇到安全问题。
    • 正是我的想法,kork。服务器端错误检查总是最好的。
    • 无论您如何验证数据,总是存在安全问题。如果安全是一个问题,AJAX 验证请求可能是要走的路。
    • @Evan 这怎么更安全?您仍然需要在发布数据后对其进行验证。
    • @Evan Huh...?如果操作正确,SQL 注入就没有问题。如果您验证要在服务器上使用的数据,验证也没有问题。 即POST -> 验证 -> SQL 注入安全数据处理 -> 向客户端返回响应。这些是您必须始终坚持的基础。如果你打算在这个过程中使用 Javascript,它完全是次要的和可选的,只是为了提供更多的交互性,它不是你抵御恶意攻击者的第一道、第二道或任何一道防线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-20
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 2012-03-27
    • 2020-06-03
    相关资源
    最近更新 更多