2016-08-11 120 views
0

我已经搜索了关于这个的每一个答案,没有人似乎完全回答了发生了什么。 当试图用pdo准备语句时,我在标题中出现错误。调用成员函数prepare()null - PDO

我曾尝试:

使用构造函数,而不是

使用非静态

使用$这个时候我有一个构造函数

捕获PDO的例外,没有人可以抛出

这里是main.php

class db { 
    public static $db; 
    public static $db2; 

    public static function start() { 
     $host = "localhost"; 
     $dbname = "dbname"; 
     $usr = "user"; 
     $ps = "pass"; 

     $pdo = "mysql:host=$host;dbname=$dbname"; 
     $opt = [ 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_PERSISTENT => true 
     ]; 
     try { 
     db::$db = new PDO($pdo, $usr, $ps, $opt); 

     return db::$db; 
     } catch(PDOException $e) { 
      $e->getMessage(); 
     } 
    } 
} 

然后初始化数据库,我称之为启动功能的index.php中与db::start();

现在,到了错误。

在main.php中,在一个完全不同的类和函数中,我试着静态地调用这个连接。

$stmt0 = db::$db->prepare("SELECT * FROM users WHERE uname=:u"); 

但是完成后,我收到标题中的错误,在这一行。

大多数人可能会认为,嗯,连接必须有错误,然后如果它将它调用为null。如果是这样的话,有些东西会阻止我的异常被抛出,因为我在错误日志或页面上看不到任何东西。

+0

你做,如果try块失败$没有回音错误E->的getMessage (); –

+0

添加回声,你会看到错误 –

+0

回声没什么,我也试过error_log。 – Joel

回答

1

您的PDO无法连接,并且由于您没有做任何具有该条件的任何事情(您只是默默地放弃它),它已陷入困境。

尝试删除try..catch块。如果连接发生错误,您需要知道!

+0

删除'try..catch'块,仍然得到准备空错误 – Joel

0

我试过http://phpfiddle.org/这个代码,它的工作原理: (打开URL,对等维护“码域”并粘贴下面的代码)

<?php 

class db { 
    public static $db; 
    public static function start() { 
     $opt = [ 
      PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, 
      PDO::ATTR_PERSISTENT => true 
     ]; 
     try { 
      require "util/public_db_info.php"; 
      $db = new PDO($dsn, $user_name, $pass_word); 
      return $db; 
     } catch(PDOException $e) { 
      die($e->getMessage()); 
     } 
    } 
} 

$db = db::start(); 

$result = $db->prepare("SELECT * FROM books WHERE id <= 10"); 
$status = $result->execute(); 

if (($status) && ($result->rowCount() > 0)) 
{ 
    $results = array(); 

    //convert query result into an associative array 
    while ($row = $result->fetch(PDO::FETCH_ASSOC)) 
    { 
     $results[] = $row; 
    } 

    var_dump($results); 

} 


?> 
相关问题