【PHP】ini_set()について
PHPでのエラーログを取るとき、
「そもそも、ini_set()ってなんだっけ?」
と疑問に感じたのでメモとして残しておきます。
まずPHPでエラーログを出すとき、このように書いています。
ini_set()ってなに?
log_errors : エラーログを保存するかどうかの設定
保存する場合には「On」、しないなら「Off」を設定します。
【使い方】
ini_set("log_errors", "On");
error_log : エラーログの保存先パスの設定
log_errorsとセットで使用することが多いと思います。【使い方】
ini_set("log_errors", "On");
ini_set("error_log", "/log/error.log");
DBに登録するときの型について【メモ】
javaScriptのショートハンド(if文)
if文の省略形(ショートハンド)を復習がてら作りました。
ショートハンドにするには
(条件)?真の処理:偽の処理;
で書いていきます。
以下、javaScriptで書きました。
これをショートハンドで書くと
という感じになります。
式の意味
「もし、20歳以下なら「ズバリ!あなたは未成年です!」を
それ以外なら「ズバリ!あなたは成人ですね!」を
コンソールに出力させろ。 」
ショートハンドにすると、コードが一行で済みますね。
僕はまだ上の書き方のほうが読みやすいです、、。
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の動画内でかずきちさんから説明されなきゃ気づくのはいつになっていたことやら・・・。
(何回も書いていることに気づいていませんでした。)
ウェブカツは、一番最初にきれいなコードを見せるのではなく、改善の余地を残して途中からそれを良いものに改良する。というスタイルで、それがありがたいです。
自分で気づける部分も増えるといいな!
ウェブカツ!! WEBサービス部L9〜10 ifの中にまたif
ifの中にまたif?!
おんなじif(式)なのに???
こんにちは、クルトンです。
ウェブカツのWEBサービス部でsignup.php(ユーザー登録画面)を作っている最中に
if(empty($err_msg)){
が何度も出てきます。
WEBサービス部のsignup.phpで
— クルトン@(プロ)グラマー (@kuruton_tern) 2019年3月9日
if(empty($err_msg)){
の中になんでまた
if(empty($err_msg)){
が入るんだ?そのまま続けるのはだめ?
色々試してみて今の段階でわかったことをまとめておきたいと思います。
疑問に思った部分はココ↓
①if(empty($err_msg)){
//emailの形式チェック
//emailの最大文字数チェック
//email重複チェック
//パスワードの半角英数字チェック
//パスワードの最小文字数チェック
//パスワードのの最大文字数チェック//パスワード(再入力)の最大文字数チェック
//パスワード(再入力)の最小文字数チェック//ここまでチェックして、バリデーションエラーがない場合(つまりエラーメッセージがない場合)
②if(empty($err_msg)){
//パスワードとパスワード(再入力)があっているかチェック
//ここまでチェックして、バリデーションエラーがない場合(つまりエラーメッセージがない場合)
③if(empty($err_msg)){
//例外処理
}
}
}
※ ウェブカツ!!のWEBサービス部より一部引用
同じ式が、ある処理のブロックが終わったらまた登場!という状態にちょっと混乱しました。
しかしもちろん、なきゃいけないコードなわけで。。。
で、試しに
上のコードの中の②、③を消してユーザー登録をしてみたらバリデーションが働かなくなりました。
半角英数字で6文字以上じゃなきゃエラーが出なきゃいけないのに、パスワードを「あああああ」(全角で5文字)で入れても登録できちゃった。
データベースにも登録できちゃった。
つまり、
②までのバリデーションチェックの内容を、②で判断。
問題がなければ(エラーメッセージが出なければ)③に進み、
③までのバリデーションチェックの内容を③で判断する。
という流れになっているんですね。(書いててそのままの日本語ですがw)
②と③の式がこのまま先に進ませても良いものか判断する役割があったんですね。
この2つを消すと、上から流れてくるバリデーションチェックの内容で合っているか?(変数に入っている、チェックしたい内容物がエラーにならないか?)という
YES/NOを出す人がいません。内容物がエラーでもNOを出す人がいません。
だからパスワード「あああああ」でも登録できちゃったんですね!
こういう解釈で僕は納得しました。
もし間違っていれば、ご指摘お願いいたします。
【2019/3/26 追記】
先日のツイートにウェブカツ生が答えてくれました。
僕の解釈よりもっと納得のいく回答がありまして、
それは
「エラーメッセージが上書きされるから」
というものです。
僕がいまいち腑に落ちてない所が何を基準に再度emptyで区切るかです。
— U@web (@web08153888) March 9, 2019
なんとなく一緒っぽいチェック項目で区切る感覚なのか?
もしくは何か明確な基準があって区切っているのか?
です!
今の所似ている部分で区切っているのかな?という感じで落ち着いています
1 empty
— U@web (@web08153888) March 9, 2019
Emailチェック
2 empty
パスワードチェック
パスワード、再入力チェック
3 empty
といった感じでは駄目なのでしょうか?
理解力が乏しくて申し訳ないです(・_・;
あぁぁ〜!
— U@web (@web08153888) March 9, 2019
なるほどですね〜!
グッときました!!!
今、グッときました〜!
ありがとうございます^_^
あとはライカさんもご親切に教えてくださいました。
私も前、同じような事思ってました。
— ライカ@ウェブカツ受講中 (@hideiwa1) March 10, 2019
この前同じ話題があったので、参考までにhttps://t.co/H6c5U5kxLJ
ツイッター上ではみんな協力しあっています!すごくいいことですよね!
わからないことがあったら質問の掲示板を見て
疑問に思ったらツイッターに投げかけてみる。
バカだと思われてもいいから聞いた方がいいときがありますね。