пользовательский сеанс / DB в PHP / MySQL — показывает ОШИБКУ на других страницах

#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, что там происходит?

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

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 */
 }
}
  

ошибка заключалась в повторном вводе данных при обнаружении сеанса!