#php #mysql #session
#php #mysql #сеанс
Вопрос:
я написал этот пользовательский обработчик сеанса!
пожалуйста, взгляните [и посмотрите на выделенный ЖИРНЫМ шрифтом текст ошибки ниже, чтобы помочь мне выяснить, где ошибка]
<?php
function sess_open($sess_path, $sess_name) {
return true;
}
function sess_close() {
return true;
}
function sess_read($sess_id)
{
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"SELECT Data FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$sess_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $data);
mysqli_stmt_fetch($stmt);
if (is_null($data))
{
$CurrentTime = time();
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"INSERT INTO sessions (SessionID, DateTouched) VALUES (?,?)");
mysqli_stmt_bind_param($stmt,"ss",$sess_id,$CurrentTime);
mysqli_stmt_execute($stmt);
return '';
}
else
{
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"ss",$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return $sess_id;
}
}
function sess_write($sess_id, $data)
{
$con = mysqli_connect("localhost", "root", "","database");
$CurrentTime = time();
$stmt = mysqli_prepare($con,"UPDATE sessions SET Data = ?,DateTouched=? WHERE SessionID=?");
mysqli_stmt_bind_param($stmt,"sss",$data,$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return true;
}
function sess_destroy($sess_id)
{
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"DELETE FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$sess_id);
mysqli_stmt_execute($stmt);
return true;
}
function sess_gc($sess_maxlifetime)
{
$CurrentTime = time();
mysqli_query($con,"DELETE FROM sessions WHERE DateTouched $sess_maxlifetime < $CurrentTime;");
return true;
}
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_start();
?>
это [вверху] мойDB_Session.php файл
включить ‘DB_Session.php ‘;
$_SESSION[‘foo’] = «BAR»;
$_SESSION[‘bar’] = «FOO»;
echo $_SESSION[‘foo’]. ‘ ‘.$_SESSION[‘bar’];
это [вверху] мойsession_start.php файл, который отлично работает 🙂
включить ‘DB_Session.php ‘;
echo $ _SESSION[‘foo’].’ ‘.$_SESSION[‘bar’];
session_destroy();
echo $_SESSION[‘foo’].’ ‘.$_SESSION[‘bar’];
это [вверху] мойsession_finish.php файл, который показывает ошибку: (
который выдает эти ошибки, хотя сеанс полностью уничтожен!
Обратите внимание: Неопределенный индекс: foo в session_finish.php в строке 4
Обратите внимание: неопределенный индекс: строка в session_finish.php в строке 4
Обратите внимание: Неопределенный индекс: foo в session_finish.php в строке 6
Обратите внимание: Неопределенный индекс: строка в session_finish.php в строке 6
Структура таблицы
СОЗДАЙТЕ ТАБЛИЦУ, ЕСЛИ ОНА НЕ СУЩЕСТВУЕТ
sessions
(
ID
int (11) NOT NULL АВТО_ИНКРЕМЕНТ,
SessionID
char (26) ЗНАЧЕНИЕ ПО УМОЛЧАНИЮ NULL,
Data
текст,
DateTouched
int (11) ЗНАЧЕНИЕ по УМОЛЧАНИЮ NULL,
ПЕРВИЧНЫЙ КЛЮЧ (ID
)
) ENGINE= КОДИРОВКА InnoDB ПО УМОЛЧАНИЮ = latin1 AUTO_INCREMENT = 1 ;
после просмотра session_start.php я вижу, что значение сохраняется в базе данных и после просмотра session_finish.php значения удаляются идеально, но не могут отображать данные СЕАНСА на другой странице перед уничтожением!
Комментарии:
1. пожалуйста, улучшите этот скрипт или дайте любое предложение, чтобы сделать его лучше!
2. больше подходит для codereview.stackexchange.com
3. @Col. Shrapnel Stackoverflow получил больше пользователей по качеству и количеству, я думаю, чем codereview.stackexchange! Так что, пожалуйста, не закрывайте это! В codereview.stackexchange отсутствует множество тегов : (
4. @Wh1T3h4Ck5 теперь смотрите это снова!
5. @Sourav, да, так лучше. Мой голос остается 😉
Ответ №1:
где session_finish.php файл? но, скорее всего, вы должны определить свою переменную (foo, baz ) перед их использованием, чтобы убедиться, что переменная определена, поэтому это уведомление не появится
Комментарии:
1. @hish Посмотрите на выделенные строки, я выделил имя файла жирным шрифтом
2. @hish Я уже определил сеанс в session_start, а затем я просмотрел session_finish и получил эти ошибки
3. в сеансе нет переменной (foo, baz)
4. @hish, нет, есть. проверьте «это [вверху] мой session_start.php файл, который отлично работает :)»
5. вы уверены, что файл session_start.php выполнить перед файлом session_finish.php
Ответ №2:
DB_Session.php проблема! Определенно.
Когда я удаляю строку с помощью пользовательского обработчика session_set_save_handler(...)
, это работает, но с этой строкой это не так. Итак, проблема в ваших функциях, но я все еще не могу найти, где?
DB_Session.php
<?php
function sess_open($save_path, $session_name) {
// my code
global $sess_save_path;
$sess_save_path = $save_path;
return true;
}
function sess_close() {
return true;
}
function sess_read($sess_id) {
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"SELECT Data FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$sess_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $data);
mysqli_stmt_fetch($stmt);
if (is_null($data)) {
$CurrentTime = time();
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"INSERT INTO sessions (SessionID, DateTouched) VALUES (?,?)");
mysqli_stmt_bind_param($stmt,"ss",$sess_id,$CurrentTime);
mysqli_stmt_execute($stmt);
}
else {
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"ss",$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
}
// my code
global $sess_save_path;
$sess_file = "$sess_save_path/sess_" . $sess_id;
return (string) @file_get_contents($sess_file);
}
function sess_write($sess_id, $data) {
$con = mysqli_connect("localhost", "root", "","database");
$CurrentTime = time();
$stmt = mysqli_prepare($con,"UPDATE sessions SET Data = ?,DateTouched=? WHERE SessionID=?");
mysqli_stmt_bind_param($stmt,"sss",$data,$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
// my code
global $sess_save_path;
$sess_file = "$sess_save_path/sess_" . $sess_id;
if ($fp = @fopen($sess_file, "w")) {
$return = fwrite($fp, $data);
fclose($fp);
return $return;
}
else return false;
}
function sess_destroy($sess_id) {
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"DELETE FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$sess_id);
mysqli_stmt_execute($stmt);
// my code
global $sess_save_path;
$sess_file = "$sess_save_path/sess_" . $sess_id;
return(@unlink($sess_file));
}
function sess_gc($sess_maxlifetime) {
$CurrentTime = time();
mysqli_query($con,"DELETE FROM sessions WHERE DateTouched $sess_maxlifetime < $CurrentTime;");
// my code
global $sess_save_path;
foreach (glob("$sess_save_path/sess_*") as $filename) {
if (filemtime($filename) $sess_maxlifetime < time()) {
@unlink($filename);
}
}
return true;
}
session_set_save_handler("sess_open", "sess_close", "sess_read", "sess_write", "sess_destroy", "sess_gc");
session_start();
?>
Попробуйте заменить свой скрипт на этот и сообщите mi, что там происходит?
- Живая демонстрация для session_start.php
- Живая демонстрация для session_finish.php
- Ссылка для скачивания всех 3 скриптов (session.zip ).
Комментарии:
1. @Sourav, как вы вызываете session_start.php и session_finish.php ? Напрямую или из include где-нибудь?
2. @Wh1T3h4Ck5 напрямую ! я просто проверяю, работает это или нет!
3. @Sourav, посмотри внизу моего ответа.
4. db_session должен прекратить работу, если вы удалите session_set_save_handler(…) 🙁
5. @Sourav, да, я знаю .. но я удалил код, связанный с базой данных, в целях тестирования. Тем не менее, я думаю, что это связано с передачей глобальных данных через ваши функции, и теперь я пытаюсь найти причину этого раздражающего уведомления.
Ответ №3:
function sess_read($sess_id)
{
$con = mysqli_connect("localhost", "root", "","database");
$stmt = mysqli_prepare($con,"SELECT Data FROM sessions WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"s",$sess_id);
mysqli_stmt_execute($stmt);
mysqli_stmt_bind_result($stmt, $data);
mysqli_stmt_fetch($stmt);
if (is_null($data))
{
$CurrentTime = time();
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"INSERT INTO sessions (SessionID, DateTouched) VALUES (?,?)");
mysqli_stmt_bind_param($stmt,"ss",$sess_id,$CurrentTime);
mysqli_stmt_execute($stmt);
return '';
}
else
{
mysqli_stmt_close($stmt);
$stmt = mysqli_prepare($con,"UPDATE sessions SET DateTouched = ? WHERE SessionID = ?");
mysqli_stmt_bind_param($stmt,"ss",$CurrentTime,$sess_id);
mysqli_stmt_execute($stmt);
return $data; /* $sess_id; THIS WAS CREATING PROBLEM :X */
}
}
ошибка заключалась в повторном вводе данных при обнаружении сеанса!