为什么我的php会话不持久


Why is my php session not persisting?

关于php会话,我有一个奇怪的问题。我使用会话来跨页面传输信息。我的问题是,在某些情况下(通常是十分之一),我得到一个错误说PHP通知:未定义的索引:$myVar。它的奇特之处在于,会话在应用程序的第一部分持续存在,然后似乎消失了。

流程如下:

  1. 用户进入登录页面,输入用户码后点击提交。
  2. 应用程序转到收集信息的控制页,并使用data类收集和存储信息。
  3. 数据类将信息存储到一个数组中,然后将该数组放入会话中,
  4. 控制页然后使用该信息发送电子邮件,并将用户转发到欢迎页面。
  5. 电子邮件使用会话变量以及欢迎页面。即使欢迎页面没有显示,电子邮件也总是带有这些信息。

这是欢迎页面的顶部,会话开始是第一行。

<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="./rmilogo.png" type="img/png" />
<title>Welcome!</title>

这是控制页

<?php
session_start();
function getDealer() {
require '../data/DealerDB.php';
$action = filter_input(INPUT_POST, 'response');
$dealerID = filter_input(INPUT_POST, 'dCode');
new DealerDB('****************', $dealerID);
$cmpDealer = $_SESSION['dealer'];
if (!$cmpDealer['dCode'] == '' || !is_null($cmpDealer['dCode'])) {
    require '../business/AutoEmail.php';
try{
        new AutoEmail($action, $cmpDealer['dCode']);
    }catch(Exception $e) {
        trigger_error('Message: ' . $e->getTraceAsString()); 
    }
    header("Location: http://www.*******.com/welcome.php");
} else {
    header("Location: http://www.*******.com/error.html");
}
}
getDealer();
再次

,会话开始在页面的顶部。这是数据检索类的顶层。

<?php
session_start();
$_SESSION['dealer'] = null;
require '../business/Dealer.php';


class DealerDB {
private $host;
private $user;
private $passkey;
private $db;    
function __construct($db, $dealerCode) {
    $this->host = '*******';
    $this->user = '*******';
    $this->passkey = '*******';
    $this->db = $db;
    $_SESSION['dealer'] = $this->buildDealer($dealerCode);
}
还是

, session从顶部开始,这里的问题是,当控制类调用电子邮件时,它会工作,并且大多数时候将会话传输到下一页也是如此。然而,有时会话变量不持续存在,信息丢失,无法在程序的其他地方找到,我只是得到一个$mySessionVar没有设置错误。

@shudder发布了一个非常有用的列表,直到我换了主机才意识到这一点。这个问题的关键是域,并确保我停留在当前的域。当我在本地主机上运行时,这不是一个问题,因为它总是通过localhost加载,并从WAMP加载我的www文件夹。然而,当您部署到托管站点的大坏世界时,有些事情会发生变化。您可以通过www.your_website.com或your_website.com访问该网站。当你试图携带会话变量,你正在使用头重定向从www.your_website.com到www.your_website.com,同样your_website.com到your_website.com的结果是伟大的,但是,如果你试图携带一个会话从www.your_website.com到your_website.com不工作。它们在会话的眼中是不同的,因此会话似乎消失了。那么我们如何解决这个问题呢你可以做两件事之一我的第一个建议是最简单的

1)进入你的主机面板,将你的域名重定向到你在标题中使用的域名,所以如果你有:

headers("Location: http://www.yourdomain.com/welcome.php");

就是说,你要确保如果有人在地址栏输入yourdomain.com它们被重定向到www.yourdomain.com/index.php,可以这么说,这样标题总是对齐并一致的。

你也可以做一个地址栏检查,像这样

$server=$_SERVER['HTTP_HOST'];

在if语句中使用server来测试uri是否等于www.yourdomain.com或等于yourdomain.com,并以这种方式处理报头。

如果我错过了什么,请让我知道,但这绝对是一个很好的学习经验,在会话变量的性质和注意,你必须采取部署你的最终应用程序时。谢谢你们所有人的帮助,我期待着再来一次。

答案2

可能您包含的其中一个文件也正在启动一个新会话。这将擦除会话的当前状态。

参见PHP会话变量丢失

为什么在session_start()之后关闭PHP标签,然后重新打开它们?

E。G而不是this:

<?php session_start(); ?>
<?php
function getDealer() {
require '../data/DealerDB.php';

这样做:

<?php 
session_start();
function getDealer() {
require '../data/DealerDB.php';

我没有看你的代码。但是,我可以马上告诉你,关闭这些标签会导致各种不稳定的行为。

Zend框架文件格式指南

为什么不关闭标签…