2015-02-23 2 views
0

, пытаясь узнать все входы и выходы PDO, и я только что попал в эту кирпичную стену.PHP PDO Неустранимая ошибка: вызовите функцию-член prepare() по нуле

Моего текущего класса 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()'? –

+0

Отредактировано для функций привязки и выполнения. –

+0

Просто так, что вы знаете, что вы ошиблись на «деструктор», то есть '__destuct()' – Cyclonecode

ответ

1

Похоже, что ваш код «проглатывает» исключение PDO, возникающее при попытке подключения к базе данных, и терпит неудачу.

Здесь:

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

Если возбуждается исключение, вы назначаете что-то к error члену. Круто. Вероятно, $this->dbh будет пустым, если соединение не удастся.

Но в остальном он выглядит так, как будто ваш код просто продолжается, как будто все в порядке.

Это как если бы ваш код помещал свой мизинец в угол рта, стиль доктора Эвиля и говорил: «Я просто предполагаю, что все пойдет по плану, что?»

+0

Вы правы, я просто var свалил ошибку, и это было легко понять проблему. Большое спасибо, я просто пропустил это. –

Смежные вопросы