custom / DB Session в PHP / MySQL - отображение ERROR на других страницах - PullRequest
0 голосов
/ 13 апреля 2011

я написал этот пользовательский обработчик сеанса!
plz посмотрите [ и посмотрите на текст BOLD ошибки ниже , чтобы помочь мне выяснить, где ошибка]

<?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();
?>

это [выше] my DB_Session.php file

include 'DB_Session.php';
$ _SESSION ['foo'] = "BAR";
$ _SESSION ['bar'] = "FOO";
echo $ _SESSION ['foo'].''. $ _ SESSION ['bar'];

это [наверху] мой session_start.php файл, который отлично работает :)

include 'DB_Session.php';
echo $ _SESSION ['foo']. ''. $ _ SESSION [' bar '];
session_destroy ();
echo $ _SESSION [' foo '].'». $ _ SESSION [ 'бар'];

это [наверху] мой session_finish.php файл, который показывает ошибку :(

, которая выдает эти ошибки, хотя сессия полностью уничтожена!
Примечание: неопределенный индекс: foo в session_finish.php в строке 4
Примечание: неопределенный индекс: бар в session_finish.php в строке 4
Примечание:Неопределенный индекс: foo в session_finish.php в строке 6
Примечание: неопределенный индекс: бар в session_finish.php в строке 6

Структура таблицы

CREATE TABLE, ЕСЛИ НЕ СУЩЕСТВУЕТ sessions (
ID int (11) NOT NULL AUTO_INCREMENT,
SessionID char (26) DEFAULT NULL,
Data текст,
DateTouched int (11) DEFAULT NULL,
PRIMARY KEY (ID)
) ENGINE = InnoDB CHARSET DEFAULT = latin1 AUTO_INCREMENT = 1;

после просмотра session_start.php я могу видеть, как значение сохраняется в базе данных, и после просмотра session_finish.php значение удаляется окончательноточно, но не может показать данные SESSION на другой странице перед уничтожением!

Ответы [ 3 ]

0 голосов
/ 14 апреля 2011

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();

?>

Попробуйте заменить ваш скрипт на этоти дайте мне знать, что там происходит?

0 голосов
/ 14 апреля 2011
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 */
 }
}

ошибка при получении данных при обнаружении сеанса!

0 голосов
/ 13 апреля 2011

где находится файл session_finish.php? но, скорее всего, вы должны определить свою переменную (foo, baz), прежде чем использовать их чтобы убедиться, что переменная определена, это уведомление не появится

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