Устранение неполадок в пользовательском обработчике сеанса, поддерживаемом базой данных - значения не сохраняются между загрузками страниц - PullRequest
0 голосов
/ 03 июня 2011

Я пытаюсь заставить мои пользовательские сеансы работать, но мои переменные не сохраняются от страницы к странице. Если я удаляю требуемую строку и заменяю ее на session_start (); это работает отлично. Все эти файлы находятся в одном каталоге, и в моем файле php.ini для меня установлен параметр session.save_handler.

первая HTML-страница

<?php 
require("sessionSetup.php");

$_SESSION['test'] = "session test";
session_regenerate_id();

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>sessions test</title>
<script type="text/javascript">
<!--
alert("Test: <?php echo $_SESSION['test'];?>");

//-->
</script>
</head>
<body>
    <a href="session2.php">Click here to go to session2.</a>
</body>
</html>

вторая HTML-страница

<?php
require("sessionSetup.php");
//session_start();  

?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    <title>sessions test</title>
<script type="text/javascript">
<!--
alert("Test: <?php echo $_SESSION['test'];?>");

//-->
</script>
</head>
<body>
    <a href="session.php">Click here to go to session.</a>
</body>
</html>

sessionSetup.PHP

<?php
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');
session_start();


function _open(){
global $_sess_db;
if($_sess_db = mysql_connect(host,user,password)){
    return mysql_select_db(db, $_sess_db)or die("cannot select DB");
}
return false;   
} 
function _close(){
global $_sess_db;
return mysql_close($_sess_db);
}
function _read($id){
global $_sess_db; 
$id = mysql_real_escape_string($id); 
$sql = "SELECT data FROM session WHERE id = '$id'";
if ($result = mysql_query($sql, $_sess_db)) {
    if (mysql_num_rows($result)) {
        $record = mysql_fetch_assoc($result); 
        return $record['data'];
    }
} 
return '';
}
function _write($id, $data){
global $_sess_db; 
$access = time(); 
$id = mysql_real_escape_string($id);
$access = mysql_real_escape_string($access);
$data = mysql_real_escape_string($data); 
$sql = "REPLACE INTO session VALUES ('$id', '$access', '$data')"; 
return mysql_query($sql, $_sess_db);
}
function _destroy($id){
global $_sess_db; 
$id = mysql_real_escape_string($id); 
$sql = "DELETE FROM session WHERE id = '$id'"; 
return mysql_query($sql, $_sess_db);
}
function _clean($max){
global $_sess_db; 
$old = time() - $max;
$old = mysql_real_escape_string($old); 
$sql = "DELETE FROM session WHERE access < '$old'"; 
return mysql_query($sql, $_sess_db);
}

?>

Я заменил здесь данные для входа в базу данных фиктивной информацией. Также, когда я проверяю с помощью phpadmin, в моих сеансах нет информации. Все, что я получаю на второй странице HTML, является нулевым значением. Я работал над этим некоторое время и не добился прогресса. Буду признателен за любую помощь, которую я смогу получить.

Ответы [ 2 ]

0 голосов
/ 03 июня 2011

Как подчеркивалось на странице руководства php в session_start () it MUST , прежде чем что-либо выводится в браузерСкорее всего, в вашем требуемом файле (sessionSetup.php) есть пара пустых битов в начале или конце, которые не интерпретируются как php и, следовательно, выводятся в баузер.Чтобы это исправить, просто поставьте session_start перед require("sessionSetup.php"); (также не забудьте удалить session_start из файла установки сеанса, как только вы это сделаете).ИЛИ вы можете создать выходной буфер .

0 голосов
/ 03 июня 2011

Код выглядит нормально.

Убедитесь, что таблица базы данных, используемая для хранения данных сеанса, настроена правильно, поскольку функции обработчика сеанса, похоже, не проверяют ошибки.

Наиболее вероятная причина того, что ваши сеансы не работаютстолбец id или data таблицы сеанса недостаточно велик, чтобы вместить полную информацию.Доступ должен быть int, попробуйте разные размеры varchar для идентификатора и данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...