Хранение сессий в БД на PHP - постоянно получайте ошибку MySQL

0

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

<?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 каждый раз, когда запрашиваете значение сеанса, и каждый раз, когда вы меняете его ??? Вау просто вау.
  • 0
    Пожалуйста, включите содержимое файла /library/mysql.php в строку 69, чтобы мы могли видеть, что там происходит. Это ошибка, о которой сообщают.
Показать ещё 1 комментарий
Теги:
database
resources
session

1 ответ

1
Лучший ответ

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

  • 0
    теперь я добавил строки 68,69 и 70 в mysql.php
  • 0
    Я также получаю эту ошибку также до появления ошибки выше. Предупреждение: mysql_query (): 11 не является допустимым ресурсом MySQL-Link в /library/mysql.php в строке 43.
Показать ещё 3 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню