【问题标题】:PDO can't access the database connection instancePDO 无法访问数据库连接实例
【发布时间】:2014-03-23 04:12:48
【问题描述】:

我有一个数据库包装器和一个获取 PDO 连接实例的静态方法。但是,当我想进行 PDO 查询时,我无法访问它。

这是 DB 类的一部分:

class DB {
private static $_instance = null;
private $_pdo,
        $_query,
        $_error = false,
        $_results,
        $_count =0;


private function __construct() {
    try {
        $this->_pdo = new PDO('mysql:host='.Config::get('mysql/host').';dbname='.Config::get('mysql/db'),Config::get('mysql/username'),Config::get('mysql/password'));

    } catch (PDOException $e) {
        die($e->getMessage());

    }
}

public static function getInstance() {
    if(!isset(self::$_instance)) {
        self::$_instance = new DB();

    }
    return self::$_instance;
}

这里是我的查询:

    $pdo = DB::getInstance();

    $statement = $pdo->prepare("select surname from staff_info where fname = :name");
    $statement->execute(array(':name' => Input::get('name')));
    $total = $statement->rowCount();

   while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { 
            echo $row['surname'].'</br>';

    }

但是当我运行查询时出现此错误:

致命错误:调用未定义的方法 DB::prepare()

我做错了什么?有什么帮助吗?

但是当我这样做时,它会起作用

$dsn = 'mysql:host=localhost;dbname=cois';
$user = 'root';
$password = '';
$pdo = new PDO($dsn, $user, $password);


$filmName = "omar";

$statement = $pdo->prepare("select surname from staff_info where fname = :name");
$statement->execute(array(':name' => $filmName));
$total = $statement->rowCount();

while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { 
      echo $row['surname'].'</br>';

 }

这怎么可能?

【问题讨论】:

  • 你的 DB 类上的 prepare 方法在哪里?
  • @chumkiu 可能缺席。因为这就是错误的意思。
  • 您在 $this->db 变量上分配 pdo 对象并将 $_instance 静态变量作为 db 对象返回,显然您的 $_instance 为空
  • 准备不是 PDO 方法??我知道它是 PDO 方法,这就是我没有定义它的原因。我在没有定义的地方使用它并且它有效。查看我的编辑
  • prepare 是一种 PDO 方法。但是您的 $db 不是 PDO 实例。

标签: php mysql pdo


【解决方案1】:

您在对象 DB 上而不是在 PDO 上调用 prepare,我建议将 getter 添加到类 DB:

public function getPDO(){ 
  return $this->_pdo;
}

并修改准备查询:

$db = DB::getInstance();
$statement = $db->getPDO()->prepare(...);

【讨论】:

    【解决方案2】:
    private function __construct() {
        try {
             self::$_instance = new PDO('mysql:host='.Config::get('mysql/host').';dbname='.Config::get('mysql/db'),Config::get('mysql/username'),Config::get('mysql/password'));
    
        } catch (PDOException $e) {
            die($e->getMessage());
    
        }
    }
    public static function getInstance() {
        if(!isset(self::$_instance)) {
             new DB();
    
        }
        return self::$_instance;
    }
    

    【讨论】:

    • 您在 $this->db 变量上分配 pdo 对象并将 $_instance 静态变量作为 db 对象返回,显然您的 $_instance 为空
    猜你喜欢
    • 2014-12-12
    • 2018-12-16
    • 2015-01-07
    • 2011-02-25
    • 1970-01-01
    • 2019-07-05
    • 1970-01-01
    • 2017-05-22
    • 2015-06-27
    相关资源
    最近更新 更多