Php 与pdo文件的连接失败

Php 与pdo文件的连接失败,php,mysql,pdo,Php,Mysql,Pdo,我尝试使用PDO类编写一个项目,但在出现错误时失败了 “对非对象调用成员函数prepare()” 我在stackoverflow上找到了一些答案,但它们不起作用,我不知道现在该怎么办。我两天前开始尝试修复此问题,但仍然无法修复此问题。如果你知道问题出在哪里,请帮帮我 我的配置文件: //DB Params define("DB_HOST", "localhost"); define("DB_USER", "root"); define("DB_PASS", "usbw"); define("DB

我尝试使用PDO类编写一个项目,但在出现错误时失败了

“对非对象调用成员函数prepare()”

我在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();
    }
}

出现错误“对非对象调用成员函数prepare()”时失败

这是因为您在调用
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中的保留关键字。您应该使用反勾号来转义它。始终使用反勾号包装表和列名,并使用引号包装字符串。只有当表名或列名为空时,才需要反勾号

您的代码应该是这样的:(
已测试


类主题{private$db;公共函数uu construct(){$this->db=new Database;}公共函数getAllTopics(){$this->db->query(“按名称从用户中选择名称”);$results=$this->db->resultset();返回$results;}我不确定我们是否理解自己的意思,但我认为在查询方法之前不要调用resultset。@MartinT_25我已经更新了我的答案。请参阅我答案的编辑部分。谢谢,但仍然不起作用。它在错误“对非对象调用成员函数prepare()”时失败。错误在数据库文件中:public function query($query){$this->stmt=$this->dbh->prepare($query);//here@MartinT_25我刚刚在我的本地系统上测试了你的代码,它工作正常。我没有发现任何其他问题。这可能是由本地设置引起的吗?
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