调用未定义的方法PDO :: setAttribute()

时间:2012-12-02 00:04:30

标签: php class pdo oop

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对象视为一种方法。我什么都不知道。我必须写更多的信件。

2 个答案:

答案 0 :(得分:0)

该上下文中的

$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中定义

答案 1 :(得分:0)

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

我建议退一步看看你是如何编写这些内容的。您不希望子类化或扩展您的数据库包装器,我认为您应该在创建它们时将它注入到类中。 (或者如果你愿意的话,写一个单身课程 - 我发现它更清洁,但这引发了一个巨大的争论)

编辑:

如果你想要一个简单的'用​​你的代码做这个'的解决方案,它实际上是:

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