【问题标题】:How to use connection to DB inside a PHP Class?如何在 PHP 类中使用与数据库的连接?
【发布时间】:2016-07-10 10:08:59
【问题描述】:

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

致命错误:未捕获的异常“PDOException”与消息“您无法在 [无活动文件] 中序列化或反序列化 PDO 实例”:0 堆栈跟踪:#0 [内部函数]:PDO->__sleep() #1 {main } 在第 0 行抛出 [no active file]

班级用户:

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;
}

我不需要在类中存储连接,但需要能够在我的类中使用数据库,我也尝试过声明

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

在课堂之外,在全球范围内,它也不起作用

【问题讨论】:

  • 您应该将模型(用户类)与代码逻辑(插入/更新/删除)分开。
  • 您应该有一个单独的数据库类,这样您就不会重新定义连接。您将 1. 连接到您的数据库类,2 创建您的用户类,将数据库连接传递给它。 $db = 新的 myDB(); $user = 新用户($db);

标签: php class pdo


【解决方案1】:

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

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

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

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

【讨论】:

    猜你喜欢
    • 2016-12-02
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 2011-09-12
    • 2018-01-12
    • 1970-01-01
    • 2016-12-23
    • 2019-07-12
    相关资源
    最近更新 更多