Folks,
让我在这之前说,我正在努力学习OOP,所以我想写我自己的Class,而不是使用现有的Mysqli抽象层。
我在一个文件中定义了这个类,在开始编写特定的查询函数之前,我只是想让一个通用查询正常工作。
<?php
/* Database Config */
define('DB_NAME', 'project');
define('DB_USER', 'foo');
define('DB_PASS', 'bar');
define('DB_HOSTNAME', '127.0.0.1');
class Database {
private $host;
private $user;
private $pw;
private $db;
public $con;
public function __construct($hostname, $user, $pass, $db) {
$this->DB_HOSTNAME = $hostname;
$this->DB_USER = $user;
$this->DB_PASS = $pass;
$this->DB_NAME = $db;
}
public function connect() {
$this->con = new mysqli($this->hostname, $this->user, $this->pass, $this->db)
or die('Database unavailable');
$this->con->set_charset ('utf8');
}
public function query($sql) {
$stmt = $this->con->query($sql);
}
}
// Create a single global instance of the database class
global $DB;
$DB = new Database();
?>
然后我创建了一个简单的test.php,其中包含:
<?php
include_once("include/config.inc");
if ($DB) {
$sql = "select user_login, user_name from users where 1 order by user_name, user_login";
$stmt = $DB->query($sql) or die($DB->errno.__LINE__);
$result = $stmt->fetch_array(MYSQLI_ASSOC);
var_dump($result);
}
else die('Database Unavailable');
?>
当我调用该页面时,我得到
致命错误:在第33行的/www/htdocs/project/include/db.class.php中对非对象调用成员函数query()
我没有从测试页面中得到die,所以我相信它可以到达数据库,我知道表中包含数据,查询也能工作,因为如果我切换到非基于类的DB定义,我会得到一个包含预期数据的数组。
所以我很确定这是我在课堂上制造的一个问题,我只是不知道它是什么。请给我建议?
似乎您的对象不是创建的
这是你的构造。这意味着当您创建对象时,您需要指定参数
public function __construct($hostname, $user, $pass, $db)
像这个吗
$DB = new Database('hostname', 'dbuser', 'dbpass', 'db');
您的类初始化良好,这不是问题所在。问题是它在con上找不到query函数,因为在调用query之前没有调用connect。
如果con还不存在或不活动,您应该在查询函数中添加一行来调用connect,这样您就不必记得在调用query之前调用它。