0

PDOSessions に問題があり、デバッグのヘルプを探しています (ところで、これは IE でのみ発生するようです)。

index.php と session2.php をテストするための 2 つのファイルがあります (以下を参照)。

最後に index.php に ---> header("Location: session2.php"); があります。

ときどきブラウザが session2.php にアクセスすると、セッション ID が異なり、もちろんセッション データがなくなっている状態になります。

私は非常に単純な PDOSession クラスを持っています。以下を参照してください

これは、ログ ファイルからのデバッグ ステートメントです。何らかの理由で session2.php にアクセスすると、セッション ID が異なります。(OPEN/READ と CLOSE は PDOSESSION クラスからのものです)

これが誰かを助けるのに十分な情報であるかどうかはわかりませんが、私は本当に困惑しています..

助けてくれてありがとう

[PDOSession] index.php OPEN 
[PDOSession] index.php READ id=vpodh6fornta10mg2lqkns2qb1
[11.20.12 8:33:09][session1]
[11.20.12 8:33:09][session1]->just before forwarding to session2.php
[11.20.12 8:33:09][session1][vpodh6fornta10mg2lqkns2qb1] Array
(
[TstpageID] => 1
)

[PDOSession] index.php WRITE id=vpodh6fornta10mg2lqkns2qb1
[PDOSession] index.php CLOSE 
[PDOSession] session2.php OPEN 
[PDOSession] session2.php READ id=f7s4u3bc1hbo0s0dj3s9o8g1u7
[11.20.12 8:33:09][session2]
[11.20.12 8:33:09][session2][f7s4u3bc1hbo0s0dj3s9o8g1u7] Array
(
)

[PDOSession] session2.php WRITE id=f7s4u3bc1hbo0s0dj3s9o8g1u7
[PDOSession] session2.php CLOSE 

これはindex.phpです

require 'functions.php';
$link = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASSWD);
$link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

PDOSession::init($link);    
errorLog("[session1]\n");

$pageID = 1 ;

$_SESSION['TstpageID'] = $pageID;
errorLog("[session1]->just before forwarding to session2.php\n");
errorLog("[session1][".session_id()."] ".print_r($_SESSION,true)."\n");
header("Location: session2.php");
?>

これはsession2.phpです

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<?php
set_include_path('/home/unitnetfb/html/inc');

$noFACEBOOK_INIT = 1;
require 'functions.php';
$link = new PDO("mysql:host=".DB_HOST.";dbname=".DB_NAME, DB_USER, DB_PASSWD);
$link->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

PDOSession::init($link);    

errorLog("[session2]\n");

errorLog("[session2][".session_id()."] ".print_r($_SESSION,true)."\n");
?>

これは PDO SESSION クラスです

<?php
abstract class PDOSession
{
    private static $db;
    private static $oldData;
    public static function init(PDO $db){
            self::$db = $db;
            session_set_save_handler('PDOSession::open', 'PDOSession::close',
                                     'PDOSession::read', 'PDOSession::write',
                                     'PDOSession::destroy', 'PDOSession::garbageCollect');
            session_start();
    }
    public static function open($save_path, $session_name){
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." OPEN \n" , 3, "/tmp/phperror.log");
            return true;
    }
    public static function close(){
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." CLOSE \n" , 3, "/tmp/phperror.log");
            return true;
    }
    public static function read($id){
        try{
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." READ id=".$id."\n" , 3, "/tmp/phperror.log");
            $query = self::$db->prepare('
                    SELECT data
                    FROM sessions
                    WHERE id = :id');
            $query->execute(array(':id' => $id));
            return $query->fetchColumn();

        }catch(Exception $e){
            die("A hardware failure has cause a loss of connection to our databases.  We apologize for the inconvenience. [read]");
        }
    }
    public static function write($id, $data){
        try{
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." WRITE id=".$id."\n" , 3, "/tmp/phperror.log");
             $t = time();
            $stmt = self::$db->prepare("REPLACE INTO
            `sessions`
            VALUES (:id, :accessTime, :data)");
            return $stmt->execute(array(':id' => $id, ':accessTime' => $t, ':data' => $data));
        }catch(Exception $e){
            die("A hardware failure has cause a loss of connection to our databases.  We apologize for the inconvenience. [write]");
        }
    }
    public static function destroy($id){
        try{
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." DESTROY id=".$id."\n" , 3, "/tmp/phperror.log");
            self::$db
                    ->prepare('
                            DELETE FROM sessions
                            WHERE id = :id')
                    ->execute(array(':id' => $id));

        }catch(Exception $e){
            die("A hardware failure has cause a loss of connection to our databases.  We apologize for the inconvenience. [destroy]");
        }
    }
    public static function garbageCollect($lifetime){
        try{
            error_log("[PDOSession] ".$_SERVER["SCRIPT_NAME"]." GARBAGECollect\n" , 3, "/tmp/phperror.log");
            $t = time();
            self::$db
                    ->prepare('
                            DELETE FROM sessions
                            WHERE accessTime < :min_time')
                    ->execute(array(':min_time' => $t - $lifetime));
            errorLog("[".date("m.d.y G:i:s")."][garbageCollect]"." lifetime=$lifetime accessTime < ".$t - $lifetime );
        }catch(Exception $e){
            errorLog("[".date("m.d.y G:i:s")."][garbageCollect]"." Exception -->".$e->getMessage(),$e);
            die("A hardware failure has cause a loss of connection to our databases.  We apologize for the inconvenience. [gc]");
        }
    }
}
?>
4

1 に答える 1