Сессии не сохраняются в MySQL - PullRequest
0 голосов
/ 16 марта 2012

У меня есть файл sess_function.php

В этом файле перечислены различные (6) функции, используемые для управления сеансами.

function _open()
{
    try{
        // Open the database
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
    } //try
    catch(PDOException $e){
        echo "Oops, We're experiencing an error CONNECTING.";
        file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch
}   

## Kill Connection to Mysql (Using PDO) 
function _close(){
$dbh = null;
}

## Read a current session 
function _read($id){
    try{
        // Open the database
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        // Begin Query
        $id = mysql_real_escape_string($id);
        $sth = $dbh->prepare("SELECT data FROM sessions WHERE id = '$id'");
        $sth->execute();

    }
    catch(PDOException $e){
        echo "Oops, We're experiencing an error. READING";
        file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch

    ## return '';
}

## Write to current session 
function _write($id, $data){
    // WRITE Vars
    try{
        // Open the database
##      require_once('dbi.php');
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        // Begin Query
        $access = time();
        $id = mysql_real_escape_string($id);
        $access = mysql_real_escape_string($access);
        $data = mysql_real_escape_string($data);
        $sth = $dbh->prepare("REPLACE INTO sessions VALUES ('$id', '$access', '$data')");
        $sth->execute();
    }
    catch(PDOException $e){
        echo "Oops, We're experiencing an error. REPLACING SESSION VAL";
        file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch

}

## Destroy current session
function _destroy($id){   
    try{
        // Open the database
##      require_once('dbi.php');
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        // Begin Query
        $id = mysql_real_escape_string($id);
        $sth = $dbh->prepare("DELETE FROM sessions WHERE id = '$id'");
        $sth->execute();
    }
    catch(PDOException $e){
        echo "Oops, We're experiencing an error.";
        file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch  
}

## Clean old session data out 
function _clean($max){
    try{
        // Open the database
##      require_once('dbi.php');
        $dbh = new PDO("mysql:host=$host;dbname=$dbname",$user,$pass);
        $dbh->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
        // Begin Query
        $old = time() - $max;
        $old = mysql_real_escape_string($old);
        $sth = $dbh->prepare("DELETE FROM sessions WHERE  access < '$old'");
        $sth->execute();
    }
    catch(PDOException $e){
        echo "Oops, We're experiencing an error. DEL FROM SESSION";
        file_put_contents('PDODBConnectionErrors.txt', $e->getMessage(), FILE_APPEND);  
    } //catch

}

и index.php

////////////////////////////////////////////////////////////////////////////////////
###### Require Database ######                              ////////////////////////
####### DB Config Setting #######
$host ='localhost'; //////////////
$dbname ='mydb';//////////
$user ='root';     //////////////
$pass ='';         //////////////
/////////////////////////////////


                        ////////////////////////
////////////////////////////////////////////////////////////////////////////////////
###### Start session                                        ////////////////////////
session_start();                                            ////////////////////////
###### Call Session Functions Include ######                ////////////////////////            
require_once('src/cfg/sess_function.php');                  ////////////////////////
###### Call function as contained in sess_function() ######                       //
session_set_save_handler('_open','_close','_read','_write','_destroy','_clean');  //                            
////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////

Таблица выглядит так: img1

Проблема в том, что это не доставляет мне проблем, но в таблице sessions ничего не хранится ...

если я ОБЯЗУЕТСЯ session_start(); он выдает следующие предупреждения:

Oops, We're experiencing an error. READING
Warning: session_start() Cannot send session cookie - headers already sent by sess_function.php:33)index.php on line 12

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started sess_function.php:33) in index.php on line 12

Любой ??

Ответы [ 2 ]

1 голос
/ 16 марта 2012

Первое сообщение об ошибке - это то, на что вы должны смотреть. PHP должен отправлять данные заголовка HTTP (cookie), но в sess_function.php уже есть некоторый вывод. Данные заголовка не могут быть отправлены после обычного вывода (скажем, echo). Вы выводите «К сожалению, мы столкнулись с ошибкой. ЧТЕНИЕ», на что жалуется PHP. Удаление всех операторов echo решит проблему сеанса.

Тогда: переменные $dbname, $user, $pass и $host не были установлены. global $dbname, $host, $user, $pass; декларации исправили это.

Наконец: session_set_save_handler должен быть вызван перед session_start, потому что иначе PHP не будет вызывать пользовательские функции. На выходе уже отправлены ошибки, произошедшие из-за того, что ошибки MySQL были вызваны до завершения сеанса session_start (ошибки MySQL произошли во время session_start)

0 голосов
/ 16 марта 2012

Почему прокомментирован ваш session_start ()?Попробуйте включить его

Вы запускаете автоматический сеанс?

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