【问题标题】:PHP Session not working after redirect using PHP使用 PHP 重定向后 PHP 会话不起作用
【发布时间】:2016-12-01 02:55:54
【问题描述】:

我有 2 个 php 页面,一个用于登录表单,第二个用于内容。 当用户点击提交按钮,页面会重定向到另一个页面,session的值丢失,并在第2页显示Undefined index错误。

登录.php

session_start();
if(isset($_POST['submit'])){
    if(!($_POST['name'] == '' && $_POST['birth'] == '')){
        $name = $_POST['name'];
        $birth= $_POST['birth_Y'].'-'.$_POST['birth_M'].'-'.$_POST['birth_D'];
        $_SESSION["birth"]=$birth;
        $_SESSION["name"]=$name;
    }
}

$var = (strlen($birth)>0 && strlen($_POST['name'])>0);
if($var){
    echo("<script>location.href = '/page/details/';</script>");
exit();
}

第二页: 这是显示错误的行(未定义的索引:姓名和出生)

session_start();
$url = 'http://example.com/folder/test.php?service=123455566666&submit=Data&name='.$_SESSION["name"].'&birth='.$_SESSION["birth"].'';

【问题讨论】:

  • 它不起作用,因为你放了!在 if 条件下,它不会进入该块并且不会创建会话
  • @FaranAli,即使我删除了 !如果会话仍然没有保存
  • 首先你没有在第一页设置 $_SESSION["name"],那么你将如何在第二页得到它?
  • @user3782114 它在 $_POST submit 中定义
  • 我没有在你的代码中看到它,你得到的错误与 error_reporting 有关,打开你的 php.ini 文件搜索 error_reporting 用 E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED 替换值,然后重启服务器

标签: php session undefined session-variables


【解决方案1】:

重写整个代码。

首页:-

<?php
session_start();
if(isset($_POST['submit'])){
  if(!empty($_POST['name']) && !empty($_POST['birth_Y') && !empty($_POST['birth_M']) && !empty($_POST['birth_D'])){
      $name = $_POST['name'];
      $birth= $_POST['birth_Y'].'-'.$_POST['birth_M'].'-'.$_POST['birth_D'];
      $_SESSION["birth"]=$birth;
      $_SESSION["name"]=$name;
  }
}
?>

第二页:-

<?php
session_start();
$url = 'http://example.com/folder/test.php?service=123455566666&submit=Data&name=' .$_SESSION["name"]. '&birth=' .$_SESSION["birth"]. '';
echo $url;
?>

【讨论】:

  • 我试过你的代码不起作用。会话尚未存储
  • 没有错误,但我回显了$url,并且姓名和出生没有任何价值
  • 请再试一次!!
【解决方案2】:

你在第一页的代码真的没有意义,试试这个:

session_start();

if (isset($_POST['submit']))
{
    if (!empty($_POST['name']) && !empty($_POST['birth_Y') && !empty($_POST['birth_M']) && !empty($_POST['birth_D']))
    {
        $name = $_POST['name'];
        $birth = $_POST['birth_Y'].'-'.$_POST['birth_M'].'-'.$_POST['birth_D'];

        $_SESSION["contract"] = $name;
        $_SESSION["birth"] = $birth;

        header('Location: http://yoursite.com/page/details/');
    }
}

我更改了条件以检查字段是否不为空以使其更好,并且我将页面更改移动到有意义的地方,同时使用正确的 PHP 而不是糟糕的 JavaScript hack。

还要注意变量$name$birth在这里是没用的,你可以直接把这些变量的内容放到你的会话数组中,但为了不让你感到困惑,我把它们留下了。

【讨论】:

  • 会话仍然没有保存,现在我尝试了你的代码后它没有重定向
  • 用现在的代码试试,我都没注意你用的那些字段……你真的应该回到PHP的基础上来。
【解决方案3】:

您使用exit 过早地终止了脚本,在这种情况下,会话不会被承诺保持。您可以通过在重定向之前添加 session_write_close 来手动执行此操作:

session_write_close(); 
echo "<script>location.href = '/page/details/';</script>";
// Or better, for many reasons: header('Location: /page/details'); 
exit;

要调试您的ifs,请尝试在它们之外的会话中添加一些内容:

$_SESSION['foo'] = 'bar';
if(isset($_POST['submit'])){
    if(!($_POST['name'] == '' && $_POST['birth'] == '')){
        // ...
    }
}

【讨论】:

  • 我试过你的建议,但重定向后会话的值仍然丢失
【解决方案4】:

您必须尝试使用​​以下代码。它工作正常。

<?php
session_start();
if(isset($_POST['submit'])){
    if((isset($_POST['name']) && $_POST['name'] != '') && (isset($_POST['birth_Y']) && $_POST['birth_Y'] != '') && (isset($_POST['birth_M']) && $_POST['birth_M'] != '') && (isset($_POST['birth_D']) && $_POST['birth_D'] != '')){
        $_SESSION["name"]   = $_POST['name'];
        $_SESSION["birth"]  = $_POST['birth_Y'].'-'.$_POST['birth_M'].'-'.$_POST['birth_D'];

        $var = (strlen($_SESSION["name"])>0 && strlen($_SESSION["birth"])>0);
        if($var){
            exit("<script>location.href = '/page/details/';</script>");
        } else {
            exit("<script>alert('Something Wrong!');</script>");
        }
    } else {
        exit("<script>alert('Please fill all details.');</script>");
    }
}
?>

【讨论】:

  • 如果您有任何问题,请在此处发表评论!
  • 第二页中缺少 login.php 中的会话值
  • 检查帖子名称是否与您的表单帖子输入匹配。
  • 没有错误,但是当我回显 $url 时,姓名和出生没有任何价值
猜你喜欢
  • 2012-07-14
  • 1970-01-01
  • 2017-09-02
  • 2018-05-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多