こんにちは!
ナビゲータのEVEです。
お約束通りfetchAll(PDO::FETCH_XXXXX);のXXXXXの部分が変数で持てるかどうかやってみましたが、無理っぽかったです・・・。カッコの中身全部変数にしてみたりして、いろいろなパターンを試してみたのですが・・・・。無理っぽかったと言うのは、私がやって無理でも別の人がやったらできましたと言うことが多々あるためです。
できるかもしれないけれど試していないということが1つあります。defineを使って、定数としてPDO::FETCH_XXXXXを定義すれば、できるような気がする・・・。ただ、そうやった場合、ロジック的にはすっきるするけれど、別ファイルにdefineで定義するなど、運用的に煩雑になるような気がするからやめました。PDO::FETCH_XXXXXの部分が、他でも使うなら、それもするんですけれど、ここだけでしょ?利用するの・・・・。っということで、Fetchメソッドについて解説をします。
[Fetchメソッドの解説]
昨日アップロードしたソースを清書したものを、解説します。昨日のロジックと微妙に違います。
/*************************************************
*【メソッド名】Fetchメソッド
*【 引 数 】
* sub:種別
* 1;連想配列
* 2;一般配列
* 3;一般配列/連想配列
* 4;Fetchを実行する
* 5;オブジェクト
* 6;スカラー値
* 7;bindColumnメソッドのバイン変数
* 8;要求されたクラスの新規インスタンス
* strSql:SQL文
* Bind :バインド変数
*【返 却 値】
* 正常時:Fetchオブジェクト
* 異常時:False
*【製 造 者】EVE
*【製造年月日】2023年3月12日
*【更新年月日】
*【リリース日】
*【バージョン】0.1
*【 概 要 】
* レコードをFetchする
*************************************************/
//データベースを検索する
public function selectFetch(int $sub,//種別
string $strSql, //SQL文
array $Bind ) {//バインド変数
//❶変数定義
static $i; //ループインデックス
static $rtn;//返却値
//❷データベース検索メソッド
$rtn = $this->selectDb($strSql,$Bind);
//❸返却値の判定
if ( $rtn == false ) {
//エラーの場合
$this->processMessage = "Serch Error";
//返却値を設定し呼び出し元へ制御を移す
return false;
}
//❹SQL文実行処理
try {
//種別を判定する
if ( $sub == 1 ) {
//Fetchを実行する
//連想配列
$rtn = ($this->stmt->fetchAll(PDO::FETCH_ASSOC));
} else if ( $sub == 2 ) {
//Fetchを実行する
//一般配列
$rtn = ($this->stmt->fetchAll(PDO::FETCH_NUM));
} else if ( $sub == 3 ) {
//Fetchを実行する
//一般配列/連想配列
$rtn = ($this->stmt->fetchAll(PDO::FETCH_BOTH));
} else if ( $sub == 4 ) {
//Fetchを実行する
//連想配列
$rtn = ($this->stmt->fetchAll(PDO::FETCH_NAMED));
} else if ( $sub == 5 ) {
//Fetchを実行する
//オブジェクト
$rtn = ($this->stmt->fetchAll(PDO::FETCH_OBJ));
} else if ( $sub == 6 ) {
//Fetchを実行する
//スカラー値
$rtn = ($this->stmt->fetchAll(PDO::FETCH_COLUMN));
} else if ( $sub == 7 ) {
//Fetchを実行する
//bindColumnメソッドのバイン変数
$rtn = ($this->stmt->fetchAll(PDO::FETCH_BOUND));
} else if ( $sub == 8 ) {
//Fetchを実行する
//要求されたクラスの新規インスタンス
$rtn = ($this->stmt->fetchAll(PDO::FETCH_CLASS));
} else {
//❻想定外の種別が設定されていた場合
$this->processMessage = "Assortment Error";
//返却値を設定し呼び出し元へ制御を移す
return false;
}
} catch (PDOException $e) {
//❼Fetchが失敗した場合
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
//返却値を設定し呼び出し元へ制御を移す
return false;
}
//❽処理結果のメッセージを設定する
return $rtn;
}
❶本メソッドのみで利用する変数をすべて定義しています。
❷受け取った引数を2023年03月03日のブログでご紹介したデータベース検索メソッドへそのまま引き渡して、データベースを検索します。引数のチェック等データベースの基本的な所については、データベース検索メソッドで行うようにしています。
❸データベース検索メソッドからの返却値を判定しています。データベース検索メソッドで異常が発生していた場合、falseを設定しているので、falseかどうか判定し、falseの場合、返却値にfalseを設定し呼び出し元へ制御を移します。なお、エラーメッセージは、データベース検索メソッドで既に設定済みのため、セットしていません。
❹引数で受け取った、種別を判定しそれぞれの処理をしています。それぞれの定数について説明すると
・種別1:PDO:FETCH_ASSOC
┗取得形式:連想配列
・種別2:PDO:FETCH_NUM
┗取得形式:一般配列
・種別3:PDO:FETCH_BOTH
┗取得形式:一般配列/連想配列
・種別4:PDO:FETCH_NAMED
┗取得形式:連想配列
・種別5:PDO:FETCH_OBJ
┗取得形式:オブジェクト
・種別6:PDO:FETCH_COLUMN
┗取得形式:スカラー値
・種別7:PDO:FETCH_BOUND
┗取得形式:bindColumnメソッドでバインドされたPHP変数
・種別8:PDO:FETCH_CLASS
┗取得形式:指定されたクラスにフェッチ
以上は、「独習PHP」に掲載されているものをそのまま転記しています。詳しい解説等については、「独習PHP」でご確認ください。
価格:3,740円 |
❻種別(1〜8)以外が指定されている場合、メッセージを設定し、呼び出し元へ制御を移します。
❼tryでエラーが発生した場合、catchし、呼び出し元へ制御を移します。
❽プログラムの仕様として、処理で異常が発生した場合、その場で処理を止める仕様としています。そのため、ここで返却する値は、正常処理で得た結果を返却することになります。
今までの処理、Select、Insert、Update、Deleteでは、データベースに接続し、プリシアードステートメントを設定、バインドしたオブジェクトで、処理結果を受け取っていましたが、Fetchの場合は、正常に処理された返却値を使用します。そのため、他の処理とは違い、ここでは、trueではなく、PDO::Fetchメソッドから取得した返却値を設定することが絶対条件となります。
[あとがき]
今月にはいり、プログラムを毎日のように公開していますが、コメントヘッダの引数の欄の記入が漏れていました。本日、すべてのヘッダに引数に関する記述を追加しました。
最終的には、このヘッダに書かれている情報は、構成管理システムで行う予定です。まだ仕様は決定していないのですが、構成管理システムの内容がここに反映されるようにしようかな???って考えています。できれば、プログラムを検索してその結果から、引数、返却値などが取得できればいいな〜って思いますが、難易度がかなり上がりますね・・・。 今後の開発の状況を見て判断したいと思います。
では、また!!!
【このカテゴリーの最新記事】