ウェブカツでプログラミング学習してみた結果【76日目】

この記事は私と同じプログラミング初学者の方向けに書いています。自分なりに調べたことややってみたことについて書いていますが、もしもプログラミングに詳しい方から見て内容に間違いなどありましたら、ご指摘いただけますと幸いです。
 
 
こんにちは!
 
スポーツ好きな方々がラグビーで盛り上がっていますが、トライと聞いてももはや try 〜catchのことしか思い浮かばなかったmatokoです。(プログラミング脳)
 
さて、「ウェブカツ」というプログラミング学習サービスに女性割引で入部してから今日ではや、76日目となりました。
 

f:id:wmatoko:20190812144819j:plain

 
ここまでのプログラミング学習の進捗はどうなったでしょうか?
 
 
書いていきたいと思います!
 

 

プログラミングにかけた学習時間

ここまでのトータルが
 
ウェブカツ  97時間27分 

自習  95時間21分 
 
となりました。
 
 

前回の更新から今回までにやっていたこと 

主に、ウェブカツのWEBサービス部を学習していました。
 
WEBサービス部とはなんぞや?という一般の方に説明しますと、フリマサイトを例として、実際のWEBサービスを作っていく練習ができる講座です)
 
進捗具合は、レッスン14のプロフィール編集機能を終えてコーヒーブレイクを読み終わったところまで。
 

WEBサ部の学習方法について

WEBサ部の学習方法については人それぞれで色々あるみたいですが、私は動画視聴だけだと受け身になって眠くなってきてしまうため、
 
相変わらず印刷した紙に(動画を一時停止して説明を聞きながら)変数の中身などを書き込んでいき、
 
処理の流れや他のファイルとの関係を確認していく、というスタイルをとっています。
 
わからない箇所が出てきたら都度、var_dumpして変数や配列の中身を確認。
 
机の上が紙でワサワサしてとっ散らかってきましたが、私にはこの方法がわかりやすくて合っているみたい。(時間はかかるけど…)

写経は本当はした方がいいのかもしれませんが、まだしていません。
 
最近アウトプットしていないことが気になっているので、
 
レッスン16まで終わったら小さなミニアウトプットみたいなものを作りながら、そこで写経も兼ねて書いていくことにしようかなぁと。
 
 

WEBサ部の感想と、学習する上で苦労した点

初っ端、レッスン9・10のユーザー登録でなんとトータル4日間位も詰まりました…。
 
PHPの復習は結構ガッツリやったし、データベースに登録くらいはまあまあいけるはず♪と思っていたのになんてこった。
 
原因がわからずにウンウン一人で悩んでいましたが、さっさと皆の質問欄を見ればよかったです(^_^;)
 
ユーザー登録で苦労した原因は多々ありますが、一番はたぶん、私がPDOのエラーモードを理解していなかったこと。
 
(エラーモードについては気になって色々調べたので、下の方で別途、調べたことを載せています)
 
ヒイヒイ言いながら最初のユーザー登録をなんとか終えましたが、それ以降のコーヒーブレイクまでに関しては、
 
意外にも印刷した紙を突き合わせながら丁寧に見ていけば、説明されてる内容の意味がどう〜〜してもわからない!みたいなことは意外とないかも…?という印象です。
 
(自分で実装できるかどうかはまた別ですが…!!)
 
デバッグが登場してから以降はちょいちょい日本語も挟んで処理の実況中継がされるので、
 
むしろウェブカツ公式のコメントが増えたような感じで、今なんの処理をしているところなのかがわかりやすくなった気が(*´∀`*)
 
WEBサ部の難しさは、個別の処理が何をしてるのか全然わからん!!というよりも、
 
色々スゴイ技を沢山授けてもらったけど、いざ自分で作るとなるとこれをどう組み立てたらいいのかわからーん!!という、設計の方にあるのかもしれませんね(自分もそうなる姿が目に浮かぶ…)
 
でも、これからWEBサ後半の商品登録部分に入るとまた難しくなるという評判なので、
 
後半以降、個別の処理だけど何をしてるのかわからない!という事態になってくる可能性もまだありますが。。
 
油断は禁物ですね。
 

これからWEBサービス部に入る人へ伝えたいこと

まだWEBサ部を前半部分しか進んでいない私が言うのもなんですが、
 
WEBサ部の動画は見ている最中に「ん?」と引っかかるところがあっても、必ずその回の動画をまず最後まで通しで見た方がいいです!
 
なぜなら、「ん?」と思うところがあっても、かなりの確率で公式動画の方にあとあとちゃんと解説が出てくるから。
 
私は疑問が湧くとソワソワしてすぐ検索したくなってしまう性格なのですが、
 
動画を一時停止してネットを徘徊
→自分で調べてまとめる
→少しあとにもっとわかりやすくまとまった情報がウェブカツで出てくる
→最初からこっち見ればよかったやん!?
 
ってなるのをすでに何度かやらかしています…\(^o^)/
 
検索する気合がある(?)のはよいことかもしれませんが、疑問が湧いた瞬間に動画を止めて一人で悩み始めたり、アレコレ検索に入ると、
 
普通に通しで動画を見ているだけよりも効率が悪くなってしまう可能性が!
 
私は恥ずかしながら、レッスン10でエラーログの画面がチラッと映ったシーンで、
 
「あっ!お手本の画面は日本時間表示になっているのに、私の画面はなっていない…!?どうしよう!!直さなきゃ!!」と動画を一時停止して検索し始め、
 
MAMPのエラーログを日本時間表示に設定する」のを先走ってやってしまってから、
 
公式動画の後編でバッチリその設定する方法の解説がなされており、(自分に)ズコー!!となったりしました。
 
過去の自分に言いたいことは、ちょっとくらいすぐに理解できない部分が出てきたり予定と違うことが起きても死にゃーしないんだから、
 
慌てず騒がず落ち着いてそのまま動画見よ…?ということですw
 
たいてい、途中で「ん?」と思ってもそのまま動画を見続けていれば解消されることが多いです。
  
疑問を放置しておくのがなんとなく気持ち悪いという私のような人は、疑問が湧いたらとりあえず「あとで調べる」リストに放り込んでおき、
 
まずはその回の動画を全部見て、皆の質問欄も全部見てから、
 
それでもまだその疑問が消化されずに残っていたら、その時点でグーグル検索すると効率がよいのではないでしょうか。(自戒をこめて…)
 
このように「 その回の動画はとりあえず最後まで全部見る」を心がけると、
 
完成後の画面を予め先に見ているだけなのに「あれ、お手本の画面どおりに現在時点でなってない、大丈夫かなぁ。。」などと無駄に悩む事故も防げますよ!(←私です) 
 

アウトプット物

この二週間主にWEBサ部のインプットばかりしていたため、ネタがありません。
 
その代わりと言ってはなんですが、私が理解不足だったためWEBサ部のユーザー登録で大いに苦しむ原因となった、

PDOのエラーについて調べたことを書いていきたいと思います。
 

PDOのSQLエラーは、別途で設定をしないと表示されてこない

PDOとは、データベースに接続できるようになる便利なやつのことです(雑)
 
本当に、先日までPDOに対してその程度の印象しかなくて、そもそもエラー潰しをする上での大前提をそもそも私は間違えておりまして。
 
PHPって
 
error_reporting(E_ALL);
ini_set('display_errors', 'On');
 
と書いていればすべてのエラーが画面に表示されそうなイメージがありますが、実はそうじゃなかったんですよーー。(衝撃)
 
普通のPHPの文法エラーなどはこれを書いておけば画面にエラーが表示されるのですが、
 
実はその設定以外にも別途で設定しておかないとエラーが表示されてこないものがあり、それがこのPDOのエラーなんです。
 

この、PDOのエラー設定をちゃんとしていないと、中のSQL文の書き方が間違っていても何もエラーが出てこなかったりするそうで。

 

私がWEBサ部のユーザー登録編で苦しんだのは、ここの部分のエラーが表示されてこなかったため、どこを直せばいいのかわからなかったせいだったんです。

 

目に見えてこないエラーは直せませんから、当然ですね^^;

 

では設定の仕方はどうやって設定するのか?というと、自分でPDO::ATTR_ERRMODEというモノを下記の3つのうち、どれかに設定していく必要があります。

 

 PDO::ERRMODE_SILENT

 

PDO::ERRMODE_EXCEPTION

 
PDO::ERRMODE_WARNING

 

※書く場所はデータベースに接続する時です。

PDOからデータベースハンドラを作り出す時に

$dbh = new PDO($dsn, $user, $password, $options)

のように書きますが、その$optionsの中に連想配列形式で入れればOK。

 

$dsn = 'mysql:dbname=XXXXXX;host=localhost;charset=utf8';
$user = 'root';
$password = 'root';
$options = array(PDO::ATTR_ERRMODE => PDO::ERRMODE_SILENT);

 

みたいな感じです。 

 

PDOのエラーモードを、3つの設定にしてみた場合の動き

 では、それぞれの機能を調べたついでに、(自分が納得するために)実際に動かしてみた時の挙動をメモりましたので、書いていきたいと思います。

※サンプルは私がPHPの練習として以前作った、画像アップロードのミニアウトプットを使っています。

 

エラーが出ていない正常な状態では、ファイルを選択して「画像を投稿」ボタンを押すと、

 

・選択した画像ファイルをサーバーフォルダ内に保存し、画面上に表示させる

 

・データベースに画像ファイルの名前が登録される

 

という仕組みになっています。

 

ちなみに2つの処理はつながっていないので、仮にデータベースの登録に失敗しても、画像表示の処理には(直接は)影響しません。

 

↓正常な状態の動きの例。

データベースに画像ファイル名(01.jpg)の登録をしつつ…

f:id:wmatoko:20191013222244p:plain

正常にデータベースに登録がされている

 

↓画面上に画像が表示される。

f:id:wmatoko:20191013222224p:plain


この段階でサンプルコードにはすでに

 

error_reporting(E_ALL);
ini_set('display_errors', 'On');

 

を記載済みなので、

 

たとえば「<?php」の部分とかをちょっと壊して、

「<?p     hp」とかにすると、シンタックスエラー(文法が間違っているよエラー)はすぐに出てきます。

f:id:wmatoko:20191013222736p:plain

一般的なPHPエラーは、普通に表示される

 

この状態から、(先程壊した部分を元通りに修復し)再度それぞれのケースを見ていきます。

 

 PDO::ERRMODE_SILENTの場合

データベースに画像ファイル名を登録するSQL文、


$sql='INSERT INTO product (gazou)VALUES(?)';

の中身を適当に壊して、

 

 $sql='INSERT INTOOOOOOO product (gazou)VALUES(?)';

のようにいじってみます。

 

一見、画面上には新しく選択した画像が表示され、処理がうまくいったかに見えますが…。

f:id:wmatoko:20191013225316p:plain

画面には画像を表示できたものの…?

 

データベースの方をよく見ると、なんと画像ファイルの名前が登録できていません。こちらの方の処理が、失敗しているのです。

f:id:wmatoko:20191013225533p:plain

データベースの中はからっぽ

しかし、画面上になにもエラーメッセージは出てこず。(しつこいようですが、ファイルにini_set('display_errors', 'On')を書いていても、この通り出てこないのです!)

 

まじかーー!!これでは一瞬、処理がうまくいったのかと、勘違いしちゃうじゃないか。

 

調べたところ、SILENTは

 

SQL文に書き間違いがある場合でも、画面にエラーが表示されない

・エラーメッセージが表示されずに後続の処理がそのまま走る

 

とのこと。

 

WEBサ部のコードでも試してみたんですけども、実は処理に失敗してるのに後続の処理がそのまま走るから、

 

実は処理に失敗してるのに(しつこい)、エラーメッセージはなんら表示されないまま、その後のログイン(画面遷移)とかは普通にできちゃったりするんですよね。

 

まぎらわしい!

 

 しかもこれ、何も指定しないとPHPはデフォルトでこの設定になってるんです(何故なの…?)。おそろしや。

 

絶対初心者は、皆一回は引っかかってると思う…

 

 

PDO::ERRMODE_EXCEPTIONの場合

先程と同じく、データベースに画像ファイル名を登録するSQL文、


$sql='INSERT INTO product (gazou)VALUES(?)';

の中身を 

 $sql='INSERT INTOOOOOOO product (gazou)VALUES(?)';

のように壊したまま、

 

PDO::ATTR_ERRMODEの部分だけを、PDO::ERRMODE_EXCEPTIONに変えてみます。

 

すると…ドン!

f:id:wmatoko:20191013231322p:plain

SQL文の書き間違いが、PHPエラーとして表示された

で、出た〜!!

 

待ってたよこの画面を。

今までエラーが出るとちょっと嫌〜な気持ちになっていましたが、普通にエラーが表示されるってめちゃくちゃありがたい…!!

 

調べてみたところ、EXCEPTIONは

 

SQL文に書き間違いなどのエラーがある場合、画面にエラーを表示してくれる

・エラーが発生した時点で 処理の実行を停止させる

・PDOException(例外)がスローされるので、trycatch構文でキャッチすれば処理を分岐させることが可能

 

とのこと。

 

例外とエラーの違いについて書き出すとまた長くなりそうなのでここでは書きませんが、

 

とりあえずEXCEPTIONを使うとエラーを表示できるだけでなく、処理が失敗した場合と成功した場合の分岐もできてより便利!という感じみたい。

  

私が使ってみた感想としても、画面上にエラーメッセージだけが表示されて失敗していることが見た目にわかりやすいし、

 

最初に処理が引っかかった行だけのエラーメッセージが書かれるので、どこで引っかかったかがわかりやすくてこれが一番好きだな!と思いました。

  

世間的にも、とりあえずこれを選んでおくのが一番無難ってことになってる模様。

 

ウェブカツのユーザー登録編では、デフォルトのままサイレントになっていましたが、躓いて経験値を積めるよう、わざとこの設定になっていなかったのでしょう。

 

結論的には開発中はEXCEPTIONを使えばOKってことで、なんだかここで話が終わりそうな雰囲気になっていますが、

 

一応WARNINGの方も調べたのでお暇だったら見ていってください。 

 

PDO::ERRMODE_WARNINGの場合

先程と同じく、データベースに画像ファイル名を登録するSQL文、


$sql='INSERT INTO product (gazou)VALUES(?)';

の部分を 

 $sql='INSERT INTOOOOOOO product (gazou)VALUES(?)';

のように壊したまま、

 

PDO::ATTR_ERRMODEの部分だけを、PDO::ERRMODE_WARNINGに変えてみます。

 

すると…ドン!

f:id:wmatoko:20191013233050p:plain

画面上に画像は表示されているが、エラー文も表示されている

f:id:wmatoko:20191013233207p:plain

SQL文の処理に失敗しているので、データベースへの登録はされていない



調べてみたところWARNINGは

 

SQL文に書き間違いなどのエラーがある場合、画面にエラーを表示してくれる

・エラーが発生しても、後続の処理は停止されずにそのまま走る

 

とのこと。

 

なるほど、だからデータベースに登録する処理に失敗したのに、

 

(エラーメッセージは表示されつつも)後続の処理はそのまま走って、画面上に画像は表示されたんですねえ。

 

 ちなみに他のコードでも試してみたのですが、後続の処理は停止されずにエラーになった箇所はすべてエラーメッセージが表示されるので、

 

ひとつの失敗した処理が他の部分にも影響していた場合、たくさんエラーメッセージが表示されてめっちゃ長くなるな…!!と感じました。

 

慣れてる人は長いエラーメッセージを見ても平気なのかもしれませんが、初心者にはやっぱり一個ずつエラーが表示された方がエラー潰しがやりやすいと思うので、

 

(開発中は)やはりEXCEPTIONがベストかなぁと思いました。

 

おまけ(?) DB接続部分では、PDOは普通にエラーが表示される

というわけでSQL文の失敗をエラーとして表示させるのには別途設定が必要、という話でしたが、

 

データベース接続部分で失敗した場合にエラーを表示させるのにも、このエラーモードの設定が必要なのかな?ということが気になりますよね。

 

試しにSQL文でなく、DB接続部分でコードを下記のように壊してみたところ、

 

$dsn='mysql:dbname=illustration;host=localhost;charset=utf8';

$dsn='mysql:dbname=illuuuuuuuustration;host=localhost;charset=utf8';

 

データベース接続部分に関してはSILENTにしていても(というか3つの中のどの設定にしていても)ちゃんとPHPエラーを出してくれました。

f:id:wmatoko:20191013234535p:plain

PDOから$dbhを作成する行で、エラー文が出る

 

どうやら、データベース接続部分に関してはPDO::ERRMODEの設定に関係なく、失敗したらエラーが表示される仕様になっているみたいです。

 

 

以上、 ウェブカツでプログラミング学習してみた結果【76日目】

の記事でした!

 

 

前回の記事はこちら↓
 
 
オンラインプログラミング学習サービス、「ウェブカツ」へのリンクはこちら↓
 
 
※この記事はプログラミング初学者の個人の感想・プログラミング学習の進捗記録であり、お金を貰って特定のプログラミングスクールを勧めるアフィリエイト記事ではありません。