2010-06-02 3 views
0

Я хочу, чтобы хранить все свои сессии в БД и прочитать об этом и реализован следующий класс:Сохранение сессий в БД в PHP - постоянно получаю ошибку MySQL

<?php 
/** 
* This class handles users sessions and stores the session in the DB rather than in a file. This way stops any 
* shared host security problems that could potentially happen. 
*/ 
class sessionHandler { 

    /** 
    * Initial constructor which takes the database object as a param, to do all the database stuff 
    * @param object $db The datase object 
    */ 
    public function __construct ($db) { 
     $this->db = $db; 
     $this->setHandler();  
    } 

    function setHandler() { 

     session_set_save_handler(array(&$this, "open"), 
           array(&$this, "close"), 
           array(&$this, "read"), 
           array(&$this, "write"), 
           array(&$this, "destroy"), 
           array(&$this, "clean") 
           );   
    } 

    /** 
    * Initiate a database object if necessary 
    */ 
    function open() { 
     $this->db->connect(); 
    } 

    /** 
    * Write session id and data to the database 
    * @param string $id The hashed 32 char session id, unique to a user 
    * @param string $data Serialized session array from the unique session 
    * @return id The newly inserted ID of the database 
    */ 
    function write($id, $data) { 
     $access = time(); 
     $dateAdded = date("Y-m-d G:i:s"); 

     $this->db->wrapper->where(array("sessionId"=>$id)); 
     $this->db->query($this->db->wrapper->delete(__CLASS__)); 

     //fopen a file and store this in it that way we can debug 
     $query = $this->db->wrapper->insert(__CLASS__, array("sessionId"=>$id,"dateAdded"=>$dateAdded,"sessionData"=>$data)); 

     $this->db->query($query); 
     return $this->db->insertId(); 
    } 

    /** 
    * Retrieve the session data for a given session id 
    * @param string $id The hashed 32 char session id, unique to a user 
    * @return string The session data found for the given session id 
    */ 
    function read($id) { 
     $id = $this->db->wrapper->escape($id); 
     $row = $this->db->fetch(1, $this->db->wrapper->get_where(__CLASS__,array("sessionId"=>$id)), array(),false); 
     if ($row) { 
      return $row['data'];  
     } 
     return ""; 
    } 

    /** 
    * Delete a session from the database by its unique session id 
    * @param string $id The hashed 32 char session id, unique to a user 
    * @return integer The number of deleted rows - should only ever be 1 
    */ 
    function destroy($id) { 
     $id = $this->db->wrapper->escape($id); 
     $this->db->wrapper->where(array("sessionId"=>$id)); 
     $this->db->query($this->db->wrapper->delete(__CLASS__)); 
     return $this->db->affectedRows(); 
    } 

    /** 
    * Garage collector which deletes old records in the database, delete sessions that have expired. This is 
    * determined by the session.gc_maxlifetime variable in the php.ini 
    * @param integer $max The maximum number of seconds allowed before a session is to be considered expired 
    * @return integer The number of deleted rows 
    */ 
    function clean($max) { 
     $old = time() - $max; 
     $old = $this->db->wrapper->escape($old); 
     $this->db->wrapper->where(array("access"=>$old), "<"); 
     $this->db->query($this->db->wrapper->delete(__CLASS__)); 
     return $this->db->affectedRows(); 

    } 

    /** 
    * Close the database connection once a read/write has been complete 
    */ 
    function close() { 
     $this->db->close(); 
    } 

    /** 
    * End the current session and store session data. 
    */ 
    public function __destruct(){ 
     session_write_close(); 
    }  
} 

Как вы можете видеть в моей код, я передаю объект DB в класс как параметр. Мой загрузочный файл выглядит следующим образом:

$db = mogDB::init(); 
    $sh = new sessionHandler($db); 

    session_start(); 

Я использовал некоторые из моих собственных классов здесь так MogDB: Init() в основном создает соединение с базой данных с правильными учетными данными. Материал оболочки в основном так, поэтому мне не нужно вводить sql-запрос после sql-запроса (я немного ленив, я думаю).

Но проблема я получаю это в моем PHP журнале ошибок:

08-Apr-2010 17:40:31] PHP Warning: mysql_insert_id(): 11 is not a valid MySQL-Link resource in /library/mysql.php on line 69 

Я отлаженный это столько, сколько я могу, и это, кажется, что, когда он пытается записать сессию в БД, то терпит неудачу. Мне удалось сохранить запрос в файл, и он импортирует мелкие данные в базу данных через phpmyadmin, так что это не запрос, который задает проблему.

линии 69 в mysql.php выглядит следующим образом:

68. public function insertId() { 
69.  return mysql_insert_id($this->id); 
70. } 

Любая помощь будет высоко ценится Спасибо

+0

О, дорогой лорд, вы используете MySQL запрос каждый раз, когда вы запрашиваете значение сеанса, и каждый раз, когда вы меняете его? Вау просто вау. – animuson

+0

Пожалуйста, включите содержимое файла /library/mysql.php в строке 69, чтобы мы могли видеть, что там происходит. Это сообщение об ошибке. – Zak

+0

@animuson есть лучший способ? Использование 'session_set_save_handler()' похоже, подразумевает, что он выполняет операцию чтения/записи каждый раз. Единственное отличие состоит в том, что встроенный использует файлы вместо базы данных. –

ответ

1

После включать содержимое файла /library/mysql.php вокруг линии 69 поэтому мы можем видеть, что там происходит, я предполагаю, что небольшая часть вашего кода запрашивает обращение к базе данных обратно для вызова mysql_insert_id, а вместо этого ваш db api возвращает фактический идентификатор insert уже ...

+0

Я добавил строку 68,69 и 70 в mysql.php – phpNutt

+0

Я также получаю эту ошибку до ошибки выше Предупреждение: mysql_query(): 11 не является допустимым ресурсом MySQL-Link в /library/mysql.php в строке 43 – phpNutt

+0

прямо, просто верните $ this-> id ... – Zak

Смежные вопросы