【问题标题】:Call to undefined method pdo::prepare调用未定义的方法 pdo::prepare
【发布时间】:2014-01-01 20:53:16
【问题描述】:

我正在为一个网站编写一个注册脚本,并在 registration.php 脚本中使用函数 databaseConnection 测试了代码,一切正常,但现在我将 databaseConnection 函数替换为一个单独的文件,所以我不必输入相同的代码每次都再来一次。

我从databaseConnection.php文件中的数据库中取出实例并将其加载到registration.php中的私有变量$db_connection中,现在我想为sql语句准备连接,但脚本返回错误'调用未定义方法 DatabaseConnection::prepare()'

这是 databaseConnection.php 脚本

<?php
class DatabaseConnection {
//private zodat niemand een nieuwe kan maken
private static $instance = null;
//constructor private zodat niemand instantie kan klonen
private function __construct(){
    try{
        $this->db_connection = new PDO('mysql:host='. DB_HOST .';dbname='. DB_NAME, DB_USER, DB_PASS);
        return true;
    } catch (PDOException $exception){
            $this->errors[] = $this->lang['Database error'];
        return false;
    }
}
public static function getInstance(){
    if(self::$instance === null)
        self::$instance = new DatabaseConnection();

    return self::$instance;
}
}
?>

我像这样在registration.php中的__construct函数中将实例加载到$db_connection中

$this->db_connection = databaseConnection::getInstance();

现在我的代码在 $check_user_name=... 行崩溃了

...
        } else if ($this->db_connection != null){
        $check_username_query = $this->db_connection->prepare('SELECT user_name, user_email FROM users WHERE user_name=:user_name OR user_email=:user_email'); 
...

有人可以帮我解决这个错误吗?我在 stackoverflow 上阅读了类似的问题,但无法通过那里提供的信息弄清楚。

问候

【问题讨论】:

    标签: php mysql object pdo instance


    【解决方案1】:

    仔细阅读错误信息:'Call to undefined method DatabaseConnection::prepare()'

    您的DatabaseConnection::getInstance() 返回DatabaseConnection 的实例,而不是PDO。一种可能的解决方案是在 DatabaseConnection 中实现 __call() 或像 Chris Barrett 所说的那样扩展 PDO

    【讨论】:

    • 我在registration.php中做了一个$this->db_connection的var_dump。结果如下:object(DatabaseConnection)#2 (1) { ["db_connection"]=> object(PDO)#3 (0) { } }。如果我是正确的,这看起来不像 PDO 对象?
    • @Gijs 不,正如开头所说,它是一个 DatabaseConnection 对象(包含一个 PDO 对象)
    • 现在我在 databaseConnection.php 中添加了一个 __call 方法,我正在通过 prepare() 行,但现在我被困在下一个,我尝试使用 bindValue 添加变量() 与 $check_username_query->bindValue(..);这意味着我成功地将我的实例提供给 db_connection 变量?
    【解决方案2】:

    $this->db_connection 是 DatabaseConnection 对象而不是我认为的 PDO 对象。例如,您可能想扩展 PDO 对象:

    class DatabaseConnection extends PDO {
    

    否则,您可以围绕 PDO 为您想要调用的方法声明包装函数。

    【讨论】:

      猜你喜欢
      • 2014-08-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-11
      • 2014-06-15
      • 2012-11-19
      • 1970-01-01
      相关资源
      最近更新 更多