Здравствуйте, господа. Столкнулся с проблемой, уже 2 дня сижу, туплю, ничего не могу понять. Не записываются в базу, хоть головой бейся =) Однозначно накосячил, но не могу понять где. Может свежим взглядом, поможете? [sql]CREATE TABLE IF NOT EXISTS `sessions` ( `id` varchar(32) NOT NULL, `timestamp` int(10) unsigned DEFAULT NULL, `sess_data` text, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8;[/sql] и функции PHP: <?php function custom_open() { global $link; if ($link = mysqli_connect (_DB_HOST_, _DB_USER_, _DB_PASS_, _DB_NAME_)) { return $link; } else return (false); } ################################################################################ function custom_close() { global $link; return mysqli_close($link); } ################################################################################ function custom_read($id) { global $link; $id = mysqli_real_escape_string($link, $id); $sql = "SELECT sess_data FROM sessions WHERE id = '$id'"; if ($result = mysqli_query($link, $sql)) { $row = mysqli_fetch_assoc($result); return (string) $row['sess_data']; mysqli_free_result($result); } } ################################################################################ function custom_write($id, $sess_data) { global $link; $timestamp = time (); $id = mysqli_real_escape_string($link, $id); $sess_data = mysqli_real_escape_string($link, $sess_data); $sql = "REPLACE INTO sessions VALUES ('$id', '$timestamp', '$sess_data')"; if ($result = mysqli_query($link, $sql)) { return $result; mysqli_free_result($result); } else return (false); } ################################################################################ function custom_destroy($id) { global $link; $id = mysqli_real_escape_string($link, $id); $sql = "DELETE FROM sessions WHERE id = '$id'"; if ($result = mysqli_query($link, $sql)) { return $result; mysqli_free_result($result); } else return (false); } ################################################################################ function custom_gc($maxlifetime) { global $link; $sql = "DELETE FROM sessions WHERE timestamp < '".time() - $maxlifetime."'"; if ($result = mysqli_query($link, $sql)) { return $result; mysqli_free_result($result); } else return (false); } ################################################################################ session_set_save_handler ( 'custom_open', 'custom_close', 'custom_read', 'custom_write', 'custom_destroy', 'custom_gc'); ?> Вот почему-то custom_read() работает, а вот custom_write() уже нет... Может тут какая то хитрость ext mysqli? Сначала набросал в ОО интерфейсе - не работает, потом вот таким видом сделал - не работает, часа 4 назад, уже из принципа накидал черновичек с использованием ext mysql ... всё работает и читает и пишет (дальше не рассматривал). Ну вот что может быть? =))
Прошу прощения Код (Text): Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 301 Warning: mysqli_real_escape_string() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 303 Warning: mysqli_query() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 308 Warning: mysqli_close() expects parameter 1 to be mysqli, null given in X:\home\www\loyz.hm\httpdocs\scr\session.php on line 259 У меня другая нумерация, но эти ошибки как раз из custom_write() Вот почему-то нет соединения... хотя я так полагаю, что должно быть =) Эхх =)) Уже пытался изменять запрос [sql]REPLACE INTO sessions VALUES ('$id', '$timestamp', '$sess_data')[/sql] на 2, то - бишь, либо INSERT, либо UPDATE. Безполезно
custom_read() и custom_write() работают на одной странице? Очень похоже что забыли стартовать сессию или подключить объявление констант.
константы объявлены в самом начале страницы, потом include() вот этот файлик, а потом стартую сессии... вернее после include() сразу session_name ('sid'); session_start ();
причём вот в таком виде заботает PHP: function custom_open() { global $link; $link = mysql_connect( _DB_HOST_, _DB_USER_, _DB_PASS_); return mysql_select_db(_DB_NAME_, $link); } //////////////////////////// function custom_close() { global $link; return mysql_close($link); } //////////////////////// function custom_read($id) { global $link; global $px; global $sesstable; $id = mysql_real_escape_string($id); $sql = "SELECT sess_data FROM ".$px.$sesstable." WHERE id = '$id'"; if ($result = mysql_query($sql, $link)) { $row = mysql_fetch_assoc($result); return $row['sess_data']; } } /////////////////////// function custom_write($id, $sess_data) { global $link; global $px; global $sesstable; $id = mysql_real_escape_string($id); $timestamp = mysql_real_escape_string($timestamp); $sess_data = mysql_real_escape_string($sess_data); $sql = "REPLACE INTO ".$px.$sesstable." VALUES ('$id','".time()."','$sess_data')"; return mysql_query($sql, $link); }
Вызывается с помощью include() Код (Text): <? //самое начало страницы //подключение конффигурации include ($_SERVER['DOCUMENT_ROOT'].'/config/config.inc.php'); //подключение представленного файла include ($_SERVER["DOCUMENT_ROOT"].'/scr/session.php'); session_name ('sid'); session_start ();
говорят, mysql_connect возвращает указатель на соединение с БД, а mysqli_connect — объект, И ещё говорят, что global для ресурса и объекта это разные вещи. Хотя, говорят много чего
Точно... Object of class mysqli could not be converted to int эта ошибка вылетает на session_start() всё понял, но как же мне сейчас в функцию ввести объект... но это риторика, Всем большое спасибо
Привет, Ребята! Не думал, что апнуть тему придется =) 3 года, как даже не открывал редактор, и вот на днях поставил nginx, php-fpm mariadb и начались головняки. Лежал начатый макет страницы, уже с работающими фишками (точно помню, что они работали), среди которых сохранение сессий в DB. Запустил, блин и на те, по какой то непонятной причине php7 не хочет обработать класс записи в базу. PHP: public static function _start_($name,$random_string) { self::$random_string = $random_string; self::$maxLifeTime = intval(get_cfg_var('session.gc_maxlifetime')); self::$user_agent = md5($_SERVER['HTTP_USER_AGENT'].self::$random_string); session_set_save_handler( array('session','_open_'), array('session','_close_'), array('session','_read_'), array('session','_write_'), array('session','_destroy_'), array('session','_gc_') ); session_name($name); session_start(); } не хочет срабатывать session_set_save_handler(). Выдает мне Код (Text): Fatal error: session_start(): Failed to initialize storage module: user (path: /srv/www/tamburin/sess) in /srv/www/tambur.in/htdocs/classes/class.session.inc on line 38 Может подскажете, хоть в какую сторону смотреть. Голова уже не варит =)))