民间,
让我先说明我试图学习OOP而不是使用其中一个现有的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()
我没有从测试页面获得骰子,所以我相信它可以到达数据库,我知道该表保存数据并且查询有效,因为如果我切换到非基于类的数据库定义,我会得到一个具有预期数据的数组。
所以我很确定这是我在课堂上创造的一个问题,我无法弄清楚它是什么。建议吗?
答案 0 :(得分:0)
似乎您的对象未创建
这是你的构造。这意味着在创建对象时需要指定参数
public function __construct($hostname, $user, $pass, $db)
这样做
$DB = new Database('hostname', 'dbuser', 'dbpass', 'db');
答案 1 :(得分:0)
您的课程初始化很好,这不是问题。问题是它无法在con上找到查询功能,因为您在调用查询之前未调用connect。
您应该在查询功能中添加一行,以便在con尚未存在或未激活时调用connect,这样您就不必记得在调用查询之前调用它。 / p>