こんにちは!
ナビゲータのEVEです。
本日は、レコード更新メソッドの解説です。
ここ数日間、コンストラクタ、コネクトメソッド、データベース検索メソッド、レコード追加メソッド、トランザクション開始メソッド、コミットメソッド、ロールバックメソッド、デストラクタと解説をしてきて、ブログを書きながら、修正点を見つけてきましたが、このレコード更新処理は、その検討結果をすべて取り込んだ処理になります。今日も何か気づくことがあるでしょうか?
では、早速解説していきましょう!
[レコード更新メソッド解説]
以下が、レコード更新メソッドになります。どんなふうに製造できたか見ていきましょう!
/*************************************************
*【メソッド名】レコード更新メソッド
*【 引 数 】$tbName :テーブル名
* u_Clum :カラム名(配列)
* u_Data :データ(配列)
* u_where :更新条件("99"の場合は、"")
*【返 却 値】
* 正常時:true
* 異常時:False
* 正常時:true
* 異常時:False
*【製 造 者】EVE
*【製造年月日】2023年3月6日
*【更新年月日】2023年3月7日
*【リリース日】
*【 概 要 】
* [2023/03/06]
* レコードを更新する
*@トランザクションを開始したくない場合は、開始前に
*トランザクションプロパティに"off"を設定
*Aコミットしたい場合は、本メソッド開始前に、
*コミットプロパティに"on"を設定
*B検索条件を指定しない場合は、u_whereに、"99"を
*指定する
* [2023/03/06]
* コミット処理を更新処理直前に移動
* [2023/03/07]
*@トランザクション開始処理の冗長ロジックを削除
* ⇒冗長の部分は、トランザクション開始処理へ移動
*Aバインド変数の設定をtry以前実施する
*************************************************/
//レコードを更新する
public function recUpdate(string $tbName, //テーブル名
array $u_Clum, //追加用項目
array $u_Data, //追加用項目
string $u_where) { //更新条件
//❶変数定義
static $i; //ループインデックス
static $u_array = array(); //追加用配列
static $strSql; //SQL文
//❷引数の判定を行う
//テーブル名を判定する
if ( $tbName == "" ) {
//異常の場合メッセージを設定し呼び出し元へ制御を移す
$this->processMessage = "テーブル名が設定されていません";
//呼び出し元へ制御を移す
return false;
}
//引数(配列)の判定を行う
if ( count( $u_Clum ) != count($u_Data) ) {
//引数の指定に誤りがある場合
$processMessage = "引数の指定に誤りがあります";
//呼び出し元へ制御を移す
return false;
}
//引数条件が設定されているかどうか判定する
if ( $u_where == "" ) {
//異常の場合メッセージを設定し呼び出し元へ制御を移す
$processMessage = "更新条件が設定されていません。";
//呼び出し元へ制御を移す
return false;
}
//❸SQL文を編集する
$u_array[] = "update ";
$u_array[] = $tbName;
$u_array[] = " set ";
//カラム配列終了まで以下の処理を実行する
for ( $i = 0; $i < count( $u_Clum ); $i++ ) {
//カラムを編集する
$u_array[] = $u_Clum[$i];
$u_array[] = " = ?";
//最終処理かどうか判定する
if ( count( $u_Clum ) == $i + 1 ) {
//最終処理の場合
//forを終了する
break;
} else {
//最終処理でない場合
$u_array[] = ",";
}
}
//❹検索条件の判定を行う
if ( $u_where != "99" ) {
//データの編集を開始する
$u_array[] = " where ";
$u_array[] = $u_where;
}
//SQL文を編集する
$strSql = implode( "",$u_array );
//❺プリシアードステートメントを設定する
$this->stmt = $this->getDbConnect->prepare($strSql);
//❻バインド変数終了まで以下の処理を実行する
for ( $i = 0; $i < count($u_Data); $i++ ) {
//バインド変数へデータを設定する
$this->stmt->bindParam($i+1,$u_Data[$i]);
}
//SQL文実行処理
try {
//❼トランザクション開始する
$this->setTran();
//❽レコード更新メソッドを実行する
$this->stmt->execute();
} catch (PDOException $e) {
//❾ロールバックする
$this->setRollback();
//❿検索が失敗した場合
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
//⓫返却値を設定して呼び出し元へ制御を移す
return false;
}
//⓬プロセス確定メソッドを実行する
$this->setCommit();
//⓭返却値を設定し呼び出し元へ制御を移す
return true;
}
❶本メソッド内で使用している、変数を全て(?)定義しています。
❷〜❸の間で行われいる処理は、メソッド呼び出し時に取得した、引数の入力データチェックを行っています。「レコード追加メソッド(2023年3月6日)」の時は、全ての引数をチェックするかどうか悩んでいましたが、結局すべてのメソッドで引数のチェックをすることにしました。
❸と❹では、Update文を編集しています。SQL文を編集するという点では、「レコード追加メソッド」と同じなのですが、❹では、引数が"99"か判定しています。Update文の場合、全ての処理でwhere文が必要ではないので、必要ではない場合、呼び出し元で、where文の代わりに、"99"を設定することになります。
❺では、プリシアードステートメントの設定をしています。
❻設定したプリシアードステートメントのバインド変数へデータを設定しています。この処理、「レコード追加メソッド」では、tryの中で実行していましたが、tryの外に出しました。特に理由はなく、なんとなくなのですが、どのようなエラーをtry〜catchで取得したいのかというと、「レコード追加メソッド」なら追加処理、「レコード更新メソッド」なら、更新処理にあります。目的にそった使い方をしたほうがいいと思い、このような仕様としています。なお、「レコード追加メソッド」でも横並びで修正しています。
❼トランザクションを開始します。ここも昨日のトランザクション開始メソッドの仕様に併せて、フラグ等の判定はすべて削除し、実行のみとしています(2023年3月6日 プログラムソース❸参照)。
❽レコード更新メソッドを実行しています。
❾❿⓫はcatchは、「レコード追加メソッド(2023年3月6日)」と変更はありません。
⓬⓭は、tryで正常に実行された後に実行される処理です。なお、この処理も、「レコード追加メソッド(2023年3月6日)」と変更はありません。
[あとがき]
このプロジェクトの決め事として、プログラムソースを修正した場合、ヘッダに更新日と、更新内容を記述することにしています。ただ、プログラムを解説、じっくり見て、修正してみると、プログラムソースよりヘッダの方が長くなってしまいそうな気がしてきました。そのため、ヘッダにリリース日という項目を追加し、リリースした段階で更新履歴は削除することにしました。そして、リリース以降は、修正した場合は、ソース自体に、日付と修正内容を残すことにしました。
やっぱり、修正した所へ直接コメントを残した方が後で確認しやすいと思います。ただ、以前加わったプロジェクトでは、修正箇所が多すぎて、プログラムソース、コメントを読むのが大変だったということがありました。やはりリリース前によく考え製造しリリースしなくてはいけないとその時に感じた出来事でした。
私も含めて、プログラムはよく考えて作りましょう!
では、また!
【このカテゴリーの最新記事】