Проблема хранения сессий в БД

drklord

Новичок
Проблема хранения сессий в БД

Написал для себя класс, позволяющий хранить сессии в базе данных, все работало отлично, однако после перехода на 5 версию PHP начались приколы. Сперва класс потерял доступ к внешнему классу мускла, который я подсовывал через global и мне пришлось дублировать весь класс во внутреннюю переменную ($this->mysql = $mysql;), после чего проблема решилась, но возникла другая в ф-и write: когда делается запись в базу, то поле value получается пустым, при проверке я выяснил что значение $val не пустое и запрос получается верным, я даже выполнял такой запрос через phpMyAdmin, там все сработало без проблем, уже все перепробовал, идеи кончились, может кто сталкивался?

Ниже привожу код класса, заранее благодарен за любые советы!

PHP:
class sessions {

	var $mysql;
	var $lifetime;
	var $table;
	var $sid;
	var $ip;
	var $location;
	var $modifed;

	function sessions() {

		global $cfg, $mysql;

		$this->mysql = $mysql;

        $this->table = "{$cfg['mysql']['pref']}sessions";

        $this->lifetime = get_cfg_var('session.gc_maxlifetime');
        $this->ip       = isset($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:'0.0.0.0';
        $this->location = isset($_SERVER['REQUEST_URI'])?$_SERVER['REQUEST_URI']:''; 

        session_set_save_handler(
            array(&$this, 'open'),
            array(get_class($this), 'close'),
            array(&$this, 'read'),
            array(&$this, 'write'),
            array(&$this, 'destroy'),
            array(&$this, 'clear')
        ) or die("Failed to register session handler");

	}

	function open($save_path,$session_name) {

        return true;

	}

	function close() {

        return true;

	}

	function read($id) {

        $id = mysql_real_escape_string($id);

        $request = $this->mysql->query("SELECT uid,ip,location,value,modifed FROM $this->table WHERE uid = '$id' LIMIT 0,1");

        if(mysql_num_rows($request)<1) return false;

        $a = mysql_fetch_array($request,MYSQL_ASSOC);

        $expTime = time() - $this->lifetime;

        if($a['modifed'] < $expTime) {

        	$this->destroy($id);

        	return false;

        }

        $this->modifed = $a['modifed'];

        return $a['value'];

	}

	function write($id,$val) {

        $id  = mysql_real_escape_string($id);
        $val = mysql_real_escape_string($val);

        $this->mysql->query("REPLACE INTO $this->table (uid,ip,location,value) "
                           ."VALUES ('$id','$this->ip','$this->location','$val')");

        return true;

	}

	function destroy($id) {

        $id = mysql_real_escape_string($id);

        return $this->mysql->query("DELETE FROM $this->table WHERE uid = '$id'");

	}

	function clear($lifetime) {

        $etime = time() - $lifetime;
        return $mysql->query("DELETE FROM $this->table WHERE modifed < $etime",true);

	}

}
 

Mr_Max

Первый класс. Зимние каникулы ^_^
Команда форума

drklord

Новичок
Сделал так
PHP:
$q = "REPLACE INTO $this->table (uid,ip,location,value) "
                           ."VALUES ('$id','$this->ip','$this->location','$val')";

        print_r($q);

        $this->mysql->query($q);
Запрос вывелся: REPLACE INTO nse_sessions (uid,ip,location,value) VALUES ('opfb8kqhdgj2h501tr426449u6','89.191.241.238','/orders','digits|i:376086;')

В базу записалось все кроме поле value, оно пустое. Так же пробовал $this->mysql->query($q); заменять на mysql_query($q); - результат такой же
 

Farsh

~ on ~ high ~ wave ~
drklord
А теперь теже самые значения вставь вручную , и ты заметишь , что появился ворнинг . В котором будет написано , что 'data trancated' для столбца value.
 

drklord

Новичок
Я выполнял этот запрос через phpMyAdmin и никаких ворнингов не было, а все данные были добавлены в таблицу.

Я так понимаю что "Data truncated" возникает при проблемах с наборами символов. У меня же таких проблем нет, все работает в кодировке utf8
 
Сверху