看板 PHP 關於我們 聯絡資訊
※ 引述《showsky (不是我的天空)》之銘言: : 找了很多文章都沒寫到 : 自己也實作了,可是出了點問題,想在這邊問問 : 就是我在 A 頁面生成了物件 用 : $_SESSION['dbase'] = serialize($class); : 之後再B頁面 : $class = unserialize($_SESSION['dbase']); : 然後可以進行物件的 var 取值這沒問題 普通的method 沒問題 : 問題在於我的 : $class 物件 有一個 : $this->db = new mysqli() : 來做 $this->db->query() : 沒做傳遞下測試都正常 : 可以用了SESSION傳遞就出問題了 : 錯誤代碼 : Warning: mysqli::query() [function.query]: Couldn't fetch mysqli in : XXXXXXXXXXXXXX on line 48 : 這是為什麼@@ 不解 : 還是說我方法使用錯誤了 : 謝謝 我剛用以下的程式碼試了一下: # FILE 1.php ------------------------------------------------- <?php session_start(); class DBConnector { function _construct() { $this->db = new mysqli("localhost", "root", "0000", "test"); } } $db =& new DBConnector(); var_dump($db); $_SESSION['obj'] = serialize($db); ?> <a href="2.php">2</a> --------------------------------------------------- # FILE 2.php --------------------------------------------------- <?php session_start(); var_dump(unserialize($_SESSION['obj'])); ?> --------------------------------------------------- 發現一個很有趣的現象: 1.php dump 出來的是: object(DBConnector)#1 (0) { } 2.php dump 出來的則是: object(__PHP_Incomplete_Class)#1 (1) { ["__PHP_Incomplete_Class_Name"]=> string(11) "DBConnector" } 雖然 2.php unserialize SESSION 傳遞過來的物件,但很明顯的物件的本質改變了: 由原本的 DBConnector 變成了 __PHP_Incomplete_Class_Name 自然會有問題。 然後我 google 了一下 __PHP_Incomplete_Class_Name, 發現了以下的資訊(來源: http://tinyurl.com/6njskr ) When an object is unserialized and its class definition doesn't exist it becomes an instance of "__PHP_Incomplete_Class". 簡單的說..是因為類別的定義(本例中為 class DBConnector)在 2.php 不存在 所以 unserialize 時會發生異常. 解決的方法很簡單. 那便是在 1.php 和 2.php 中分別 include 類別的定義 如此便能正確 unserialize ,例如: <?php // 1.php session_start(); include 'class.DBConnector.php'; $db =& new DBConnector(); var_dump($db); $_SESSION['obj'] = serialize($db); ?> <?php // 2.php session_start(); include 'class.DBConnector.php'; var_dump(unserialize($_SESSION['obj'])); ?> <?php // class.DBConnector.php class DBConnector { public function __construct(){$this->db =& new mysqli(); } } ?> 這樣 dump 出來的東西都是正常的.. 您可以試試看能不能 work :) -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.223.228.207