Устранение неполадок пользовательского обработчика сеанса с поддержкой базы данных — значения не сохраняются между загрузками страницы

#php #session

#php #сеанс

Вопрос:

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

первая 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-странице, — это нулевое значение. Я работал над этим некоторое время и не добился никакого прогресса. Я был бы признателен за любую помощь, которую я мог бы получить.

Комментарии:

1. Отладка — это повседневная работа каждого разработчика. Так что просто сделайте это.

2. Я раньше не использовал сеансы custon и думаю, что проблема заключается в чем-то, чего я не понимаю, в отличие от чего-то неправильного в коде.

3. @user052211: в вашем вопросе говорится о другом. Напишите небольшой, например, рабочий пользовательский обработчик сеансов, без html, «все в одном файле», без базы данных (на основе файлов, так как это проще) и обновите его для использования DB шаг за шагом после. И сразу после этого переместите это в свой код.

4. файл сеансов PHP — это тот, который я получил из онлайн-учебника. это было моей отправной точкой. Я пытался заставить его работать в течение последних 3 дней. Это не моя работа, я создаю веб-страницу для бизнеса моей жены.

5. @user052211: поэтому вернитесь к рабочему коду и небольшими шагами измените его на использование DB.

Ответ №1:

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

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

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

Комментарии:

1. Оказывается, у меня было дополнительное поле в моей базе данных, и мой код игнорировал его. Как только я добавил » » в свою инструкцию replace, это сработало нормально. В итоге я удалил ненужное поле и удалил,» «. Я написал небольшой php-файл, который просто пытался вставить что-то в базу данных, и однажды я понял, что это не работает, это было легко выяснить оттуда.

Ответ №2:

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