2012-03-26 131 views
1

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

这真的很奇怪,但是周末过后我进来了,今天早上这个脚本不再工作了。这是非常简单的,在这里:

<?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,而不是两个不同的ID。

无论如何,有没有人有任何想法,为什么这不会工作了,工作了一个多星期后?

+0

为什么要将mysql连接信息存储在会话变量中? – 2012-03-26 12:44:06

+0

@ N.B。那是因为它有效。我还有什么可以获得AJAX脚本的连接信息? – 2012-03-26 12:47:35

+1

是什么阻止您将包含数据库凭证的文件包含到您的AJAX脚本中?对于10 000个用户,您将使用相同的信息填写会话。这不是真的可行吗?它显然也会给你带来问题。因此,这意味着一个糟糕的设计决定。我可以继续讨论它在共享主机等方面是不安全的,但是我不会这么做,这只是糟糕的设计决定,因为会将数据库信息存储在会话中。 – 2012-03-26 13:08:49

回答

4

以下是您可以使用的类。这是在单身人士,以确保你instanciate只有一次。与

$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.'); 
     } 
    } 
} 
0

不知道这是否会解决你的问题,但你应该添加反正下面你叫Ajax的PHP脚本的顶部:

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

它解决了一些问题,我用它来与会话和Ajax 。

+0

感谢您的帮助,但这并没有解决问题。 – 2012-03-26 12:40:26

+0

必须在session_start()后添加,但 – Ronan 2012-03-26 12:44:10

+0

哦,谢谢,仍然没有得到同一届会议。 – 2012-03-26 12:48:43