2016-10-27 4 views
0

私はPDO抽象クラスをStackOverflowのいくつかのチュートリアルとコードビットで書いて、私の人生を楽にしました。しかし、PDOスチルはお尻に痛みを感じています。愚かな場合や、PDOが古いMySQLと比較してより大きな学習曲線を持っている場合。PDOクラスが返されないCount

とにかく私がやっているのは、メジャーなクエリを左右に書くことなく、いくつかの行を数える統計クラスを作成することです。私は次の表のカウントを取得しようとしています。 お問い合わせ+企業+ユーザー

しかし、何らかの理由で動作していません。ほとんどの場合、私は500エラーに達しました。コードを見ると、何かが欠落していない限り、ほとんどの部分で正しいようです。

そこでここでは、データベース抽象クラスのlib/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(); 
    } 

} 

そしてここでは、統計クラスのlib/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がサーバーエラーであることを知っていますが、500エラーに関するタイムスタンプのエラーログにはエラーログはありません。しかし、私はこれを見つけました... PHP Parse error:構文エラー、予期しない '、'、/Applications/MAMP/htdocs/sbs/lib/stats.class.phpの15行目の変数(T_VARIABLE)を期待しています – 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

関連する問題