【问题标题】:What can cause new PDO to be NULL什么会导致新 PDO 为 NULL
【发布时间】:2015-01-28 15:44:43
【问题描述】:

大家晚上好,我是 OOP 的新手,我遇到了一些问题。 我打电话后

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

然后我打电话

$this->_pdo->prepare($sql)

它说致命错误:在非对象上调用成员函数 prepare()

所以我 var_dump($this->_pdo) 结果为 NULL。什么可能导致此问题?

提前感谢您的帮助。

【问题讨论】:

  • 你在哪里调用它,在构造函数内部还是其他地方?
  • 您的“dsn”字符串不正确。 PDO 构造函数采用三个参数和一个“可选”选项数组。请参见第一个示例:pdo.construct.php。 'dsn' 应该类似于: mysql:host=' 。配置::get('mysql/host')。 ';dbname=' 。配置::get('mysql/db')。即一个字符串。澄清一下,“用户名”是第二个参数,密码是第三个。

标签: php oop pdo


【解决方案1】:

试试这个:

<?php    
    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(PDOExeption $e){
            die($e->getMessage());
        }
    }
?>

【讨论】:

    【解决方案2】:

    Juan 看到了,但没有解释——您在主机名之后和数据库名之前缺少一个分号。

    拆分该代码块并将凭据字符串作为单独的步骤构建会更好,然后您也可以对其进行 var_dumped 并直接看到问题:

    $host = config::get('mysql/host');
    $db = config::get('mysql/db');
    $creds = "mysql:host=$host;dbname=$db"
    $this->_pdo = new PDO(
        $creds,
        config::get('mysql/username'),
        config::get('mysql/password')
    );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-15
      • 2013-05-09
      • 2020-06-12
      • 2012-10-29
      • 1970-01-01
      • 1970-01-01
      • 2015-05-28
      • 1970-01-01
      相关资源
      最近更新 更多