2012-03-26 134 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