kuruton_ternのブログ

プログラミングのアウトプットブログ。

【PHP】ini_set()について

 

PHPでのエラーログを取るとき、

 

「そもそも、ini_set()ってなんだっけ?」

 

と疑問に感じたのでメモとして残しておきます。

 

 

まずPHPでエラーログを出すとき、このように書いています。

 

//ログを取るか
ini_set('log_errors','on');
//ログの出力ファイルを指定
ini_set('error_log','php.log');
 
これを書いてからPHPで書く処理を書いていきます。
 
 
 

ini_set()ってなに?

 
 
ini_set()はPHPの設定を変更したいときに使う関数です。
変更したい部分だけ設定ができます。
 
 
例えば
PHPのエラーを取るかどうか」
 
PHPのエラーをブラウザ画面に出すかどうか」
 
タイムゾーンを日本時間に変更するか」
 
などといった内容を個別に設定できます。
 
 
 
 
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");
 
 
 
このように設定することでエラーログが取れるんですね。
その他にもini_set()を使って設定を変更することができます。
以下の記事が参考になりました!
 
 
 

DBに登録するときの型について【メモ】

 

 

 データベースになんらかの情報を登録する際に「型」を意識するんだということに

最近やっと気づきました。

 

郵便番号は整数型の「int」じゃだめなんだ!

先頭の「0」が消えてしまうから。

 

となると、charかvarcharかtext??

 

日本の郵便番号は7桁と決まっているから「varchar(7)」でいいのかな。

 

 

以下の記事が型を決める際の道筋を公開してくれているのでとてもわかりやすかったです!

 

blog.asial.co.jp

javaScriptのショートハンド(if文)

 

if文の省略形(ショートハンド)を復習がてら作りました。

ショートハンドにするには

 

(条件)?真の処理:偽の処理;

 

で書いていきます。 

 以下、javaScriptで書きました。

 

 
var age = 2; //お好きな数字をいれてみてね!
if(age < 20){
console.log('ズバリ!あなたは未成年です!');
}else{
console.log('ズバリ!あなたは成人ですね!');
} 
 

 

これをショートハンドで書くと

 

 
var age = 10;
var nenrei = (age < 20) ? console.log('ズバリ!あなたは未成年です!') : console.log('ズバリ!あなたは成人ですね!');
 

 

という感じになります。

 

式の意味

「もし、20歳以下なら「ズバリ!あなたは未成年です!」

それ以外なら「ズバリ!あなたは成人ですね!」

コンソールに出力させろ。 」

 

 

ショートハンドにすると、コードが一行で済みますね。

僕はまだ上の書き方のほうが読みやすいです、、。

 

 

DB接続後のクエリ作成がよくわからず。。

 

どうも、 ウェブカツ!!のWEBサービス部で三歩進んで二歩下がっているクルトンです。

 

今日のはウェブカツ!!やってない人からしたらなんのこと?って記事です。

僕のメモのようなもの。

 

DBConnect後のqueryPostという関数を作成しても、その関数の中身がよくわからず。。

自分で調べる+PHPMySQLLesson13を見て、言語化した部分です。

 

 

以下、コード

 

function queryPost($dbh, $sql, $data){

  //クエリー作成

  $stmt = $dbh->prepare($sql);

  //プレースホルダに値をセットし、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に入っているSQL文を実行して!」

 

って意味。このSQL文はtry,catch文の中に出てくる(今回2回つかう)。

毎回SQL文を書くのは大変なので変数$sqlに入れる。($SQLを呼び出して使い回しやすいように)

 

「準備をしろ」がprepareメソッドにあたる。

prepareSQL文の準備をして、exucuteSQL文を実行する。

(いろんなサイトでも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);

  //プレースホルダに値をセットし、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)){

が何度も出てきます。

 

 

 

色々試してみて今の段階でわかったことをまとめておきたいと思います。

疑問に思った部分はココ↓

 

①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 追記】

先日のツイートにウェブカツ生が答えてくれました。

僕の解釈よりもっと納得のいく回答がありまして、

それは

 

「エラーメッセージが上書きされるから」 

 

というものです。 

 

 

 

 

 

 

あとはライカさんもご親切に教えてくださいました。

 

 

ツイッター上ではみんな協力しあっています!すごくいいことですよね!

わからないことがあったら質問の掲示板を見て

疑問に思ったらツイッターに投げかけてみる。

 

バカだと思われてもいいから聞いた方がいいときがありますね。