2015-02-23 99 views
0

試圖學習PDO的來龍去脈,我剛進入這個磚牆。PHP PDO致命錯誤:調用成員函數prepare()null

我現在的PDO類如下:

class SimpleDatabase extends PDO { 

const DB_HOST='localhost'; 
const DB_USER='claudio'; 
const DB_PASS='claudio'; 
const DB_NAME='simpledb'; 

private $dbh; 
private $error; 

private $stmt; 

public function __construct(){ 
    // Set DSN 
    $dsn = 'mysql:host=' . self::DB_HOST . ';dbname=' . self::DB_NAME; 
    // Set options 
    $options = array(
     PDO::ATTR_PERSISTENT => true, 
     PDO::ATTR_ERRMODE  => PDO::ERRMODE_EXCEPTION 
    ); 
    // Create a new PDO instanace 
    try{ 
     $this->dbh = new PDO($dsn, self::DB_USER, self::DB_PASS, $options); 
    } 
    // Catch any errors 
    catch(PDOException $e){ 
     $this->error = $e->getMessage(); 
    } 
} 

public function __destruct(){ 
// Adding null connection 
    $this->dbh = null; 
    $this->isConnected = false; 
} 

// The query, prepare, bind and execute methods allows us to use prepared statements in our DB interactions 

// Prepare 
public function query($query){ 
    $this->stmt = $this->dbh->prepare($query); 
} 

    // Bind 
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); 
} 

// Execute 
public function execute(){ 
    return $this->stmt->execute(); 
} 

我有職能的休息,但這個錯誤特別是,我不認爲有必要向您展示的休息。

然後我打電話的功能是這樣的:

$database = new SimpleDatabase(); 
$database->query('INSERT INTO mytable (FName, LName, Age, Gender) VALUES (:fname, :lname, :age, :gender)'); 
$database->bind(':fname', 'John'); 
$database->bind(':lname', 'Smith'); 
$database->bind(':age', '24'); 
$database->bind(':gender', 'male'); 

$database->execute(); 

而且我發現了以下錯誤:致命錯誤:調用一個成員函數上的空準備(),並且這種情況發生時,我打電話準備功能。任何想法爲什麼發生這種情況,我該如何解決這個問題?

+0

你的'bind()'函數在哪裏? – 2015-02-23 22:11:46

+0

已編輯爲具有綁定和執行功能。 – 2015-02-23 22:14:07

+0

就這樣,你知道你拼錯了'析構函數'即'__destuct()' – Cyclonecode 2015-02-23 22:16:18

回答

1

它看起來像你的代碼是「吞服」嘗試數據庫連接時引發的PDO異常,並失敗。

這裏:

catch(PDOException $e){ 
     $this->error = $e->getMessage(); 
    } 

如果有異常升高時,你分配的東西給error成員。涼。但如果連接失敗,可能$this->dbh將會爲空。

但是,否則它看起來好像你的代碼只是繼續,就好像一切都很好。

就好像你的代碼正在把它的小指放在它的嘴角,Dr.Evil風格,並說:「我只是假設一切都會按計劃進行,什麼?

+0

你說得對,我只是拋棄了錯誤,很容易理解這個問題。非常感謝,我只是錯過了。 – 2015-02-23 22:29:18

相關問題