こんちは!
ナビゲータのEVEです。
ちょっと、昨日まで製造していた部分に疑問が生じたため、ブログの更新に時間がかかってしまいました。
[データベース追加メソッド]
以下がデータベースを追加するメソッドです。本日は、こんな感じで作りましたという事の報告です。明日、どうしてこういうロジックになったのか解説します。
/*************************************************
*【メソッド名】レコード追加メソッド
*【 引 数 】dbName :データベース名
* i_Clum :カラム名(配列)
* i_Data :データ(配列)
*【返 却 値】
* 正常時:true
* 異常時:False
*【製 造 者】EVE
*【製造年月日】2023年3月3日
*【更新年月日】
*【 概 要 】
* [2023/03/03]
* レコードを追加する
*<注意>
*@トランザクションを開始したくない場合は、開始前に
*トランザクション開始プロパティにoffを設定
*Aコミットしたい場合は、本メソッド開始前に、
*処理確定プロパティにonを設定
*************************************************/
//レコードを追加する
public function recInsert(string $dbName, //データベース名
array $i_Clum, //追加用項目
array $i_Data) { //追加データ
//変数定義
static $i; //ループインデックス
static $i_array = array(); //追加用配列
static $strSql; //SQL文
//引数の判定を行う
if ( count( $i_Clum ) != count($i_Data) ) {
//引数の指定に誤りがある場合
$processMessage = "引数の指定に誤りがあります";
//呼び出し元へ制御を移す
return false;
}
//トランザクションを開始フラグを判定する
if ( $this->setTran == "on" ) {
//トランザクション開始する
$this->setTran();
//トランザクション開始プロパティを実行中にステータスを変更する
$this->setTran = "exe";
}
//SQL文を編集する
$i_array[] = "insert into ";
$i_array[] = $dbName;
$i_array[] = " (";
//カラム配列終了まで以下の処理を実行する
for ( $i = 0; $i < count( $i_Clum ); $i++ ) {
//カラムを編集する
$i_array[] = $i_Clum[$i];
//最終処理かどうか判定する
if ( count( $i_Clum ) == $i + 1 ) {
//最終処理の場合
$i_array[] = ")";
//forを終了する
break;
} else {
//最終処理でない場合
$i_array[] = ",";
}
}
//データの編集を開始する
$i_array[] = " value (";
//データ終了まで以下の処理を実行する
for ( $i = 0; $i < count( $i_Data ); $i++ ) {
//データを編集を開始する
$i_array[] = "?";
//最終処理かどうか判定する
if ( count( $i_Data ) == $i + 1 ) {
//最終処理の場合
$i_array[] = ");";
//forを終了する
break;
} else {
//最終処理でない場合
$i_array[] = ",";
}
}
//SQL文を編集する
$strSql = implode( "",$i_array );
//プリシェアードステートメント設定する
$this->stmt = $this->getDbConnect->prepare($strSql);
//SQL文実行処理
try {
//バインド変数終了まで以下の処理を実行する
for ( $i = 0; $i < count($i_Data); $i++ ) {
//データをSQL文へ設定する
$this->stmt->bindParam($i+1,$i_Data[$i]);
}
//レコード追加メソッドを実行する
$this->stmt->execute();
} catch (PDOException $e) {
//検索が失敗した場合
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
//返却値を設定して呼び出し元へ制御を移す
return false;
}
//コミットするかどうか判定する
if( $this->setCommit == "on" ) {
//プロセス確定メソッドを実行する
$this->setCommit();
}
//返却値を設定し呼び出し元へ制御を移す
return true;
}
[今日悩んだこと・・・]
try〜catchの部分・・・。昨日報告したメソッドですが、$this->stmt->execute()の後にtrueを設定していますよね?catchって、直前のエラーを拾うんでしたっけ?それともtryの中の例外すべて拾うんでしたっけ?
Javaの時の記憶ですが、直前のエラーを拾ったような???そのため、$this->stmt->execute()の後にロジックを続けた場合、外に出さなければならないような???ただ、catchのロジックに入った場合、catchの中で、returnしないと、外に出したそのロジックに入ってしまうような???
なんて、考え始めたら、面倒くさくなってしまい、調べる前に、true及びfalseなどの返却値は、returnに設定し、呼び出し元へ制御を移すことにしました。
try {
//プリシェアードステートメント設定する
$this->stmt = $this->getDbConnect->prepare($strSql);
//バインド変数終了まで以下の処理を実行する
for ( $i = 0; $i < count($Bind); $i++ ) {
//変数をSQL文へ設定する
$this->stmt->bindParam($i+1,$Bind[$i]);
}
//検索を実行する
$this->stmt->execute();
//処理結果を設定する
$this->processResult = true; ←これこの位置でいい???
try〜catchの外に出した方
が良いのでは???
} catch (PDOException $e) {
//検索が失敗した場合
//処理結果を設定する
$this->processResult = false;
//異常処理結果のメッセージを設定する
$this->processMessage = $e->getMessage();
}
}
[あとがき]
プログラム修正後ですが、調べて見ましたが、私の考えたとおりのことを言っているサイトもありました。ただ、明確に私の疑問に対して回答を出しているサイトは今のところありません。明日まで、もう少しだけ調べて見ます。明日、レコード追加メソッドの解説をします。なお、今日のような事があるので、一部修正が入っている可能性がありますので、ご了承ください。
では、また!!!
【このカテゴリーの最新記事】