Php PDO会话的奇怪行为

Php PDO会话的奇怪行为,php,session,pdo,Php,Session,Pdo,我的PDO会话有问题,需要一些调试帮助(顺便说一句,这似乎只发生在IE上) 我有两个文件要测试 index.php和session2.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 );

我的PDO会话有问题,需要一些调试帮助(顺便说一句,这似乎只发生在IE上)

我有两个文件要测试 index.php和session2.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");
?>
在index.php的末尾,我有-->标题(“Location:session2.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时,sessionid是不同的,当然会话数据也不见了

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");
?>
我有一个非常简单的PDOSession类,如下所示

这是日志文件中的调试语句。出于某种原因,当我转到session2.php时,它有一个不同的会话id。(打开/读取和关闭来自PDOSESSION类)

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");
?>
我不确定这些信息是否足以帮助任何人,但我真的被难住了

谢谢你的帮助

[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

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");
?>
<!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会话类

<?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]");
        }
    }
}
?>

问题是IE的iFrame中的第三方cookie

页眉('P3P:CP=“IDC DSP COR ADM DEVi TAIi PSA PSD IVAi IVDi CONi HIS OUR IND CNT”)

解决了这个问题