【问题标题】:GET request on page removing POST information页面上的 GET 请求删除 POST 信息
【发布时间】:2013-05-25 16:43:47
【问题描述】:

我有一个名为 test_photo.php 的页面,人们在执行 POST 请求后会从表单中定向到该页面

<form id="search_photos" action="test_photo.php" method="post">
    <select name="photographer" id="photographer">
        <option selected="selected" value="x">Any Photographer</option>
    </select>

    <--Removed for clarity sake -->

    <input name="Submit" value="Search Now &gt;" id="Submit" type="submit">
</form>

在我们发布到 (test_photo.php) 的页面上,我们有分页来帮助分解显示的大量数据。这是由 GET 请求处理的,该 url 可能类似于 http://foobar.com/xpath/test_photo.php?page=0

问题在于,每当有人在页面上执行获取请求时,POST 数据就会消失。有谁知道我们可以解决这个问题的任何方法。

【问题讨论】:

  • 对此的理解是错误的。如果表单未提交或重新提交,则无法显示 POST 数据。如果您希望跨页面存储,请改用 GET 并使用 GET 值在下拉框中设置默认值。
  • 我们可以正常发布到页面,当我们进入页面时,post 的 print_r 会显示: Array ( [LocationName] => 1 [photographer] => x [images] => x [提交] => 立即搜索 > ) 只有当我们在页面上执行获取请求时,我们才会遇到问题,因为发布数据没有跟随获取请求
  • @Artful_dodger:是的,这是设计使然。就像我说的,你不能定义 POST 变量,除非它是你刚刚提交表单的页面。它应该以这种方式工作。 POST 实际上只是单击提交按钮后最终得到的值。如果你做一个简单的 GET 请求,你不只是单击任何提交按钮。看到了吗?
  • 提供一些来自 test_photo.php 的代码来查找错误。表格本身是不够的。另请记住,如果您要上传文件,则输入标签必须包含属性 enctype="multipart/form-data"
  • @AlejandroIván:这与本案无关。

标签: php rest post get


【解决方案1】:

好吧,试图排除这里明显的情况。

您以不正确的方式混合GETPOST。如果您有一个不希望暴露的值的表单并且在提交后不再需要这些值(例如登录),您应该只解决POST。在这里,您可以将值继续到下一页等。

这永远不会起作用,因为如果您发布表单,POST-values 仅在您提交表单后才可用。如果您尝试彻底刷新(不重新发布表单),您将看到这些值已经消失。

您应该怎么做?将表单发布为POST,然后构建GET-parameters 的查询。

喜欢

page.php?page=1&photographer=1&location=3

这是处理过滤器的正确方法。看看 Google 如何存储当前的搜索查询 (google.com?q=your search)。规则是“不同页面需要的值”?只需GET。这也使人们可以为搜索添加书签或将其发送给应用了所有过滤器的其他人。

【讨论】:

  • +1 正确答案但我不知道他是否会明白你在说什么:)
  • 是的,这比我的要好,但如果他不明白 Post 值不是持久的,他可能会在这里感到困惑。无论如何,+1!
【解决方案2】:

我认为 GET 请求不会破坏您的 POST 数据。通过添加调试语句来检查您的 $_POST 数据在“目标”页面加载时是否完整,例如 print_r($_POST); 到您的页面。它应该打印出整个 $_POST 数组以进行检查。

如果您的浏览器支持这样,鼠标右键单击可以让您“检查元素”以更好地格式查看数组。

你可以用 print_r($_GET);看看它包含什么,或者实际上是任何数组。

【讨论】:

  • 它确实会破坏它。尝试发布表单,然后刷新页面(如果浏览器要求您重新发送表单,请单击否)。价值观消失了。
  • GET 值不会破坏 POST 值。您所说的没有意义,因为 POST 仅在提交表单时发送一次,并且不会在多个页面加载中持续存在。
  • @AlejandroIván 你误会了 OptimusCrime,你俩说的是同一件事,但用了不同的词。
【解决方案3】:

首先,POST 数据不会消失。它在那里,但如果你的提交处理程序首先看到 GET 数据,它可能会忽略它。

正如这个小演示将展示的那样:

<?
    print_r( $_REQUEST );
?>

<form action="/path/to_this/page.php?get=yes" method="post">
    <input type="text" name="test" value="SomeVal"/>
    <input type="submit">
</form>

但是,话虽如此,听起来您最简单的选择是在没有 GET 参数的情况下将数据提交到页面。我假设,您不需要两者(即,您不关心 POSTed 数据的页码是多少)。

但是,无论如何,您应该能够同时查看 GET 和 POST 数据。

现在,当您说“有人在页面上执行获取请求”时 - 如果您的意思是有人将 URL 粘贴到浏览器中并按 Enter,那么在这种情况下您将永远不会看到该 POST 数据。只有在提交表单后才能看到它。

【讨论】:

    【解决方案4】:

    GET 值不会破坏 POST 值,您必须更好地理解这一点,仅此而已。

    当您使用 POST 提交表单时,加载的页面会生成一个带有传递值的 $_POST 数组。当您加载另一个包含 GET 参数的页面时,POST 会消失,因为它在页面加载时不会持续存在。

    您必须做的是存储值(例如使用会话)以使它们持久化。比如:

    <?php
        session_name("any_name_for_starting_a_session");
        session_start();
    
        if (isset($_POST)) $_SESSION['passed_values'] = $_POST; // Store the values if POST is sent
    
        if (isset($_SESSION['passed_values'])) { // Getting the values if stored
            $post = $_SESSION['passed_values'];
    
            // Here you can work with $post ...
            //...
    
    
            // If you need to delete the stored values
            // unset($_SESSION['passed_values']);
        }
    ?>
    

    【讨论】:

      猜你喜欢
      • 2014-05-31
      • 2017-02-03
      • 2022-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-27
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多