2016-10-27 3 views
0

Я написал класс абстракции PDO с некоторыми учебниками и битами кода из StackOverflow, чтобы облегчить мою жизнь, но PDO-по-прежнему кажется болью в заднице и заставляет меня задаться вопросом, глупый или если PDO имеет более широкую кривую обучения по сравнению с старым старым MySQL.PDO Класс не возвращается Count

В любом случае, я пытаюсь создать класс статистики для подсчета нескольких строк без написания основных запросов справа и слева. Я пытаюсь получить счет для следующих таблиц. Контакты + Компании + Пользователи

Но по какой-то причине это не работает. Большую часть времени я ударил 500 ошибок. И, глядя на код, он кажется правильным для большей части, если только я чего-то не упускаю.

Так вот абстракции базы данных класс Библиотека/database.php

class Database{ 
    private $host  = DB_HOST; 
    private $user  = DB_USER; 
    private $pass  = DB_PASS; 
    private $dbname = DB_NAME; 

    private $dbh; 
    private $error; 
    private $stmt; 

    public function __construct(){ 
     // Set DSN 
     $dsn = 'mysql:host=' . $this->host . ';dbname=' . $this->dbname; 
     // 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, $this->user, $this->pass, $options); 
     } 
     // Catch any errors 
     catch(PDOException $e){ 
      $this->error = $e->getMessage(); 
     } 
    } 

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

    # PDO Count All 
    public function countAll($value){ 
    $sql = "SELECT * FROM `$value`"; 

    $this->stmt = $this->dbh->prepare($sql); 
    try { $this->stmt = $this->execute(); } catch(PDOException $e) { $this->error = $e->getMessage(); } 
    return $this->stmt->rowCount(); 
    } 

    # PDO 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); 
    } 

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

    # PDO Multiple Records 
    public function resultset(){ 
    $this->execute(); 
    return $this->stmt->fetchAll(PDO::FETCH_ASSOC); 
    } 

    # PDO Single Record 
    public function single(){ 
    $this->execute(); 
    return $this->stmt->fetch(PDO::FETCH_ASSOC); 
    } 

    # PDO Count 
    public function rowCount(){ 
    return $this->stmt->rowCount(); 
    } 

    # PDO Last Insert ID 
    public function lastInsertId(){ 
    return $this->dbh->lastInsertId(); 
    } 

    # PDO Transactions begin/end/cancel 
    public function beginTransaction(){ 
    return $this->dbh->beginTransaction(); 
    } 

    public function endTransaction(){ 
    return $this->dbh->commit(); 
    } 

    public function cancelTransaction(){ 
    return $this->dbh->rollBack(); 
    } 

    # PDO Debug Dump 
    public function debugDumpParams(){ 
    return $this->stmt->debugDumpParams(); 
    } 

} 

А вот статистика класс Библиотека/Stats.class.php

class Stats{ 
     private $_db; 

     public function __construct(Database $db){ 
     $this->_db = $db; 
     } 

     public function countContacts() { 
      $this->_db->query('select count(*) from contacts'); 
      $this->_db->fetchColumn(); 
     } 

     public function countCompanies() { 
      $this->_db->query('select count(*) from companies'); 
      $this->_db->fetchColumn(); 
     } 

     public function countUsers() { 
      $this->_db->query('select count(*) from users'); 
      $this->_db->fetchColumn(); 
     } 

     public function countInvoices() { 
      $this->_db->query('select count(*) from invoices'); 
      $this->_db->fetchColumn(); 
     } 
} 

И вот как я звоню по адресу index.php

$database = new Database(); 
$stats = new Stats($database); 
echo $stats->countContacts(); 

Значения соединения передаются в фоновом режиме, поскольку они включены в заголовок файла шаблона.

Любые предложения по поводу того, что я делаю неправильно?

+1

включить ERROR_REPORTING - что он говорит? – Dan

+1

500 ошибка: ошибка сервера; проверьте свои журналы. –

+0

@ Fred-ii- Я знаю, что 500 - это ошибка сервера, но в журнале ошибок Apache нет ошибок для отметки времени в отношении ошибки 500. Однако я нашел это ... Ошибка PHP Parse: синтаксическая ошибка, неожиданная ',', ожидающая переменная (T_VARIABLE) в /Applications/MAMP/htdocs/sbs/lib/stats.class.php в строке 15 – 0111010001110000

ответ

4

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

добавьте следующий метод к классу

public function run($query, $params = NULL){ 
    $stmt = $this->dbh->prepare($query); 
    $stmt->execute($params); 
    return $stmt; 
} 

, а затем переписать вашу статистику сборщиков:

public function countUsers() { 
     return $this->_db->run('select count(*) from users')->fetchColumn(); 
    } 

Обратите внимание, что все другие функции в вашей обертке либо вредные или бесполезные. Пожалуйста, прочитайте мою статью, Your first database wrapper's childhood diseases, чтобы найти почему

+0

, так что бы вы рекомендовали для части __construct в классе базы данных? – 0111010001110000

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