Итак, я пытаюсь хранить сеансы в mysql db. Кажется, все идет хорошо, потому что он будет записывать данные в таблицу сеансов и т. Д. Но я просто заметил, что могу записывать данные сеанса, несмотря на то, что мой метод чтения пуст. Итак, если вы посмотрите на код, заключительный оператор эха будет писать «значение» – хотя существует нулевая логика. Есть идеи? Благодаря!
class SessionManagement{ private $_hostname; private $_username; private $_password; private $_database; private $_timeout; public function __construct() { $CI =& get_instance(); $CI->load->database(); $this->_hostname = $CI->db->hostname; $this->_username = $CI->db->username; $this->_password = $CI->db->password; $this->_database = $CI->db->database; $this->_timeout = 60 * 60 * 10; } public function _open() { return TRUE; } public function _close() { return TRUE; } public function _read($id) { mysql_connect($this->_hostname, $this->_username, $this->_password); mysql_select_db($this->_database); $id = mysql_real_escape_string($id); $sql = "SELECT session_data FROM sessions WHERE session_id = '$id'"; if ($result = mysql_query($sql)) { if (mysql_num_rows($result)) { $record = mysql_fetch_assoc($result); return $record['session_data']; } } return ''; } public function _write($id, $data) { mysql_connect($this->_hostname, $this->_username, $this->_password); mysql_select_db($this->_database); $id = mysql_real_escape_string($id); $data = mysql_real_escape_string(base64_encode(serialize(strip_tags($data)))); $access = time() + $this->_timeout; $sql = "REPLACE INTO session (session_id, session_data, session_expires) VALUES('$id','$data', $access)"; return mysql_query($sql); } public function _gc($max) { return TRUE; } public function _destroy($id) { mysql_connect($this->_hostname, $this->_username, $this->_password); mysql_select_db($this->_database); $id = mysql_real_escape_string($id); $sql = "DELETE FROM session WHERE session_id = '$id'"; return mysql_query($sql); } } ini_set("session.save_handler", "user"); session_name("test"); session_set_cookie_params(0, '/', '.test.com'); $s = new SessionManagement(); session_set_save_handler( array($s, '_open'), array($s, '_close'), array($s, '_read'), array($s, '_write'), array($s, '_destroy'), array($s, '_gc') ); session_start(); $_SESSION['test'] = "value"; ECHO $_SESSION['test'];
Вы используете Codeigniter. У него есть функция для хранения сеансов в уже созданной базе данных.
Просто удалите свой код, который не работает, и вместо этого используйте функцию Codeigniter. Вам нужно только настроить его.
Кроме того, если вы действительно хотите «остаться с тобой», в коде есть несколько проблем. Их легко заметить, если вы следуете следующим пунктам:
ini_set("session.save_handler", "user");
– Пока вы не знаете, что вы делаете, не делайте этого. В PHP нет предопределенного savehandler, называемого user
, и вы не определяете его. И это в основном это. Поэтому я мог обнаружить две реальные ошибки, вызвавшие это, другие шаги необходимы, чтобы вы могли решать будущие проблемы:
MY_SESSIONS
и читаете из таблицы SESSIONS
, это никогда не будет работать. Другие потенциальные проблемы, которые не видны из вашего кода:
Пример кода:
ob_start(); session_name("test"); session_set_cookie_params(0, '/', '.test.com'); $s = new SessionManagement(); $s->register(); session_start(); ECHO $_SESSION['test'], "\n"; # value
SessionManagement
класс SessionManagement
:
class SessionManagement { private $_timeout; private $_db; public function __construct() { $CI =& get_instance(); $CI->load->database(); $this->_db = new LegacyMysqlDatabase( $CI->db->hostname, $CI->db->username, $CI->db->password, $CI->db->database ); $this->_timeout = 60 * 60 * 10; } public function _open() { return TRUE; } public function _close() { return TRUE; } public function _read($session_id) { $db = $this->_db; $session_id = $db->escape($session_id); $sql = "SELECT session_data FROM SESSION WHERE session_id = '$session_id'"; if (!($result = $db->query($sql)) || !$result->getNumberOfRows()) { return ''; } $record = $result->fetchAssoc(); return $record['session_data']; } public function _write($session_id, $session_data) { $db = $this->_db; $session_id = $db->escape($session_id); $session_data = $db->escape($session_data); $session_expires = time() + $this->_timeout; $sql = "REPLACE INTO SESSION (session_id, session_data, session_expires) VALUES ('$session_id', '$session_data', $session_expires)"; return (bool)$db->query($sql); // cast to bool because PHP would cast to int } public function _gc($max) { return TRUE; } public function _destroy($id) { $db = $this->_db; $session_id = $db->escape($id); $sql = "DELETE FROM SESSION WHERE session_id = '$id'"; return $db->query($sql); } public function register() { $registered = session_set_save_handler( array($this, '_open'), array($this, '_close'), array($this, '_read'), array($this, '_write'), array($this, '_destroy'), array($this, '_gc') ); if (!$registered) { throw new Exception('Can not register session savehandler.'); } } }
Код взаимодействия с обработкой ошибок:
class LegacyMysqlDatabase { private $_hostname; private $_username; private $_password; private $_database; private $_link; private $_initError = false; public function __construct($hostname, $username, $password, $database) { $this->_hostname = $hostname; $this->_username = $username; $this->_password = $password; $this->_database = $database; } public function query($sql) { $link = $this->getLink(); $result = mysql_query($sql, $link); if ($result === false) { trigger_error(sprintf('Query "%s" failed: #%d: %s', $sql, mysql_errno($link), mysql_error($link))); throw new Exception('Failed to query Mysql database.'); } return new LegacyMysqlResult($result); } public function escape($string) { return mysql_real_escape_string($string, $this->getLink()); } private function getLink() { if ($this->_initError) { throw new Exception('Failed to initialize the database.'); } if ($this->_link === null) { $this->_initError = true; $result = mysql_connect($this->_hostname, $this->_username, $this->_password); if (!$result) { throw new Exception('Can not connect to Mysql database.'); } $this->_link = $result; $selected = mysql_select_db($this->_database, $this->_link); if (!$selected) { trigger_error(sprintf('Can not select Mysql database "%s": #%d: %s', $this->_database, mysql_errno($result), mysql_error($result))); throw new Exception(sprintf('Can not select Mysql database "%"', $this->_database)); } $this->_initError = false; } return $this->_link; } } class LegacyMysqlResult { private $_result; public function __construct($result) { $this->_result = $result; } public function getNumberOfRows() { return mysql_num_rows($this->_result); } public function fetchAssoc() { return mysql_fetch_assoc($this->_result); } }
Фактически обработчик функции _write не выполняется до тех пор, пока выходной поток не будет закрыт.
Таким образом, ваш $_SESSION['test'] = "value";
это просто массив, поэтому он печатает значение,
Подробная информация об этом была ЗДЕСЬ
Я не уверен, что понимаю ваш вопрос. В основном ваш сценарий состоит только из трех строк:
session_start(); $_SESSION['test'] = "value"; ECHO $_SESSION['test'];
Пункт управления сеансом заключается в том, что вам не нужно сохранять значения в базе данных до тех пор, пока сеанс активен (в большинстве браузеров, пока вы не закроете браузер).
Вы создаете сеанс, php отправит cookie сессии в ваш браузер, если cookie будет принят, вы можете вывести $ _SESSION ['test'] на любую страницу, пока активен сеанс.
Изменить: посмотрите http://php.net/manual/de/function.session-start.php