Вот и снова я. Буду надоедать вам своими вопросами. Снова написал немного кода и опять ошибка. Главное то, что я даже представления не имею, откуда она и как от нее избавится. Сразу скажу что поиском пользовался но внятного ответа не нашел. Может я его не увидел – но искал! Ладно, меньше болтовни перехожу к делу. Код такой: Класс БД PHP: <?php class db { public $conn_id; private $query_id; function connect(){ /*......*/ $this->conn_id = @mysql_connect('host', 'user', 'pass'); mysql_select_db('base'); /*......*/ } function query($query){ /*......*/ $this->query_id = mysql_query($query, $this->conn_id); return $this->query_id; /*......*/ } function fetch_assoc($query_id = "") { if ($query_id == ""){ $query_id = $this->query_id; } return mysql_fetch_array($query_id, MYSQL_ASSOC); } function affected_rows($query_id = ""){ if ($query_id == ""){ $query_id = $this->query_id; } return mysql_affected_rows($query_id); } } $db = new db; $db->connect(); ?> Функции роботы с сессиями PHP: <?php function sess_open($save_path, $session_name) { return true; } function sess_close() { return true; } function sess_read($session_id) { global $db; if ($result = $db->query("SELECT data FROM {prefix}sessions WHERE session_id = '".addslashes($session_id)."' AND life_time > ".time()." LIMIT 1")){ return $db->fetch_assoc($result); } else { return FALSE; } } function sess_write($session_id, $data) { if (!$data || preg_match('~^[A-Za-z0-9]{16,32}$~', $session_id) == 0){ return FALSE; } global $db, $config; $lifetime = time() + $config['sess_lifetime']; $data = mysql_real_escape_string($data); $result = $db->query("UPDATE {prefix}sessions SET data = '".addslashes($data)."', life_time = ".$lifetime." WHERE session_id = '".addslashes($session_id)."' LIMIT 1"); if ($db->affected_rows() == 0) $result = $db->query("INSERT IGNORE INTO {prefix}sessions (session_id, data, life_time) VALUES ('".addslashes($session_id)."', '".addslashes($data)."', ".$lifetime.")"); return $result; } function sess_destroy($session_id) { if (preg_match('~^[A-Za-z0-9]{16,32}$~', $session_id) == 0) return false; global $db; return $db->query("DELETE FROM {prefix}sessions WHERE session_id = '".addslashes($session_id)."' LIMIT 1"); } function sess_gc($session_lifetime) { global $db; return $db->affected_rows($db->query("DELETE FROM {prefix}sessions WHERE life_time < ".time())); } session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc"); session_start(); ?> Значение $config PHP: <?php $config['sess_lifetime'] = '1440'; ?> А вот и ошибка Ошибка отладчика: session.php строка 35 - Call to a member function query() on a non-object Подскажите, что не так и как исправить.
Такие слова! До этого я думал, что хоть что-то понимаю в PHP. Спрошу по другому: как сделать так чтобы заработало.
0. совсем нет обработок ошибок. совсем. плохо. 1. зачем $conn_id public? уж его точно надо прятать от всех. protected. впрочем как и query_id, привем она не _id а resource. 2. mysql_query() в случае неудачи возвращает FALSE, а никак не "" if ($query_id == ""){ читаем внимательно документацию. 3. хорошим тоном делать $db->close(); 3.1 надо зать не addslashes() а mysql_escape_string() 4. Я привык работать с объектами, потому всегда возвращаю mysql_fetch_object();
Файлы вызываются из Index.php. PHP: <?php $config['sess_lifetime'] = '1440'; Include_once (‘db.php’); Include_once(‘sess.php’); ?> Обработка ошибок есть, просто я убрал все что можно, для экономии места. Исправлю Экономил место Кому что удобней Так что я сделал не так? Как мне исправить ситуацию?
я бы в сессию передавал ссылку на $db и работал уже с ней, а не через global а если коннект один то через паттерн db:GetInstance() и вперед
Прошелся отладчиком и вот что получилось PHP: <?php function sess_read роботает нормально делает запрос к базе все ок, а PHP: <?php function sess_write вылитает с ошибкой Код (Text): Call to a member function query() on a non-object Что вогнало меня в еще больший тупик ведь PHP: <?php global $db; обявляется и там и там. Мужики обясните дураку где, а лучше где и как изменить этот код чтобы он нормально роботал.
1. для отладки достаточно обычного print(''); 2. не видя всего кода как сказать-то, тебе дураку, что ты там нахимичил?
все замечательно, только обьект базы данных нужно создать до открытии сессии. PHP: <? global $db; $db = new db; // или как там у вас session_start();
вообщето $db объявляется до старта сессии в файле "Класс БД" Прошелся отладчиком и вот что получилось PHP: <?php function sess_read роботает нормально делает запрос к базе все ок, а после этого запускается PHP: <?php function sess_write и вот здесь вылетает ошибка. тоесть обьект базы данных создан нормально. иначе ошибка появилась после sess_read
значит на момент записи сессии объект базы данных уже уничтожен. Попробуйте самостоятельно закрывать сессию session_write_close
в комментах http://php.net/session_set_save_handler делают так: register_shutdown_function('session_write_close');