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 呼び出しをカプセル化するためにクラス ルートに移動する理由は、将来の非推奨の問題を回避するためでした。クラスを更新するだけで済みます。