Php PDO:调用未定义的方法DB::query()

Php PDO:调用未定义的方法DB::query(),php,mysql,pdo,Php,Mysql,Pdo,试图掌握PDO的窍门,但目前没有多少乐趣。我敢打赌这也很简单 编辑:有什么更好的方法可以做到这一点?i、 e而不是将其包装在类中? classes/DB.class.php: <?php // DB.class.php class DB { protected $db_name = "PDO"; protected $db_user = "root"; protected $db_pass = "root"; protected $db_host =

试图掌握PDO的窍门,但目前没有多少乐趣。我敢打赌这也很简单

编辑:有什么更好的方法可以做到这一点?i、 e而不是将其包装在类中?

classes/DB.class.php:

<?php

// DB.class.php

class DB {

    protected $db_name = "PDO";
    protected $db_user = "root";
    protected $db_pass = "root";
    protected $db_host = "localhost";

    // Establish Connection to Database.

    public function connect() {

        try {
            $DB = new PDO("mysql:host=$db_host;dbname=$db_name", $db_user, $db_pass);
        }
        catch (PDOException $e) {
            echo $e->getMessage();
        }

    }

}

?>

包括/global.inc.php:

<?php

require_once 'classes/DB.class.php';

// Establish Connection to Database.

$db = new DB();
$db->connect();

?>

index.php:

<?php

require_once 'includes/global.inc.php';

$STH = $db->query("SELECT * FROM users");
echo "<pre>";
print_r($STH->fetch());

?>

您的DB类中没有DB属性和
query()
方法。如清单所示添加它:

<?php

    // DB.class.php

    class DB {

    protected $db_name = "PDO";
    protected $db_user = "root";
    protected $db_pass = "root";
    protected $db_host = "localhost";

    private $_db;

    // Establish Connection to Database.

    public function connect() {

        try {
            $this->_db = new PDO("mysql:host=".$this->db_host.";dbname=".$this->db_name, $this->db_user, $this->db_pass);
        }
        catch (PDOException $e) {
            echo $e->getMessage();
        }

    }

    public function __call($name, array $arguments) {

        if(method_exists($this->_db, $name)){
            try{
                return call_user_func_array(array(&$this->_db, $name), $arguments);
            }
            catch(Exception $e){
                throw new Exception('Database Error: "'.$name.'" does not exists');
            }
         }
     }

}

?>

更好的方法是使用一些ORM库或裸PDO对象——这非常友好。

实例化为$db的对象没有方法查询。可能不需要将PDO对象包装到另一个对象中,但如果要这样做,则需要确保所有方法都是可访问的。

您的类数据库没有方法查询!你可以这样做:

class DB extends PDO {

    protected $db_name = "PDO";
    protected $db_user = "root";
    protected $db_pass = "root";
    protected $db_host = "localhost";

    public function __construct() {
        try {
            parent::__construct("mysql:host={$this->db_host};dbname={$this->db_name}", $this->db_user, $this->db_pass);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

}

$db = new DB;
$db->query('SELECT * FROM something');
试试这个:

class DB extends PDO {

    protected $db_name = "PDO";
    protected $db_user = "root";
    protected $db_pass = "root";
    protected $db_host = "localhost";

    public function __construct() {
        // do nothing
    }

    public function connect() {
        try {
            parent::__construct("mysql:host={$this->db_host};dbname={$this->db_name}", $this->db_user, $this->db_pass);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

}

$db = new DB;
$db->connect();
$db->query('SELECT * FROM something');
另外,我在您的成员前面添加了
$this
关键字,因为
$db_name
等未在方法范围中声明

如果不希望在创建对象时启动连接,可以执行以下操作:


重要注意事项:通常,在重写子级中的方法时,需要指定与父级相同的方法签名(否则会出现E\u STRICT错误)。幸运的是,这不适用于核心类,可能允许这样的重写。

魔术方法是纠正程序员错误的非常糟糕的方法。我不想纠正程序员错误,我只想在DB类中包含PDO功能。这并不能纠正它,因为如果他使用这种“代理”错误地调用PDO方法这将给他“未定义的东西”错误,他将不知道发生了什么。我不会否决你的答案,只是说,这不是解决问题的好方法。嗨,我得到以下消息:PHP致命错误:在第28行的/Applications/MAMP/htdocs/PDO/classes/DB.class.PHP中对非对象调用成员函数query(),PDO是否有任何错误消息表明它无法连接到数据库?似乎PDO对象没有实例化。一直说$db_name、user、pass和host的变量未定义?您有
echo$e->getMessage()代码中的部分-我指的是在运行代码时应在页面上显示的消息。更新的答案-缺少
$this->
部分。“可能不需要将PDO对象包装到另一个对象中”-为什么不?我这么做已经很多年了,而且我觉得它非常方便。@binaryLV:在那个特定的用例中,没有任何。继承更好。不过,当您构建抽象层时,适配器模式确实很有用。您需要使用
$db->db->query()
。您的类不是扩展PDO类,而是简单地包装它。
class DB extends PDO {

    protected $db_name = "PDO";
    protected $db_user = "root";
    protected $db_pass = "root";
    protected $db_host = "localhost";

    public function __construct() {
        // do nothing
    }

    public function connect() {
        try {
            parent::__construct("mysql:host={$this->db_host};dbname={$this->db_name}", $this->db_user, $this->db_pass);
        } catch (PDOException $e) {
            echo $e->getMessage();
        }
    }

}

$db = new DB;
$db->connect();
$db->query('SELECT * FROM something');