※ 引述《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