gpt4 book ai didi

php - 与 pdo 文件的连接失败

转载 作者:行者123 更新时间:2023-11-29 21:40:21 25 4
gpt4 key购买 nike

我尝试使用 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com