Хранение сессий в БД на PHP - постоянно получайте ошибку MySQL - PullRequest
0 голосов
/ 03 июня 2010

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

<?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. }

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

1 Ответ

1 голос
/ 03 июня 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...