0

mysql_query が PHP 5.5.0 で非推奨になることを見越して、すべての DB クエリを処理するクラスに取り組んできました。

class DataBaseClass {

    //.....some other function and variables declared here....

    function GetConnection() {
        try {
          $this->conn = new PDO("mysql:host=" . DB_HOST . ";dbname=" . DB_NAME, DB_USER, DB_PASS);
          $this->conn->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); 
        }
        catch(PDOException $e) {
           echo $e->getMessage();
        }

         return $this->conn;
     }

     function Query($str_sql, $arr_parameters = array()) {
         try {
            $this->str_mysql_error = $this->int_num_rows = $this->int_num_affected_rows = $this->int_mysql_insert_id =  '';

            if (count($arr_parameters) > 0) {
                $obj_result = $this->conn->prepare($str_sql);
                $obj_result->execute($arr_parameters);
            } else {
                $obj_result = $this->conn->query($str_sql);
            }


         }

         catch(PDOException $e) { 
             $this->str_mysql_error = $e->getMessage() . $str_sql;

          }
     }
}

次に、新しいユーザーを作成する別のクラスがあります。

class AddNewUser {
    //.....some other function and variables declared here....

    function InsertUser() {
          $str_sql = "INSERT INTO  (uname, name, email, pass, user_regdate, theme)       VALUES )";
           $_SESSION['db_connection']->Query($str_sql, '');         

     }
}

現在、メインのユーザー作成ページには次のものがあります。

$_SESSION['db_connection'] = new DataBaseClass; 
//Reason I used $_SESSION to store my DB object, is so that it can be accessible everywhere. 
//Did not want to use "global" everywhere. Not sure if this is he best way???

$cls_new_user = new AddNewUser ();
$cls_new_user->InsertUser(); //Does not raise PDOExecption although SQL cleary wrong inside this method
if ( $_SESSION['db_connection']->str_mysql_error) {
    //show error in error div
}


$str_sql = "SELECT some wrong SQL statment";
$_SESSION['db_connection']->Query($str_sql); // This does raise PDOExecption

if ( $_SESSION['db_connection']->str_mysql_error) {
    //show error in error div
}

別のクラスから呼び出されたときに、DB クラス関数「クエリ」が明らかに間違った SQL で例外を発生させない理由がわかりません。しかし、メインページコードから呼び出された同じ関数 (関数/クラス内ではない) が発生し、例外エラーが発生します。

また、「InsertUser」関数は、SQL が正しくても DB に何も実行/挿入しません。

それはスコープに関連している可能性がありますか、または $_SESSION に入れてDBオブジェクトのグローバルスコープを強制しようとしているという事実ですか??

私はこれについて間違った方法で進んでいますか?すべての DB 呼び出しをカプセル化するためにクラス ルートに移動する理由は、将来の非推奨の問題を回避するためでした。クラスを更新するだけで済みます。

4

1 に答える 1

0

関数をこのようにします。

 function Query($str_sql, $arr_parameters = array()) {
        $stmt = $this->conn->prepare($str_sql);
        $stmt->execute($arr_parameters);
 }

例外がスローされると確信しています

唯一の問題は、スローではなく例外のキャッチにあります。また、スコープではなく名前空間が原因である可能性があります。確かに、いつでもすべての PDO 呼び出しの前にスラッシュを追加できます。

\PDO::FETCH_ASSOC
\PDOException

于 2013-06-07T13:22:11.087 に答える