こんにちは!
ナビゲータのEVEです。
昨日は、データベース接続メソッド内⓫のデータベースをクローズまで説明しました。本日は、その続きで⓬のデータベース検索メソッドから説明しましょう。
なお、このプログラムは、オブジェクト指向プログラムを経験したことがないプログラマが、今までの経験や知識、そして本から得た情報から作成したものです。もしかしたら、問題点等あるかもしれません。オブジェクト指向プログラムの製造に対して経験豊富な方で気付いた点がございましたら、教えていただければ助かります。
では、説明をしていきましょう!
[プログラムの解説〜データベース検索メソッド〜]
昨日使ったプログラムを使って解説をしていきます。
<?php
/*************************************************
*【クラス名 】DB関連クラス
*【製 造 者】EVE
*【製造年月日】2023年3月1日
*【更新年月日】
*【 概 要 】
* データベースに関する基本的な機能を提供する
*************************************************/
class getDB {
//❶プライベート変数定義
private $setDb; //データベース名
private $setHost; //ホスト名
private $setChar; //文字コード
private $setUser; //ユーザ名
private $setPass; //パスワード
private $setPara; //接続条件を編集する
//❷パブリック変数定義
public $getDbConnect; //データベース接続オブジェクト
public $stmt; //ステートメント
public $processResult; //処理結果
public $processMessage; //処理メッセージ
/*************************************************
*【メソッド名】コンストラクタ
*【 引 数 】
* selectDb :データベース名
* selectHost :ホスト名
* selectChar :文字コード
* selectUser :ユーザー名
* selectPass :パスワード
*【製 造 者】EVE
*【製造年月日】2023年3月1日
*【更新年月日】
*【機能概要 】
* データベースを利用する場合の初期設定を行う
*************************************************/
public function __construct(string $selectDb, //データベース名
string $selectHost, //ホスト名
string $selectChar, //文字コード
string $selectUser, //ユーザー名
string $selectPass) { //パスワード
//変数定義
static $rtn = "";
//❸取得した変数を再定義する
$this->&setDb = $selectDb; //データベース名
$this->&setHost = $selectHost; //ホスト名
$this->&setChar = $selectChar; //文字コード
$this->&setUser = $selectUser; //ユーザー名
$this->&setPass = $selectPass; //パスワード
//❹接続条件を編集する
$this->&setPara = "mysql:dbname=".$this->&setDb."; host=".$this->&setHost."; charset=".$this->&setChar.";";
//❺データベースへ接続する
$rtn = $this->&connectDb();
}
/*************************************************
*【メソッド名】データベース接続メソッド
*【 引 数 】なし
*【返 却 値】正常時:データベース接続オブジェクト
* 異常時:false
*【製 造 者】EVE
*【製造年月日】2023年3月1日
*【更新年月日】
*【機能概要 】
* データベースへ接続する
*************************************************/
public function connectDb():PDO {
try {
//❻データベースへ接続する
$this->&getDbConnect = new PDO($this->&setPara ,$this->&setUser,$this->&setPass);
//❼データベース接続オブジェクト
return $this->&getDbConnect;
} catch (PDOException $e) {
//❽実行結果を格納する
$this->&processResult = false;
//❾例外メッセージを格納する
$this->&processMessage = $e->&getMessage();
//❿呼び出し元へ制御を移す
return $this->&processResult;
} finally {
//⓫データベースをクローズする
$getDbConnect = null;
}
}
/*************************************************
*【メソッド名】データベース検索メソッド
*【 引 数 】strSql :Sql文
*【返 却 値】なし
*【製 造 者】EVE
*【製造年月日】2023年3月1日
*【更新年月日】
*【機能概要 】
* 受け取った文字列でデータベースを検索する
*************************************************/
//データベースを検索する
public function selectDb(string $strSql) { //SQL文
//SQL文実行処理
try {
//⓬プリシェアードステートメント設定する
$this->&stmt = $this->&getDbConnect->&prepare($strSql);
//⓭検索を実行する
$this->&stmt->&execute();
//⓮処理結果を設定する
$this->&processResult = true; //返却値(正常)
} catch (PDOException $e) {
//検索が失敗した場合
//⓰処理結果を設定する
$this->&processResult = false; //返却値を設定する(異常)
//⓱異常処理結果のメッセージを設定する
$this->&processMessage = $e->&getMessage(); //返却値を設定する(メッセージ)
}
}
}
?>
⓬では、プリシアードステートメントに引数として取得したSQL文を設定しています。なお、プリシアードステートメントと表現していますが、情報セキュリティでSQLインジェクションについて勉強するのですが、そのときに使用するプリシアードステートメントに似ているため、この呼称を使用させていただいています。
⓭では、SQL文を実行しています。なお、この前にSQL文に変数を設定することができます。その方法については、明日解説します。現在非常に苦労しています・・・。できることと、できないことが分からないので・・・?
⓮では、処理結果ture(正常終了)を設定しています。昨日も話しましたが、EVEシステムでは、パブリックプロパティに処理結果を設定することにより処理の正常、異常を判断し制御することにしました。
⓯以降では、エラーが発生した場合の処理を定義しています。⓯では、⓮と同様に処理結果を設定しています。ここでは、エラーロジックなので、false(異常)を設定しています。
⓰では、異常メッセージをパブリックプロパティに設定しています。ここでfinally定義できるのですが、どんな処理を記述していいのか分からなかったので、割愛しています。
価格:3,740円 |
[プログラムを作ってみて]
今見るとそんなに難しいプログラムではないのですが、できることとできないことが分からないので、「独習PHP」からこんなことできるんじゃないか?と想像し、コーディングしているのですが、ことごとく外れています。コンストラクタに、データベース接続関数を定義できなかったけれど、引数を指定すればできるなど、条件がいろいろあるようです・・・。現在個別に条件を調べて対応中です。
[Prototype EVEでの反省を受けて]
現在、気を付けている点は、クラス、メソッドに渡す引数の型に気を付けています。Prototype EVEの時は、正直言ってあまり気にしていませんでした。理由は、PHP自体が厳格にそれを要求していなかったから・・・。ただ、PHPが用意している関数は、型を厳格に定義しています。それでもエラーにならなかったので、気にしなかったのですが、Prototype EVEを他人に使用してもらおうと考えてから考えが変わりました。ただ、癖って恐ろしいもので、夢中で作っているとおろそかになってしまいます。そのため、最終的に引数は、すべてString型で渡し、渡した先で、使用する型に変換するといったことをしていました。これにより、懸念している問題は、解決しました。これから、PHP8で製造していきますが、PHP8は引数を受け取る側で型を指定できるので、今後はこのようなことをしなくても大丈夫だと思います。
[コメントって大事]
今まで、いろいろな職場を経験していますが、ドキュメントとプログラムと整合性がとれているプロジェクトがほとんどなかったという印象です。っていうか、違っているのが普通です。
プロジェクトを運営するうえで、ドキュメントとプログラムに不整合が発生していた場合、ドキュメントを正としてプログラムを修正するのが本来正しい姿なのですが、それができません。運用していて、正常に動いているのに、ドキュメントが正として扱っているからという理由で、プログラムを修正するというのは非常に勇気がいります。
そんな時に大事なのが、プログラムに記述されているコメントです。Prototype EVEでは仕様書自体がないということもありますが、1ステップ1ステップにすべてコメントを入れるようにしています。10年以上前に作ったプログラムが多々ありますが、現在、そのコメントを頼りに修正をしています。
コメントを入れることにより、プログラム速度が遅くなるという話がありますが、納品するときに、コメント削除ツールを使って、コメントを削除して納品すれば、自分だけのコメントを入れることができます。それと、くだらないところで突っ込みも入りませんしね?一度試してください。
だから、ドキュメントを正として動いているプロジェクトに入ったら、優秀なプロジェクトだと思っていただいていいと思います。
[あとがき]
こんな感じでプログラムを作っています。今後もいろいろ工夫してEVEシステムを製造していきます。
では、また!!!
【このカテゴリーの最新記事】