2011-12-11 54 views
2

可能重複裏面的數據庫連接:
Can't pass mysqli connection in session in php

我想定製的PHP的MySQL類存儲到$ _SESSION。當訪問時,PHP會拋出一個錯誤:「該腳本試圖執行一個方法或訪問一個不完整對象的屬性......」。

include_once 'core/mysql.php'; 

    $conn = new mysql(); 
    $_SESSION['DBCONNECTION'] = new mysql(); 

    $result = $_SESSION['DBCONNECTION']->query_cust($sql); // Fails! 
    $result = $conn->query_cust($sql); // Works! 

我只是搭售,以瞭解如何在PHP中工作會議,是什麼讓定義的類作爲一個正常的變量和內部$_SESSION變量之間的區別!?

var_dump($_SESSION['DBCONNECTION'])回報:

object(__PHP_Incomplete_Class)[1] 
    public '__PHP_Incomplete_Class_Name' => string 'mysql' (length=5) 
    public 'con' => int 0 
+0

您可以使用var_dump($ _ SESSION ['DBCONNECTION'])來查看會話包含的內容。 – zzarbi

+2

除了技術上的困難,你甚至不應該那樣做。它不屬於一個會話。爲什麼每個用戶(= session)都有自己的數據庫連接句柄? – mario

+0

它避開了我爲什麼要在會話中存儲數據庫連接。 – Till

回答

2

存儲在會話中的任何內容都需要可序列化。爲什麼你想要將連接存儲在會話中?這對我沒有意義。只需重新連接每個請求。

6

不能存儲$_SESSION內的ressource手柄。請參閱PHP.net

某些類型的數據無法序列化,因此不會存儲在會話中。它包括資源變量或帶有循環引用的對象(即 將自身引用傳遞給另一個對象的對象)。

由於您的對象包含連接鏈接,因此無法序列化。

0

好了,幾件事情上

  1. 在會話中存儲的連接評論是非常糟糕的主意

  2. 保存session裏面的資源無論如何都不會工作,據我所知

  3. 由於對於內部機制,PHP會將對象存儲在會話中並在隨後的請求中反序列化它。你應該看看__sleep和__wakeup魔術方法

0

當你序列化你的MySQL類,那麼你可以很容易地將對象設置爲$_SESSION.