Я хочу, чтобы хранить все свои сессии в БД и прочитать об этом и реализован следующий класс:Сохранение сессий в БД в 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. }
Любая помощь будет высоко ценится Спасибо
О, дорогой лорд, вы используете MySQL запрос каждый раз, когда вы запрашиваете значение сеанса, и каждый раз, когда вы меняете его? Вау просто вау. – animuson
Пожалуйста, включите содержимое файла /library/mysql.php в строке 69, чтобы мы могли видеть, что там происходит. Это сообщение об ошибке. – Zak
@animuson есть лучший способ? Использование 'session_set_save_handler()' похоже, подразумевает, что он выполняет операцию чтения/записи каждый раз. Единственное отличие состоит в том, что встроенный использует файлы вместо базы данных. –