尝试在连接类之外运行查询时出现以下错误。
致命错误:在...中调用未定义的方法Core \ Database :: query()
我有以下文件。
database.php中
namespace Core;
use \PDO;
class Database
{
private $pdo;
private static $instance;
private function __construct()
{
try {
$this->pdo = new PDO("mysql:host=localhost;dbname=db;", "root", "pw");
$this->pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (\PDOException $e) {
echo $e->getMessage();
}
}
public static function getInstance()
{
if (!isset(self::$instance))
self::$instance = new Database();
return self::$instance;
}
}
Auth.php
namespace Auth;
use Core\Database;
class Auth
{
protected $dbh;
public function __construct()
{
$this->dbh = Database::getInstance();
$query = $this->dbh->query("SELECT * FROM table");
}
}
提前感谢您的帮助。
答案 0 :(得分:0)
您正在设置数据库类的属性并返回静态值。也许你可能想要这样做:
class Database extends \PDO{
public static function getInstance(){
if(!self::$instance){
self::$instance = new self();
}
return self::$instance;
}
public function __construct(){
try {
parent::__construct("mysql:host=localhost;dbname=db;", "root", "pw", [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION
]);
self::$instance = $this;
} catch (\PDOException $e) {
echo $e->getMessage();
}
}
}
我个人已经这样做了,而不是创建一个愚蠢的包装类。
否则你必须改为设置静态变量:
self::$instance = new PDO("mysql:host=localhost;dbname=db;", "root", "pw");
答案 1 :(得分:0)
您在Auth
课程中所做的是,您刚刚使用Database
模式创建了Singleton
类的实例,并尝试从query
方法调用Database
未在类中定义的$this->dbh->query()
实例。如果要像Database
那样访问它,则需要构造PDO
类的实例并同时返回public static function getInstance() {
if (!isset(self::$instance))
self::$instance = new Database();
return self::$instance->pdo;
}
实例。像这样:
return self::$instance->pdo
我刚才修改的内容是PDO
。如果第一次调用Database
,则在getInstance
类被实例化时返回PDO
对象,否则它只返回创建的$this->dbh->query()
实例。您现在可以在Auth
课程中执行Database
。
注意,只有当您不在static
类中定义除getInstance
之类的getInstance
方法以外的任何其他方法时,才需要执行此操作。因为PDO
的结果只允许您访问public
属性和方法。因此,解决方案是在Database
中定义PDO
方法,该方法分别返回public static function getInstance() {
if (!isset(self::$instance))
self::$instance = new Database();
return self::$instance;
}
public function getPDO() {
return $this->pdo;
}
个实例。
PDO
完成后,您可以访问Auth
课程中的public function __construct()
{
$this->dbh = Database::getInstance()->getPDO();
$query = $this->dbh->query("SELECT * FROM table");
}
,例如:
<uses-permission android:name="android.permission.VIBRATE" />
希望它有所帮助!