2016-07-10 41 views
0

所以我寫這篇文章的網站,需要我做User類,我需要獲取從DB一些數據,但是當我嘗試$this->conn = new PDO(....)它拋出我的致命錯誤如下如何在PHP類中使用連接到數據庫?

Fatal error: Uncaught exception 'PDOException' with message 'You cannot serialize or unserialize PDO instances' in [no active file]:0 Stack trace: #0 [internal function]: PDO->__sleep() #1 {main} thrown in [no active file] on line 0

類用戶:

private $idu = -1; 
private $display_name = ""; 
private $permissions = []; 
private $conn = ""; 

/** 
* User constructor. 
*/ 

function __construct($idu) 
{ 
    $this->conn = new PDO("mysql:host=localhost;dbname=lai","lai","lai"); 
    $this->conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    $this->idu = $idu; 
    $this->setDisplayName($idu); 
} 

//GETS DISPLAY NAME FROM DB FOR CURRENT USER 
private function setDisplayName($idu){ 
    //$sql = "SELECT `display_name` FROM `users` WHERE `idu`='".$idu."'"; 
    //$q = $this->conn->prepare($sql); 
    //$q->execute(); 
    //$result = $q->fetch(PDO::FETCH_ASSOC); 

    //return $result['display_name']; 
} 

//GETS PERMISSIONS FROM DB FOR CURRENT USER 
private function setPermissions($idu){ 

} 

//RETURNS ID OF CURRENT USER 
public function getIDU(){ 
    return $this->idu; 
} 

//RETURNS DISPLAY NAME FOR CURRENT NAME 
public function getDisplayName(){ 
    return $this->display_name; 
} 

//RETURNS PERMISSIONS FOR CURRENT USER 
public function getPermissions(){ 
    return $this->permissions; 
} 

我不需要存儲類內線,但需要能夠使用DB在我的課,我也試着聲明

$conn = new PDO(....); 

以外的課程,全球範圍內,它也沒有工作

+1

您應該將您的模型(用戶類)與您的代碼邏輯(插入/更新/刪除)分開。 –

+0

你應該有一個單獨的數據庫類,所以你不重新定義連接。你將1.連接到你的數據庫類,2創建你的用戶類傳遞數據庫連接到它。 $ db = new myDB(); $ user = new User($ db); – jeff

回答

0

您存儲該用戶的某個地方的實例,就像在會話中?

PHP想要在你的代碼中的某個地方序列化該類,並且它的所有字段,即使是$ conn字段。 爲了整個用戶實例存儲在會話中,那麼你應該:

  1. 刪除參考DB(這被認爲是一個好主意),並將其移動到一些庫或映射類中檢索和操作用戶對象。
  2. 編寫用戶類中的方法__wakeup返回的屬性的數組要序列:

    公共函數__wakeup(){ 返回[ 「IDU」, 「DISPLAY_NAME」, 「權限」]; //沒有$ conn在這裏! } 這樣它不會嘗試序列化連接資源。