如何在PHP类中使用与DB的连接?

时间:2016-07-10 10:08:59

标签: php class pdo

所以我写这个网站要求我制作用户类,我需要从数据库中获取一些数据但是当我尝试$this->conn = new PDO(....)时,它会抛出致命的错误,如下所示

  

致命错误:未捕获的异常' PDOException'有消息'您无法序列化或反序列化PDO实例'在[无活动文件]中:0堆栈跟踪:#0 [内部功能]:PDO-> __ sleep()#1 {main}在第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 :(得分:0)

您将该用户实例存储在某个地方,例如在会话中?

PHP希望在代码中的某个地方序列化该类,以及所有字段,甚至是$ conn字段。 为了在会话中存储整个用户实例,您应该:

  1. 删除对db的引用(这被认为是一个好主意)并将其移动到某个存储库或映射器类以检索和操作用户对象。
  2. 在User类中编写一个__wakeup方法,该方法返回要序列化的属性数组:

    public function __wakeup(){      返回[" idu"," display_name"," permissions"]; //没有$ conn在这里! } 这样它就不会尝试序列化连接资源。