如何返回加载了提交表单的页面?

时间:2015-02-12 23:20:47

标签: php session-variables

用户提交表单并从page_0.php转到page_1.php。然后浏览从page_1.php到page_2.php的链接。如果用户想要从浏览器中按“后退”按钮,如何防止来自浏览器的警告消息如“错误代码:ERR_CACHE_MISS”(确认表单提交?)并加载之前显示的相同数据按链接到page_2?

我尝试使用会话,但并不总是有效:

page_0.php:用户选择一个选项:

<!-- this is page_0.php -->
<form action="page_1.php" method="post">
  <select name="id">
      <option value="1">Car</option>
      <option value="2">Bike</option>
      <option value="3">Skate</option>
      <option value="4">Plane</option>
  </select>
  <button type="submit">Submit</button>
</form>

page_1.php :(提交位于page_0.php的表单后,用户到达page_1.php)

<?php
session_start();
//this is page_1.php
if(isset($_POST['id']))
{ 
   $product_id = $_POST['id'];
   $_SESSION['data'] = $_POST['id']; 
}
else
{
   $product_id = $_SESSION['data'];
}

$result = mysqli_query($con, "SELECT id_product_name, product_name FROM products WHERE id='$product_id'");
$row = mysqli_fetch_assoc($result);
while ($row=mysqli_fetch_array($result))
   {?>
   <a href="page_2.php?id=<?php echo $row['id_product_name']?>">Go to product detail</a>
   <?php
   }
?>

现在,用户点击其中一个链接即可查看产品的更多详细信息。假设点击ID为3的链接:

<a href="page_2.php?id=3">Go to product detail</a> 

用户到达page_2.php。

<?php
//this is page_2.php
$product_id = $_GET['id'];
echo 'Hello here you can find details of product'.$product_id;
?>

现在用户按下浏览器上的“后退”按钮。

我的问题是:用户如何回到page_1.php并仍然查看他在点击链接之前看到的相同信息,而且没有从浏览器收到任何消息?

2 个答案:

答案 0 :(得分:1)

以表格的输入值回显会话变量。

图片的标题说明:

  • 关于哪个页码对应的内容有点不清楚,所以我会自行决定
  • 确保在任何页面之前没有输出。

第1部分

<?php
session_start();
?>

<form action="page_1.php" method="post">
  <input value="<?php echo $_SESSION['data']; ?>" name="id" />
  <button type="submit">Submit</button>
</form>

如果这不是所需的结果,那么只需在同一页面上使用会话变量。

I.e。:

$data = $_SESSION['data'];
echo $data;

并将您当前的输入保持为<input value="854" name="id" />

第2部分

<?php
session_start();
if(isset($_POST['id']))
{ 
   $product_id = $_POST['id'];
   $_SESSION['data'] = $_POST['id']; 
}
else
{
   $product_id = $_SESSION['data'];

    $result = mysqli_query($con, "SELECT product_name FROM products WHERE id='$product_id'");
    $row = mysqli_fetch_assoc($result);
    echo $row['product_name'];

}

?>
<a href="page_2.php">Go to page 2</a>

修改

第2页看起来像这样,将$_SESSION['data']分配给$_GET['id']

<?php
//this is page_2.php

session_start();

$_GET['id'] = $_SESSION['data'];
$product_id = $_GET['id'];
echo 'Hello here you can find details of product: '.$product_id;
?>

答案 1 :(得分:0)

您应始终从处理表单提交的页面重定向服务器端,因此无法从后退按钮返回到该页面。这是为了防止在后退按钮上意外双重提交的可能性,以及像你注意到的那样的丑陋错误。

(只是为了澄清。这样做会使历史记录跳过处理提交的页面,因此从page_2返回将直接返回到表单,而不是处理页面。)

因此,请从

更改page_1.php的结尾
?>
<a href="page_2.php">Go to page 2</a> 

要:

header('Location: page_2.php');
exit;

此外,要使其正常工作,您可能必须确保在致电header()之前不要打印任何内容。我不记得在PHP中是否有必要,但它是在某些语言中(例如Java / JSP)。