Title TBD

中途未経験からエンジニアを目指してエンジニアになりました。学んだことなど中心に書いていきます。最近はもっぱらnoteで書いてます。https://note.com/toshi65811

よくわかるPHPの教科書 2周目終えて。1周目で分からなかったことを明確にする

こんにちは。Toshiです。よくわかるPHPの教科書2周目がやっと終わりました。

 

 1週目より早く終わるかと思ったけど、分からないことなど色々調べてたら結局けっこうな時間がかかってしまいました。1周目終了時のツイート👇

 

 

時間こそかかりましたが、理解度は徐々に上がってきている実感があります。1周目は Chapter 5以降はほんとただただ写経って感じだったので、何が行われているか分かっていませんでした。

2周目の今回は「分かる、このコード分かるぞ!」って場面が何度かあり楽しくできました。ですが、それもChapter 6の中盤以降は「やっぱよく分からん😊」となり強引に2周目終わらせた感があるので、3周目はChapter 6の理解度を高く進めたいと思います。

いうてこのテキストでやったことはPHPのほんと1部分でしかないので、作りながら足りない知識を補う作業をしていかないと、知識は身につかないだろうなと思っています。

 

さて、今回の記事では1周目終了時に、よく分からん🤔ってなってたところを、解説記事などから引用して一つずつ明確にしていきたいと思います。

まず、1周目を終えてよく分からんってなってたのは以下です👇 

  1. Cookieってなに
  2. Sessionってなに
  3. MySQLのリレーションの貼り方なんやねん
  4. 変数から値を取り出す方法曖昧
  5. Get, Postの違いとは
  6. htmlspecialchars, ENT_QUOTESとりあえずおまじないとして入力してるけどなんやねん
  7. ->ってどんな働きしてるの
  8. ASって分かるっちゃわかるけど、説明しろと言われたら分からん
  9. fetchってなんや

1個ずつ、自分の各項目に対して持っていた認識と、解説記事からの引用(僕が振り返って読んで、あーそやった!って分かる範囲での引用なので詳しくは元記事参照)という形で誤った認識を正していきたいと思います。

解説記事のほとんどは@_7968_さんが書かれたQiitaの記事を参考にさせていただきました。ほんとうにありがとうございます!PHP超入門シリーズがなければPHPの学習は更に難航を極めたと思います。

@_7968_さんは初心者と書かれていますが、これだけ知ってるのに初心者と名乗るなんて初心者の定義とは…

1. Cookieってなに

自分の認識:ログイン情報とか保存しておくもの。有効期限を設定できて、その期間内(2週間とか)は消えない。

解説記事からの引用

1往復で通信が完了しているため、サーバーは、前のページからの続きなのか、関連したアクセスなのか、以前の状態を全く覚えていません。正式には HTTP Cookie という名称ですが、一般的には略してCookieと呼びます。Cookieは、クライアントに保存された情報のことです。

サーバーからのレスポンスメッセージに「Cookieを保存してください」という指示があれば、クライアントは指示に従い、Cookieを保存します。
クライアントにCookieが保存されていれば、クライアントは、常にリクエストメッセージに「このようなCookieがあります」とサーバーに教える仕組みになっています。

これを ステートレス(stateless) と言います。状態を保持(ステートフル)にするには、どのようにすればいいでしょうか。
答えは単純で、サーバーがクライアントに対して識別できる一意の値を渡し、クライアントはリクエストするときに、その値を教えてあげれば、サーバー側で識別できるようになり、それぞれの状態を覚えることができます。
その役割をしているのが、Cookie(クッキー)です。


HTTPは、リクエストし、レスポンスする、この1往復で通信が切断されます。保存できるサイズに上限があるため、Cookieに様々な情報を保存するという使い方はできません。

また、リクエストメッセージは、偽装可能です。Cookieもリクエストメッセージで送られてきますので、信用できない情報です。そのため、変更されて困る情報を、Cookieで扱ってはいけません。


例えば、商品名や価格をCookieに保存して、その情報を利用して買い物ができるシステムを構築することも可能ですが、リクエストメッセージとして送られてくるCookieは、偽装可能なため、価格を変更して買い物することができてしまいます。このような欠陥を防ぐためにも、変更されて困る情報は、Cookieで扱わないようにしましょう。


Cookieを削除するには、有効期限を過去の時間にしてください。また、Cookieをセットしたときと同じパス、ドメインを指定してください。

 

リクエストメッセージのCookieヘッダにある値は、スーバーグローバル変数の $_COOKIE連想配列として格納されています。
Cookieを削除するには、有効期限を過去の時間にしてください。
また、Cookieをセットしたときと同じパス、ドメインを指定してください。
リクエストメッセージのCookieヘッダにある値は、スーバーグローバル変数の $_COOKIE連想配列として格納されています。

2. Sessionってなに

自分の認識:ページ移行してもデータを保存してくれる。カート内情報とか?良くネットサーフィンしてても、一定時間操作せず放置してたら「セッションが無効になりました。」って出るよね。Cookieに対して、こちらはブラウザを閉じたり、一定時間が立つと無効になる。

解説記事からの引用

セッションとは、一連の処理の始まりから終わりまでを表す概念のことです。

例えば、ネットショッピングの場合、ログインし、商品をカートに入れ、購入まで一連の処理(セッション)として扱いたいですが、序章で説明したとおり、HTTPはステートレスのため、一連の処理(セッション)として扱えません。


そこで第1章で学んだCookieを利用して、一連の処理(セッション)として扱います。具体的には、Cookieに一意の値を入れ、リクエストするときにCookieにある値も一緒に送ってもらうことで、識別可能になり、一連の処理として扱えるようになります。


Cookieを利用することで、セッション管理が行えるということです。
session_start()を記述すると、セッションが開始されます。


先ほど、セッションを管理するには、Cookieに一意の値を入れて、リクエストしてもらうことで、一連の処理として扱えると説明しました。
この一意の値の役割をするのがセッションIDです。


session_start()を記述だけで、自動でセッションIDを発行してくれます。
セッションIDを発行するときに、セッションIDごとにセッションファイルを作成します。


このセッションファイルは、サーバーに作成されます。セッション情報は、サーバー側に保存されるため、Cookieのように偽装されることはありません。
そのため、偽装されて困るデータは、クライアント側(Cookie)ではなくサーバー側(セッションファイル)に保存するようにしましょう。


セッションIDは、個人を識別するために使われる重要な値です。セッション情報は、スーパーグローバル変数の $_SESSION に連想配列として格納されます。


先ほどの $_COOKIE と同じなので、意味は理解できると思います。$_SESSIONは、連想配列で値が格納されていますので、空の配列 array() を代入すれば、セッション情報は破棄されます。
最後にsession_destroy()関数を使って、セッションファイルを削除しています。


セッションファイルは破棄されましたが、クライアントにあるCookieにはセッションIDがあります。
Cookieを削除するには、先ほど説明したようにsetcookie()関数に過去の時間を指定して削除してください。
また、同じパスとドメインを指定してください。

 解説記事読んでなんとなく分かった気にはなっていますが、セキュリティ的にここはかなり重要っぽいので、今後も何度も記事を読み直して知識を確実なものにしていく。

ここで自分なりにCookieとSessionを簡単に説明できないあたり、まだちゃんと分かってないんだなと落ち込みます😇


3. MySQLのリレーションの貼り方なんやねん

自分の認識SQL構文のそれぞれがどういった意味を持つのかが分かっていない。m.id=みたいなやつ

これは2周目のテキストを読んでいく中で理解できました。100%分かってはいなけど、これは使っていくうちに覚える系だろうということで放置でOK.


4. 変数から値を取り出す方法曖昧

自分の認識:なんとなく分かっている。array[‘name’]みたいな感じだよね。2重配列とかあったし、明確にしたい。

取り出し方はあっていたし、Chapter 6の後半に2重配列も出てくるがそんな問題ではないと勝手に完結した。これも使っていくうちに覚える系と判断。


5. Get, Postの違いとは

自分の認識:スクールでもちょっと説明してもらった。GetはURLを長く出来る。なので、SUUMOの検索とかURLを長くしたいときは有効。けど、Getを使うメリットってそんなないから今は基本Postが使われる。Postは裏側でデータを渡す。

この記事を読んで以下のようにツイートしたら、何人かにここ大切だよーって言われたので大切っぽいです。

 

解説記事からの引用

Getとは
GETメソッドの利点は、クエリストリングを付与することで一つのURLとして扱われることです。

PHPというワードで検索した結果のページを別の方に伝えたいときは、http://qiita.com/search?q=PHP のURLを送れば、相手側にもPHPで検索した結果のページが表示されます。これがGETの利点であり、特徴の一つです。

Postとは
POSTメソッドの場合は、メッセージボディに入力した情報を記述してリクエストします。メッセージボディは、URLのように様々なところに情報は残らないので、ユーザー名やパスワードなど第3者に知られたくない情報はPOSTメソッドを利用します。

解説記事読んでも、あまりクエリストリングのあたり。 q=PHP とは?は重要っぽいけどあまり理解できずって感じでした。今後の自分に期待。 

記事にある、「リクエスト数が減れば、表示速度が速くなる?」は目から鱗でした。CSSスプライトはそういうことだったのかと理解した。(1枚の画像の表示位置を変えるだけだから、サーバーへのリクエスト数が減り表示が早くなる。)
「POSTメソッドを使っておけば、安全なの?」も面白い。ここでhtmlspecialcharsの大切さがわかりました😇

 

6. htmlspecialchars, ENT_QUOTESをとりあえずおまじないとして入力してるけどなんやねん

自分の認識:これは2周目やりながら、テキストの該当箇所を見直したりして理解を少し深めた。htmlspecialcharsを使う理由は、<とか’とかhtmlタグとして利用できそうなものを無効化?そのまま表示するようにする。

解説記事からの引用

ユーザーが入力した内容を表示するときは、エスケープする必要があります。
エスケープとは、HTMLなどのコードとして解釈されてしまう " ' < > などの特殊文字を、コードとして解釈されない文字に変換することです。先ほど、リクエスト内容は偽装できると説明しました。


悪意のある人は、HTMLなどのコードとして解釈される文字を入れてリクエストすることで、予期しない動作をさせようとします。


エスケープすることで、このようなことを防ぐことができるため、入力内容を表示するときは、必ずエスケープします。PHPの場合、表示するときに htmlspecialchars 関数を使えば、エスケープして表示されます。

テキストにENT_QUOTESは定義済みの定数で、htmlspecialcharsの安全性をより高めるもの。現段階ではこれ以上知る必要はない。と書いていたのでこれ以上は深掘りしないでおきます。

 

7. ->ってどんな働きしてるの

自分の認識:これもQiita記事を読んで少し分かった。アロー演算子と呼ばれて、インスタンス化したあとに、クラス内のファンクションを利用する際に使用する。

インスタンスのプロパティやメソッドにアクセスするには、アロー演算子と呼ばれれる -> を使います。

認識オッケーっぽい。クラスの考え方を以下記事で学んでから、かなりChapter 5以降でやっていることの意味が分かるようになったので、1周目やっている段階では読まなくてもいいけど、2周目に入る前に読んでおくと「あーテキストのあれはこういう意味か!」となれて楽しいです。

【PHP超入門】クラス~例外処理~PDOの基礎 - Qiita 


8. ASって分かるっちゃわかるけど、説明しろと言われたら分からん

自分の認識:これも2周目をやっていくうちに大分わかった。テキストだとAS cntなどと使われていたな。DB内の要素をカウントした数字などを扱う際に、変数みたいにすると扱いやすくなるからASをつかう。英語でもasって〇〇としてって使うよね。


9. Fetchってなんや

自分の認識:データを取ってくる関数。これも2周目をやっていくなかで、行のデータを取ってくる関数で、データがなくなったらFalseを返すらしい。と学んだ。

PHP: PDOStatement::fetch - Manual

PDOStatementオブジェクトに関連付けられた結果セットから1行取得します。 fetch_style パラメータは、PDO がその行をどの様に返すかを決定します。(PHP manualの説明)

 
PHP Manual読んでもよく分からなかったけど、このyahoo知恵袋の回答が参考になった。回答者さんは界隈では有名な人っぽいな。

$result = $stmt->fetch(PDO::FETCH_ASSOC);
「$stmt(PDOStatementオブジェクト)に対し、SQL文の実行結果として取り出される予定の行の集合から、fetchメソッドを実行するたびに1行ずつ、連想配列形式で取り出すことを指示し、返り値を $result に代入する。」

 自分の当初の認識もそれほど間違ってはいなかったのかなと思う。本当はもっと深い話なのかもだけど、今はデータを取ってきてなくなったらfalseを返すくらいの理解でいいのでは。 

10. =?に値はどう渡ってるんや

自分の認識:これは1周目終わったときはあまり問題視していなかったけど(意味分からずとりあえず写経してたから)、2周目のChapter 6を進めていて理解が低いときはここが絡んでいたように思う。

SQL文の中で=?が使われて、それ以降のPHPの文章で値が?に入っているんだと思うけど、そこがどう入っているのかよく分からない。どのコードによって?に値が入れられているのかが謎。

という疑問を持っていましたが、もう一度テキストを見返して
?の部分は、次の行で実行されるexecute内で指定して、その値が?に入るようだと分かって納得できました。

 

2周目を終えて

1周目を終えて持っていた疑問は、大抵テキストにちゃんと書かれていたなという感じです。テキストちゃんと読もうね、おれ。

とはいえ、Qiitaの記事など読んで全体像がぼんやり見えてきたことによって、テキストに書いてあることが理解できるようになってきて「これテキストに書いてたやん!」と余裕をもって気づくことが出来たのかなと思います。

3周目はChapter 5,6などのみを中心に取り掛かり早めに終えて、次のWordpressに突入します💪😇💪