PHP Сохранение сеансов в базе данных. Метод чтения, похоже, не работает

Итак, я пытаюсь хранить сеансы в 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. Вам нужно только настроить его.

  • сохранить сеанс в базе данных CodeIgniter

Кроме того, если вы действительно хотите «остаться с тобой», в коде есть несколько проблем. Их легко заметить, если вы следуете следующим пунктам:

  1. Читайте о каждой функции обратного вызова для обработчика сохранения сеанса. Особенно, какие данные они получают и в каком формате (не делая этого, приводит к по меньшей мере одной ошибке, которая может вызвать поведение, которое вы называете «неработающим»).
  2. Ведение журнала ошибок. Проблема с обработчиком сохранения, которая приводит к предоставлению ошибок, может оставить их невидимыми, потому что вывод в браузер больше невозможен. Это требует, чтобы вы регистрировали ошибки в файле. Это очень важно при устранении неполадок с помощью обработчика сеанса.
  3. Измените код взаимодействия с базой данных. Это позволяет также обеспечить лучшую информацию об ошибках при сбое взаимодействия базы данных (не делая этого, скрывает хотя бы одну ошибку, которая может привести к поведению, которое вы называете «неработающим»).
  4. Удалите код, который не нужен. Я имею в виду, это не нужно. Наличие кода, который не нужен, может включать ошибки, которые приводят к сценарию «не работает», который у вас здесь. Таким образом, вы мешаете себе делать все без причины. Один пример: ini_set("session.save_handler", "user"); – Пока вы не знаете, что вы делаете, не делайте этого. В PHP нет предопределенного savehandler, называемого user , и вы не определяете его.

И это в основном это. Поэтому я мог обнаружить две реальные ошибки, вызвавшие это, другие шаги необходимы, чтобы вы могли решать будущие проблемы:

  1. Убедитесь, что вы всегда связаны с одной и той же базой данных. Например, если вы записываете в таблицу MY_SESSIONS и читаете из таблицы SESSIONS , это никогда не будет работать.
  2. Убедитесь, что данные, возвращаемые PHP, совместимы с данными, которые он ожидает. Например, если вы храните данные Base64, закодированные в базе данных, и возвращаете их обратно в кодировку PHP Base64, PHP-файл ничего не может сделать с этими данными.

Другие потенциальные проблемы, которые не видны из вашего кода:

  1. Схема базы данных, которую вы используете, не подходит для данных, которые вы храните там (вы не указали схему таблицы, поэтому нельзя сказать, вызвало ли это ваши проблемы).
  2. Идентификатор ссылки базы данных может измениться, поскольку сам кодогенератор создает соединение с базой данных. Это может привести к потенциальным побочным эффектам. Явное предоставление идентификатора ссылки для подключения к базе данных помогает для расслабленного сна.
  3. Ошибки в SQL-запросах, которые остались незамеченными, поскольку отсутствует обработка ошибок для частей базы данных.

Пример кода:

 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