【问题标题】:PHP open another webpage with POST dataPHP用POST数据打开另一个网页
【发布时间】:2010-09-23 14:22:22
【问题描述】:

我是 PHP 新手,我正在尝试做一些可能是不好的做法并且很可能是不可能的事情。我基本上只是在拼凑一些东西来测试我的知识,看看 PHP 能做什么。

我有一个网页,其中包含收集数据的表单。这被提交给一个 PHP 脚本,该脚本执行一堆处理 - 但实际上并不显示任何重要的东西。我想要的是,一旦处理完成,脚本就会告诉浏览器打开另一个页面,显示结果。

我知道我可以使用 header('Location: page.php'); 但我不知道如何提供 POST 数据。我怎样才能做到这一点?或者,还有其他方法可以告诉浏览器打开另一个页面吗?

编辑:我从回复中得到的是,可能使用各种黑客来做到这一点,但我最好将处理和显示代码放在一个文件中。我对此很满意;这比什么都重要。

【问题讨论】:

    标签: php post redirect header


    【解决方案1】:

    您可以将该数据存储在会话中,例如在处理帖子的第一个文件中

    session_start();
    $_SESSION['formdata'] = $_POST; //or whatever
    

    然后你可以在下一页阅读它

    session_start();
    print_r($_SESSION['formdata']);
    

    或者您可以通过 GET 传递它:(但根据 cmets,这是一个坏主意)

    header('Location: page.php?' . http_build_query($_POST)); 
    

    如果您这样做,请确保您在 page.php 上进行额外的处理/验证,因为恶意用户可能会更改变量。您也可能不需要将整个帖子传输到下一页

    编辑

    我应该明确一点,我认为第二种选择可能更糟,因为您受到可以通过 get 发送的数据大小的限制,并且由于用户可以更明显地操纵数据,因此它可能不太安全。

    【讨论】:

    • 我会为会话建议投赞成票,对 get 建议投反对票,所以不要给你投票。
    • @Nouveau:同意,我只是想表明这是一个更无国籍的选择,但我应该明确表示它不太可取
    • 我同意 Nouveau 的观点。第二个建议确实是不好的做法
    【解决方案2】:

    处理完成后是否真的需要调用另一个页面?我可能会做以下事情:

    <form method="post" action="display.php">
    ...
    </form>
    

    display.php:

    if ($_POST) {
        require_once(process.php);
        process($_POST);
        display_results;
    }
    

    包含处理 post 请求所需的代码的 process.php。

    或者,您可以使用 cURL 库之类的东西将处理结果传递给您自己指定的页面。不知道这是否真的是你所追求的。

    【讨论】:

      【解决方案3】:

      你可以使用 JavaScript 作为一种肮脏的变通方法:

      <form id="redirect_form" method="post" action="http://someserver.com/somepage.php">
          <input type="hidden" name="field_1" value="<?php echo htmlentities($value_1); ?>">
          <input type="hidden" name="field_2" value="<?php echo htmlentities($value_2); ?>">
          <input type="hidden" name="field_3" value="<?php echo htmlentities($value_3); ?>">
      </form>
      <script type="text/javascript">
          document.getElementById('redirect_form').submit();
      </script>
      

      (脚本应在表单下方)

      【讨论】:

        【解决方案4】:

        无法将用户的浏览器重定向到任意页面并发送 POST 请求。这会带来一些安全风险,任何链接都可能导致您向任意站点提交任何表单,而您对将要发生的事情一无所知。

        简而言之,这是不可能的

        【讨论】:

          【解决方案5】:

          AFAIK 这通常分两步完成:

          1. 在 form.php 上,将数据 POST 到脚本 process.php
          2. process.php 脚本处理数据但从不输出任何内容,它总是调用 header("Location: asdasd") 重定向到 success.php 或 failure.php 页面(如果适用)

          【讨论】:

            【解决方案6】:

            在一个脚本中完成所有操作,然后为结果输出不同的 HTML。

            <?php  if($doingForm)  {   ?>
            
            html for form here
            
            <?php } else { ?>
            
            html for results
            
            <? } ?>
            

            【讨论】:

            【解决方案7】:

            这个问题困扰了我一段时间。我的自定义 CMS 做了一些相当复杂的处理、上传和操作,所以有时会输出很长的错误和信息消息,不适合转换为 GET 数据,我一直想避免数据 INSERT 的重新加载问题,但是还没有找到合适的解决方案。

            我相信解决这个问题的正确方法是为每个可能的状态创建消息数组 - 您可能想要显示的每个消息或错误,然后您只需要发送更容易发送的错误/消息编号处理长数据字符串,但这是我个人一直回避的事情,因为我觉得它有点乏味和麻烦。坦率地说,这可能只是我的懒惰。

            我非常喜欢 SESSION 变量存储解决方案,但这提出了一个问题,即如何确保正确销毁 SESSION 数据? 只要您确保您只发送信息(消息/错误)而不是应该/可以存储的数据(因此可能是敏感的),这应该是一个可以避免的问题。

            【讨论】:

              【解决方案8】:

              我希望你的问题是正确的。 你可以试试这个:

              1. 将您的表单调整为如下所示:

              表单方法=“POST”操作=“process_data.php”

              2。 然后您创建文件 process_data.php,它惊人地处理数据。
              在这个文件中你使用 header:
              例如:

              $head = sprintf("page.php?data1=%d?data2=%d",$data1,$data2);
              标头($头);

              希望能帮到你。

              【讨论】:

              • hm...如果你投票给我,也许你能给我一个理由?!?!
              • 我没有对你投反对票,但你给出的代码示例不起作用
              • header($head) 应该是 header('Location: ' . $head);不过,这个例子看起来是个不好的做法......
              猜你喜欢
              • 1970-01-01
              • 2014-02-03
              • 2011-01-26
              • 2011-10-18
              • 1970-01-01
              • 2011-12-13
              • 1970-01-01
              • 2023-03-30
              • 2019-05-13
              相关资源
              最近更新 更多