DB接続後のクエリ作成がよくわからず。。
どうも、 ウェブカツ!!のWEBサービス部で三歩進んで二歩下がっているクルトンです。
今日のはウェブカツ!!やってない人からしたらなんのこと?って記事です。
僕のメモのようなもの。
DBConnect後のqueryPostという関数を作成しても、その関数の中身がよくわからず。。
自分で調べる+PHP・MySQL部Lesson13を見て、言語化した部分です。
以下、コード
function queryPost($dbh, $sql, $data){
//クエリー作成
$stmt = $dbh->prepare($sql);
$stmt->execute($data);
return $stmt;
}
まず、関数queryPostで出来上がる$stmtをゲットしたい。目的はコレ。
すぐ親子丼たべたくない?
すぐ自転車乗りたくない?
自転車のペダル、フレーム、ハンドルそれぞれがばらばらになっているものを毎回組み立てるのではなく
すでに出来上がっている自転車($stmt)をその場で使いたい。
毎回組み立てるのめんどくさい。
親子丼も同じ!!
コードが読みやすいようにちょっとコメントを付け加えます。
function queryPost($dbh, $sql, $data){
//クエリー作成(命令を作成)
$stmt = $dbh->prepare($sql);
//プレースホルダに値をセットし、SQL文を実行。その後DBへ情報を渡す
$stmt->execute($data);
return $stmt;
//今の$stmtには 「プレースホルダに値をセットし、SQL文を実行。その後DBへ情報を渡す」機能がついている。
}
ここから、僕なりの解説です。
///////////////////////////////////////////////////////////
function queryPost($dbh, $sql, $data){
///////////////////////////////////////////////////////////
意味:$dbh, $sql, $dataの3つの引数を使ったqueryPostという関数を作る宣言
///////////////////////////////////////////////////////////
$stmt = $dbh->prepare($sql);
///////////////////////////////////////////////////////////
意味:変数$stmtに以下のものを入れろ。
$dbhというPDOオブジェクトから$sqlを呼び出す、という準備をしろ。
ー>:アロー演算子。これはPDOオブジェクトからメソッドを呼び出すときに使う。(左辺から右辺を取り出すイメージ)
「$dbhというPDOオブジェクトから$sqlを呼び出す」とは、
つまり、
って意味。このSQL文はtry,catch文の中に出てくる(今回2回つかう)。
毎回SQL文を書くのは大変なので変数$sqlに入れる。($SQLを呼び出して使い回しやすいように)
「準備をしろ」がprepareメソッドにあたる。
prepareでSQL文の準備をして、exucuteでSQL文を実行する。
(いろんなサイトでもprepareメソッド使用後、excuteメソッドで実行すると説明されていました)
///////////////////////////////////////////////////////////
//プレースホルダに値をセットし、SQL文を実行。その後DBへ情報を渡す
$stmt->execute($data);
///////////////////////////////////////////////////////////
意味:$dataを実行しろ。
「実行しろ」がexecute。
$stmtにはすでにPDOオブジェクトが入っている(上の行で入れてる)から、アロー演算子でexucuteメソッドを呼び出す。
$dataの中は連想配列になっているのでプレースホルダーに変数(ポストされた情報)を入れる。
プレースホルダー:あとから情報を入れ込む箱みたいなもの。花見のために場所取りをするのに似ています。
場所取りしておいてあとから人がくる、みたいな。
そのプレースホルダーに値を入れ込んでいく。
///////////////////////////////////////////////////////////
return $stmt;
///////////////////////////////////////////////////////////
これで$stmtができあがりです。
今の$stmtには
「$sqlに入っているSQL文を使う準備をして、プレースホルダに値をセットし、その後SQL文を実行。」
という機能がついています。
このように、queryPostの関数を作っておくことで今後
queryPost($dbh, $sql, $data);
という関数を使えば
上の機能付きの$stmtがすぐ手に入ります。
毎回親子丼を作らなくていい。毎回自転車を組立てなくていい。最高です。
「「「「「「「「「「「「「「「「「「「「「「「
2019/5/9 追記
「「「「「「「「「「「「「「「「「「「「「「「
ウェブサービス部Lesson17の商品登録機能でqueryPostが進化(?)したので
また言語化しておきたいと思います。
以下、ウェブサービス部Lesson17よりコード引用
function queryPost($dbh, $sql, $data){
//クエリー作成
$stmt = $dbh->prepare($sql);
if(!$stmt->execute($data)){
debug('クエリに失敗しました。');
$err_msg['common'] = MSG07;
return 0;
}
debug('クエリ成功。');
return $stmt;
}
以前までのqueryPostの関数を使うと、$stmtには
「$sqlに入っているSQL文を使う準備をして、プレースホルダに値をセットし、その後SQL文を実行。」
という機能が入っていました。
今回追加になった機能は以下のもの。
///////////////////////////////////////////////////////////
if(!$stmt->execute($data)){
debug('クエリに失敗しました。');
$err_msg['common'] = MSG07;
return 0;
}
///////////////////////////////////////////////////////////
内容としては
「SQL文がミスってたら、『クエリに失敗しました。』というエラー文を表示させて0を返す。(クエリに成功していたら$stmtを返して成功したことをphp.logに表示させる)」
というもの。
この機能をqueryPostの関数に追加しました。
今まではこれら(クエリ成功?失敗?)を各画面で書いていました。
それをこのqueryPostの関数にあらかじめ入れ込んであげることで、
各画面で何回も同じことを書かなくて良いようにする。
正直、L17の動画内でかずきちさんから説明されなきゃ気づくのはいつになっていたことやら・・・。
(何回も書いていることに気づいていませんでした。)
ウェブカツは、一番最初にきれいなコードを見せるのではなく、改善の余地を残して途中からそれを良いものに改良する。というスタイルで、それがありがたいです。
自分で気づける部分も増えるといいな!