2012-11-06 33 views
0

我有一個非常具體的問題,關於使用mysql數據庫的自定義會話處理程序。我瀏覽了其他主題,因爲這裏有一些涉及自定義會話處理程序的主題,但沒有人回答我的問題。 我使用自定義會話處理程序在一個名爲「會話」類:自定義數據庫會話處理程序 - 特定讀取問題

require_once "mySQL.php"; 

class sessions { 
private $db; 
public function __construct(){ 
    $this->db=new mySQL('localhost', user, pw, database); 
    session_set_save_handler(array(&$this,"open"), 
        array(&$this,"close"), 
        array(&$this,"read"), 
        array(&$this,"write"), 
        array(&$this,"destroy"), 
        array(&$this,"gc")); 
    register_shutdown_function('session_write_close'); 
    session_start(); 
} 
public function read($sessionID){ 
    $abfrage="SELECT * FROM sessions WHERE id='".$sessionID."'"; 
    $result= $this->db->query($abfrage); 
    if ($result == false){ 
     return ''; 
    } 
    if (count($result) > 0){ 
     return $result[0]["value"]; 
    } 
    else{ 
    return ''; 
    } 
} 

在「mySQL.php」存在就是一個類「MySQL的」寫入了建立與數據庫的連接mysqli的。這是工作而不是問題。我想把重點放在「閱讀」程序上,因爲這似乎是主要問題。如果我現在通過

require_once "classes/sessions.php"; 
$SESSION=new sessions(); 
$token=hash("sha256",session_id().time()); 
$_SESSION['token']=$token; 
$_SESSION['running']=1 

創建一個會話,將值寫入會話正確的數據庫值創建:

id (varchar 64) = 54ul84nhc3aimqc55efcs49js4 
lastUpdated (int 11) = 1352226239 
start (int 11) = 1352226233 
value (varchar 20000) =  token|s:64:"2b92aa848a86741ef11d800c3dce527fdcee264f50de10381941241c3d9cc9ee";running|i:1; 

,甚至垃圾收集器工作正常,但是當我重新加載頁面,並嘗試回聲

$_SESSION['running'] 

我收到錯誤「注意:未定義的索引:正在運行」。一個調試器運行通知,上面發佈的讀取例程返回1(這將等於布爾值「true」?!)而不是該值。我檢查了這種情況下讀取例程中的「sessionID」是會話表中的那個,所以我基本上失去了。如果你能幫助我,這將是非常好的,因爲到目前爲止,我已經對這種自定義會話處理程序提供的可能性印象深刻。

也許這裏也可能構成一個側面問題。是正確的,當我重新加載頁面的會話的構造函數被稱爲「$ SESSION = new sessions();」即使已經有一個會話正在運行(但是這種行爲不會改變session_id)?或者這是由於我的會話斷斷續續嗎?

謝謝你的幫助。

編輯:我在xampp發行版中使用PHP/5.4.4和MySQL 5.5.25a以及phpmyAdmin 3.5.2來設置數據庫。會話表是格式爲「MEMORY」的表格,這就是爲什麼我使用varchar 20000字段而不是文本字段。我剛剛看到這篇文章Why does mysql_query() return TRUE with a SELECT statement? 指出,當服務器突然中斷連接時,mysql_query會不時返回true。不過,我無法弄清楚這可能是什麼原因。 我現在加入了MySQL類,也許是在有錯誤涉及這個問題:

<?php 
class mySQL 
{ 
public $mySQLiObj; 
public $lastSQLQuery; 
public $lastSQLStatus; 
public $lastInsertID; 
public function __construct($server,$user,$password,$db,$port="3306"){ 
    //erstelle db-objekt 
    $this->mySQLiObj= new mysqli($server,$user,$password,$db,$port); 
    if (mysqli_connect_errno()){ 
     echo "Keine Verbindung zum MySQL-Server möglich."; 
     trigger_error("MYSQL-Connection-Error",E_USER_ERROR);   
     die(); 
    } 
    //Zeichensatz auf utf8 setzen 
    $this->query("SET NAMES utf8"); 
} 
public function __destruct(){ 
    $this->mySQLiObj->close(); 
} 
public function query($sqlQuery,$resultset=false){ 
    $this->lastSQLQuery=$sqlQuery; 
    $result=$this->mySQLiObj->query($sqlQuery); 
    if($resultset == true){ 
     if($result == false) { 
      $this->lastSQLStatus=false; 
     } 
     else 
     { 
      $this->lastSQLStatus = true; 
     } 
     return $result; 
    } 
    if($resultset == false) { 
     $return = $this->makeArrayResult($result); 
     return $return; 
    } 
} 
private function makeArrayResult($ResultObj){ 
    if ($ResultObj==false){ 
     //Fehler aufgetreten 
     $this->lastSQLStatus=false; 
     return false; 
    } 
    else if ($ResultObj == true) { 
     //UPDATE,INSERT etc. statement es wird nur true zurückgegeben 
     $this->lastSQLStatus = true; 
     $this->lastInsertID = $this->mySQLiObj->insert_id; 
     return true; 
    } 
    else if ($ResultObj->num_rows == 0){ 
     //Kein Ergebnis bei SELECT,SHOW,DESCRIBE oder EXPLAIN Statement 
     $this->lastSQLStatus = true; 
     return array(); 
    } 
    else { 
     $array = array(); 
     while($line = $ResultObj->fetch_array(MYSQLI_ASSOC)){ 
      array_push($array,$line); 
     } 
     $this->lastSQLStatus=true; 
     return $array; 
    } 
} 

} 
+0

這是一個很好的命名約定,讓你的類名爲'Uppercased'和函數名'camelCased()',它有助於提高可讀性。 –

回答

0

所以很多嘗試和錯誤,並往回看的書在那裏我得到的基本佈局之後,來自我的會話處理程序自己回答了這個問題。 似乎是這樣的

$SESSION=new sessions(); 

是關鍵的一點。不要通過顯式調用創建會話,而必須呼叫

session_set_save_handler(new sessions); 

並將該行從會話類的構造函數中移除。但有趣的是,這樣的奇怪錯誤是由此引起的。

謝謝你看看,也許這有助於某人。