php - 与 pdo 文件的连接失败

标签 php mysql pdo

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

相关文章:

php - 如何使用php数组制作html合并行表

php - MySQL查询后使用PHP输出唯一数据

mysql - 为什么查询不会因子查询中不存在的列而失败?

php - 检查预订系统中的空闲时段

php - 使用 POST 数据值作为参数时出现 PDO 错误

php - 错误 : SQLSTATE[23000]: Integrity constraint violation: 1048 Column 'comments' cannot be null

PhpExcel - 如何在第 N 行之后插入同一行?

带有 eCheck 的 PHP RestFul API

php - 使用 PHP 但不使用 MySQL 列出在线用户的最佳方法?

php - SELECT 查询静默失败,不产生任何输出