8

私はPDOを初めて使用し、それについていくつか混乱します。無効なクエリに対して例外がスローされるかどうかを確認するためのテスト関数を作成しようとしましたが、何もスローされません。

これがコードです

<?php
include_once("/var/www/include/constants.php");

class DB{
    private $DBH; 

    public function DB(){
        try{
            $DBH = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASS);   
        }
        catch(PDOException $e) {  
            echo $e->getMessage(); 
        }
    }

    public function test(){
        try{
            $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
            $DBH->prepare('DELECT id FROM users');  
        }
        catch(PDOException $e) {  
            echo $e->getMessage();  

        }
    }

};

/* Create database connection */
$db = new DB;
$db->test();

?>
4

2 に答える 2

6

データベースハンドルのへの参照が欠落していることに加えて、$this準備をエミュレートしてはならないことをPDOに通知する必要があります。以下のコードは、次のような例外をスローします。

SQLSTATE [42000]:構文エラーまたはアクセス違反:1064SQL構文にエラーがあります。1行目の「DELECTidFROMusers」の近くで使用する正しい構文については、MySQLサーバーのバージョンに対応するマニュアルを確認してください。

class DB{
    private $DBH; 

    public function DB(){
        try{
            $this->DBH = new PDO("mysql:host=localhost;dbname=movies", 'root', 'jsat12');   
            $this->DBH->setAttribute(PDO::ATTR_EMULATE_PREPARES, false );
      }
        catch(PDOException $e) {  
            echo $e->getMessage(); 
        }
    }

    public function test(){
        try{
            $this->DBH->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
            $this->DBH->prepare('DELECT id FROM users');  
        }
        catch(PDOException $e) {  
            echo $e->getMessage();  

        }
    }

};

/* Create database connection */
$db = new DB;
$db->test();
于 2012-10-13T11:33:15.350 に答える
0

生産していないので例外はありません。警告、エラー、または変数が定義されていないという何かが表示されるはずです。エラー報告の設定を確認してください。

ではtest、を使用$DBHしますが、ローカルスタックには存在せず、オブジェクトメンバーとして存在します。したがって、コンストラクタメソッドとそれを使用するメソッドでオブジェクトメンバーに値を割り当てるためにを使用する必要があり$this->DBH = new PDO(..)ます。$this->DBH->setAttribute(...)test

さあ、修正版:

<?php
include_once("/var/www/include/constants.php");

class DB{
    private $DBH; 

    public function DB(){
        try{
            $this->DBH = new PDO("mysql:host=".DB_SERVER.";dbname=".DB_NAME, DB_USER, DB_PASS);   
        }
        catch(PDOException $e) {  
            echo $e->getMessage(); 
        }
    }

    public function test(){
        try{
            $this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );  
            $this->DBH->prepare('DELECT id FROM users');  
        }
        catch(PDOException $e) {  
            echo $e->getMessage();  

        }
    }

};

/* Create database connection */
$db = new DB;
$db->test();
于 2012-10-13T11:25:24.207 に答える