Php PDO:调用未定义的方法DB::query()
试图掌握PDO的窍门,但目前没有多少乐趣。我敢打赌这也很简单 编辑:有什么更好的方法可以做到这一点?i、 e而不是将其包装在类中? classes/DB.class.php: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 =
<?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');