我尝试使用 PDO 类编写项目,但因错误而失败
"Call to a member function prepare() on a non-object"
我在 stackoverflow 上找到了一些答案,但它们不起作用,我不知道现在该怎么办。我两天前开始尝试解决这个问题,但仍然无法解决这个问题。如果您知道问题出在哪里,请帮助我。
我的配置文件:
//DB Params
define("DB_HOST", "localhost");
define("DB_USER", "root");
define("DB_PASS", "usbw");
define("DB_NAME", "talkingspace");
//define("SITE_TITLE", "Welcome to Talking Space");
//Paths
define('BASE_URI', 'http://'.$_SERVER['SERVER_NAME'].'/MVC/');
?>
还有我的 PDO 文件
<?php class Database {
private $host = DB_HOST;
private $user = DB_USER;
private $pass = DB_PASS;
private $dbname = DB_NAME;
private $dbh;
private $error;
private $stmt;
public function __construct() {
//Set DSN
$dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname;
//Set options
$options = array(
PDO::ATTR_PERSISTENT => true,
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
);
//Create a new PDO instance
try {
$this->dbh = new PDO($dsn, $this->user, $this->pass, $options);
} catch (Exception $e) {
$this->error = $e->getMessage();
}
}
public function query($query) {
$this->stmt = $this->dbh->prepare($query);
}
public function bind($param, $value, $type=null) {
if (is_null($type)) {
switch (true) {
case is_int($value):
$type = PDO::PARAM_INT;
break;
case is_bool($value):
$type = PDO::PARAM_BOOL;
break;
case is_null($value):
$type = PDO::PARAM_NULL;
break;
default:
$type = PDO::PARAM_STR;
}
}
$this->stmt->bindValue($param, $value, $type);
}
public function execute() {
return $this->stmt->execute();
}
public function resultset() {
$this->execute();
return $this->stmt->fetchAll(PDO::FETCH_OBJ);
}
public function single() {
$this->execute();
return $this->stmt->fetch(PDO::FETCH_OBJ);
}
public function rowCount() {
return $this->stmt->rowCount();
}
public function lastInsertId() {
return $this->dbh->lastInsertId();
}
public function beginTransaction() {
return $this->dbh->beginTransaction();
}
public function endTransaction() {
return $this->dbh->commit();
}
public function cancelTransaction() {
return $this->dbh->rollBack();
}
}
最佳答案
it fails on error "Call to a member function prepare() on a non-object"
这是因为您在 query()
方法之前调用 single()
或 resultset()
方法。正确的语句顺序应该是这样的:
$db = new Database();
$db->query("SELECT * FROM table_name");
$result = $db->single(); // or $result = $db->resultset();
var_dump($result); // to see the result set
已编辑:
name
是MySQL中的保留关键字。您应该使用反引号对其进行转义。始终使用反引号括起表名和列名,并使用引号括起字符串。仅当表名或列名是 MySQL reserved keyword 时才需要反引号。 .
您的代码应如下所示:(已测试
)
class Topic {
private $db;
public function __construct() {
$this->db = new Database;
}
public function getAllTopics() {
$this->db->query("SELECT `name` FROM `users` order by `name` asc");
$results = $this->db->resultset();
return $results;
}
}
$obj = new Topic();
var_dump($obj->getAllTopics()); // to see the result set
关于php - 与 pdo 文件的连接失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34580462/