AJAX脚本停止记住会话

时间:2012-03-26 12:09:43

标签: php ajax session sessionid error-log

我回来的时候我发布了this question。我用AJAX脚本更新了这个问题,该脚本工作了大约1周。基本上我可以使用AJAX脚本中的session_start(),然后我可以访问我需要的会话变​​量。

这真的很奇怪,但是我在周末之后进来了,今天早上这个剧本不再适用了。这很简单,在这里:

<?php

session_start();

$ajax_connection = mysql_connect('10.X.X.X',$_SESSION['username'],$_SESSION['password']);

$result_set = array();

while ($result_set[] = mysql_fetch_assoc($results)){
    // do nothing
}

echo json_encode($results);

?>

上周这个工作完美无瑕,现在在我的错误日志中,我收到了Undefined index: usernameUndefined index: password警告。当然,MySQL连接尚未建立。因此,此脚本未与原始连接运行相同的会话。我使用error_log(session_id())来检查父页面和AJAX脚本的ID,确定它们是不同的。当我重新加载页面并再次尝试时,页面和AJAX脚本的ID分别保持不变,但它们应该是相同的ID,而不是2个不同的ID。

无论如何,在经过一周多的工作之后,有没有人知道为什么这不再适用?

2 个答案:

答案 0 :(得分:4)

这是您可以使用的类。这是单身,以确保你只将它实例化一次。使用

进行实例化
$db = Db::getInstance();

然后

$db->connect();

这是一种使用Dbase连接的更安全的方法(注意我使用了PDO,但是如果你真的需要继续使用mysql_函数,你仍然可以修改它。)

class Db {

    private static $instance = null;
    private $db = null;
    private $host = '';
    private $name = '';
    private $username = '';
    private $password = '';

    private function __construct() {
        $this->host = 'yourHost';
        $this->name = 'yourDbName';
        $this->username = 'yourUserName';
        $this->password = 'youPassword';
    }

    public static function getInstance() {
        if(is_null(self::$instance)) {
            self::$instance = new Db();
        }
        return self::$instance;
     }

     public function connect() {
        try {
            $this->db = new PDO('mysql:host=' . $this->host . ';dbname=' . $this->name, $this->username, $this->password);
        } catch(Exception $e) {
            throw new Exception('Connection error: either the database is unavailable or connection infos are not valid. Please contact the webmaster.');
        }
    }
}

答案 1 :(得分:0)

不确定这是否能解决您的问题,但您应该在Ajax中调用的php脚本顶部添加以下内容:

header('Cache-control: no-cache, must-revalidate');
header('Expires: Mon, 26 Jul 1997 05:00:00 GMT');

它解决了我用于会话和Ajax的一些问题。