【问题标题】:PHP session variables lost on header redirect using PHP_SELF in the form action在表单操作中使用 PHP_SELF 进行标头重定向时 PHP 会话变量丢失
【发布时间】:2010-10-14 16:25:29
【问题描述】:

我有一个多步骤表单,为了方便起见,我们假设它是 2 个步骤。第一步我想选择一个单选按钮,并根据该单选按钮选择将我带到某个页面,但我也希望将该选择存储在会话中。我有 2 页: page1.php

session_start();

if(isset($_POST['post'])) {
if (($_POST['country'] == 'US')) {
header("Location: US_Products.php"); }
elseif (($_POST['country'] == 'CDN')) {
header("Location: CDN_Products.php"); }
else { die("Error"); }
exit;
}
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label for="USA">USA:</label>
<input type="radio" name="country" value="US">
<label for="CDN">Canada:</label>
<input type="radio" name="country" value="CDN">
<input type="submit" name="post" value="Go To Filter">
</form>

Page2.php(A 或 B)

session_start();
$_SESSION['country'] = $_POST['country'];
<?php echo $_SESSION['country']; ?>

当我让它执行此条件重定向时,没有通过国家选择。会话变量和重定向或会话变量和 PHP_SELF 是否有问题?

【问题讨论】:

  • 会话变量可以正常传输,但 POST 变量不能。发送 Location 标头不会发送任何 POST 数据。
  • 我可以用什么方法来解决这个问题?

标签: php forms session cookies redirect


【解决方案1】:

第 1 页:

session_start();

if(isset($_POST['post'])) {
    $_SESSION['country'] = $_POST['country'];
    if (($_POST['country'] == 'US')) {
        header("Location: US_Products.php"); }
    elseif (($_POST['country'] == 'CDN')) {
        header("Location: CDN_Products.php"); }
    else { die("Error"); }
    exit;
}
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label for="USA">USA:</label>
<input type="radio" name="country" value="US">
<label for="CDN">Canada:</label>
<input type="radio" name="country" value="CDN">
<input type="submit" name="post" value="Go To Filter">
</form>

第 2 页:

session_start();
<?php echo $_SESSION['country']; ?>

或者使用include方法,只使用一页:

session_start();

if(isset($_POST['post'])) {
    if (($_POST['country'] == 'US')) {
        include("US_Products.php"); }
    elseif (($_POST['country'] == 'CDN')) {
        include("CDN_Products.php"); }
    else { die("Error"); }
    exit;
}
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<label for="USA">USA:</label>
<input type="radio" name="country" value="US">
<label for="CDN">Canada:</label>
<input type="radio" name="country" value="CDN">
<input type="submit" name="post" value="Go To Filter">
</form>

您应该可以在 US_Products.php 和 CDN_Products.php 上使用echo $_POST['country'],或者

【讨论】:

  • 你摇滚!!!所以在第二页上定义它是不是搞砸了?这可能是一个愚蠢的问题,但是您是否总是在输入 POST 的页面上将会话变量定义为 POST 变量?
  • 一旦您致电header,您的$_GET$_POST 数据就会丢失,因为您转到了另一个页面。因此,您的选择是在调用标头之前将其存储在会话变量中,或者通过执行诸如header("Location: US_Products.php?country=$_POST[country]"); 之类的操作通过标头调用传递数据,这将使country 在US_Products.php 的$_GET 数组中可用跨度>
【解决方案2】:

在您重定向之前设置会话变量 - 帖子会丢失,因为重定向本质上是一个常规的 GET 请求

if (($_POST['country'] == 'US')) 
{
  $_SESSION['country'] = $_POST['country'];
  header("Location: US_Products.php"); 
}
elseif (($_POST['country'] == 'CDN')) 
{
  $_SESSION['country'] = $_POST['country'];
  header("Location: CDN_Products.php"); 
}
else 
{ 
  die("Error"); 
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2014-01-04
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 2012-02-25
    • 2019-07-09
    相关资源
    最近更新 更多