看板 PHP 關於我們 聯絡資訊
※ 引述《foxzgerald (Algorithms)》之銘言: : ※ 引述《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 :) 剛剛努力下我發現了解決辦法.... 你那方法 我用了雖然dump出來是一樣的 可是執行還是會出現問題 不知道為什麼我就是因為這樣找了超久 所以我使用了 function __sleep(){ return array( 序列化要傳遞的屬性 ) } function __wakeup(){ $this->conncet(); } function conncet(){ $this->db = new mysqli( ); } 反序列化後 資料庫相關指令又可以用了 不然一值說沒有這指令的錯誤.. ------------------------------------------ 不過現在又出現個問題 類別中我有個 var $id = array()屬性 function save($a){ ................... array_push($this->id,$a); } 執行N次method 陣列就是N個 不過在相同頁面下測試使用 session_start() 進行序列 反序列傳遞之後print_r() 陣列數是正確的....可是在不同頁面傳遞間 執行N次 save method 陣列怎樣都是只有一筆 在 __sleep 有設定序列 $id 又想破頭了~"~ 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 61.62.124.117
foxzgerald :奇怪..我可以ㄝ = ="(而且沒用 sleep和 wakeup也行@@ 11/23 23:32
showsky :是喔 好奇怪><" 11/23 23:44