【问题标题】:Call to undefined method PDO::setAttribute()调用未定义的方法 PDO::setAttribute()
【发布时间】:2012-11-19 20:18:41
【问题描述】:
class dbConnection {
public $pdo;
public function __construct() {
    $this->dbConnect();
}
public function dbConnect() {
    if((count($_POST) == 6)&&($_GET['a'] == "connect")) {
        $host = $_POST['host'];
        $port = $_POST['port'];
        $username = $_POST['username'];
        $password = $_POST['password'];
        $database = $_POST['database']; 
        try{
                $this->pdo = new PDO('mysql:host='.$host.';dbname='.$database.';port='.$port, $username, $password );
                echo 'Connection successful!';
                return $pdo;
        }
        catch(PDOException $e){
                echo 'Error: ' . $e->getMessage();
        }   
    }
}
}

class Group extends dbConnection { //Class for group, for ex. employe and employers.
public $name;  // Name of group
public $pdo;

public function __construct ($_name, $conn) {
$this->pdo = $conn;
$this->name = $_name;

}

public function getGroupList() {
    if(isset($this->pdo)) {
        try
        {
            $conn = $this->pdo;
          $conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //to catch exceptions

          $stmt = $pdo -> query('SELECT id, Name, Skills FROM '.$this->name); //sql query with group name
          $list = $stmt->fetchAll(PDO::FETCH_NUM); //fetch statement into array
          $stmt -> closeCursor();
          unset($stmt);
          return var_dump($list); //gives pure data
        }
        catch(PDOException $e) 
        {
          return 'There was some error: ' . $e->getMessage();
        }
    }
    else {
    $pdo;
    }
}

}

和执行:

$conn = new dbConnection;
$workers = new Group("workers", $conn);
$workers->getGroupList();

我得到错误:

调用未定义的方法 dbConnection::setAttribute() 上线:

$conn ->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); //to catch exceptions

我正在尝试解决这个问题,我不知道为什么 php 将 PDO 对象视为一种方法。我没有任何想法。而且我还得写更多的信。

【问题讨论】:

    标签: php class pdo oop


    【解决方案1】:

    $this->pdo 在该上下文中引用 dbConnection 对象。确实,您应该将名称更改为 $this->conn 或类似的名称。

    要修复它,请尝试:

    $this->pdo->pdo->setAttribute();
    

    或者具体来说,在您的代码上下文中:

    $conn->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    

    但是,您似乎也错误地使用了继承。

    您不应将连接传递给 Group 类,而应改为调用父构造函数以便正确初始化,并根据其定义设置 pdo 的值。

    试试这个:

    class Group extends dbConnection { //Class for group, for ex. employe and employers.
        public $name;  // Name of group
    
        public function __construct ($_name) {
            $this->name = $_name;
            parent::__construct();
        }
    

    从那里,您可以引用$this->pdo,因为它在 dbConnection 中定义

    【讨论】:

    • 我用过这个。但是感谢两位的澄清,我将在前几天学习单例课程。
    【解决方案2】:

    发生的情况是您传入了 DB 包装类,然后尝试将该类用作实际的 PDO 对象。当然,这是无效的。它是一个包装器——你想要它包含的 PDO 对象。

    我建议您退后一步,看看您是如何创作这些作品的。您不想继承或扩展您的 DB 包装器,我认为您应该在创建类时将其注入到类中。 (或者,如果您愿意,也可以编写一个单例类——我觉得这样更简洁,但这会引起很大的争论)

    编辑:

    如果您想要一个简单的“使用代码执行此操作”解决方案,实际上是:

    $conn=$this->pdo->pdo;
    

    【讨论】: