Udemy「PHP+MySQL(MariaDB) Webサーバーサイドプログラミング入門」をガチでレビュー 前編

code

セールで購入したUdemy講座の2本目、Youtubeでもお馴染み「たにぐち まこと」さんのバックエンド講座です。“ともすた”の方が馴染みがあるかな?

ブラウザ上で動作が確認出来るフロントエンドの方が勉強しやすいと思い、そちらを中心にこれまで勉強してきましたが、ポートフォリオサイトでもバックエンドを用いた成果物を作ってみたくこの講座を購入しました。あとはPHPで作られているWordPressの裏側でどんな動きをサポートしてくれていたのかもこの講座で学べました。

全12時間の講座になるので前回の「ガチ、フロントエンド」の約半分、サラッと出来るかな?と考えていました。しかし、なかなか内容のある講座で、バックエンドに不慣れということもありますが、完走まで11日掛かりました。今回も復習も兼ねてのレビュー記事になります。購入の際の参考になれば幸いです、コンテンツを侵害する意図はありませんし、この記事だけで「なるほど、ハイハイそのカンジね」と思う人はもう十分バックエンドの知識あるでしょ(笑)

Sec1 PHP開発環境

“1”Udemyでの学習の進め方について 言われている通りですが、大事なのは「質問の仕方」です。「わかりません」「動きません」では講師も答えようがないので、まずは「Q&A」を読み同じ箇所で躓いている人がいないかをよ~く探してください。かなりの確率で既に欲しい回答は記載されていると思います。ちなみに本講座は3年前なのか?少しだけ内容が古い箇所もありますので、その点も踏まえて「Q&A」を参照してください。それでもわからない・解決しない場合は自分の症状・試したことなどを詳しくまとめ質問してみてください。

Sec5の最後の方に「~~の件で」と質問している人がいて、講師が「○○を確認してみてくれますか?」と答えたにも関わらず「原因わかりました。ありがとうございました。」とだけ残して去っていく質問者さんがいましたが、それでは他の受講者が「おっ!これだ…えっと……”原因”って何だよ!それくらい書いてけよ」となるので質問放置はやめましょう。「~~が○○だったみたいです。解決です、ありがとうございました。」くらいは残しておきましょう。

“2-3”VSCodeChromeダウンロード 1:38~設定変更はやっておきましょう。ちなみに僕は以前ダウンロードした際にこの項目をスルーしていたので右クリックで「VSCodeで開く」がありませんでした。今回チェックを付け直し再インストールを試みたところ、拡張機能も引き継いでくれて、面倒な変更は無し。しかしこれは環境によって動作が異なる可能性も…一応スクショは撮っておきました。

“4-5-6-7”MAMP-XAMPP 僕はMAMPを使ってますがDocumentRootの設定が変更されていたみたいでなかなか最初のブラウザが開けなかった…「MAMP\htdocs」が「localhost:8888」に置き換わりそこから「フォルダ名/ファイル名」となるイメージです。質問にも寄せられていますが「MySQLが青にならない」がたまにあります。デイトラでもMAMPを使用していましたが、MAMPには機嫌があります(笑)急に青シグナルが付かなくなることがたびたび、何か他のソフトと衝突し邪魔になっているのでしょうが、MAMPやパソコンを再起動するか、それでもダメならMAMPの再インストールになるかも…

“8-9”素材ファイルをダウンロードしそれをMAMPのhtdocsの中にコピー、DocumentRootの設定はここに繋がっています。

Sec2 PHP基礎

“10”print とりあえず文字を表示「PHPはechoじゃないの?」と思いましたが、このレッスンではprintで進みます。(あとでprintとechoの違いもまとめます) ”11”計算 余りを求める剰余算はイメージしにくいですが、あとはまぁ言われた通り “12”現在の時刻 date()で時刻を取得しパラメーターを指定、例えばdate(‘G時 i分 s秒’); 日本時間に変更するのはMAMPの場合はconfigではなくconfで、さらにMAMPで動かしてるPHPのVerのphp.iniをメモ帳で開き(VerはMAMP→preferences→PHPで確認できます、僕のはVer7.4.1でした)date.timezone=Asia/Tokyoに変更。

“13”文字列連結 print(‘’現在は’ . date());のように「.」で繋ぐですが…「+」のほうがわかりやすいですよね。なぜ「.」にした?ちなみにJavaScriptは「+」で繋ぎます。”14”オブジェクト指向 「様々なメソッドが入っているのがオブジェクト」なるほど…オブジェクトの方が後で変更したくなった時に修正が楽。”15”変数 <?php?>の外にも「合計金額は」など書いてますが、これはhtmlで表示されてますよ。<?php?>内はPHPで出力したいものですから。「$」で変数定義がPHP、同じ使い方をしたものでJavaScriptでは「constやlet」でした。

“16-17”whileとfor文 どちらが優れているというわけではありません、場面ごとに使い分けられることが大事です。+1をしないと無限ループが起こり、パソコンに負荷がかかるので気をつけてください。

$i = 1;
while($i <= 365) {
  print($i . "\n");
  $i = $i + 1;
}
for ($i = 1; $i <= 365; $i++) {
  print($i . "\n");
}

この2つの出力結果は同じ「1~365が縦に」ですが、for文の方が記述が少ないですが、初期化・更新処理が複雑な場合はfor()内に無理に書き込もうとすると読みにくくなるので、やはり使い分けが必要。for文の中の「;」で区切りますが、「,」だったかな?とたまに迷います……1ずつ足す$i++は「インクリメント」1ずつ引く$i–は「デクリメント」というそうです。

“18-19”カレンダー strtotime()は「文字列で指定したものをtimestampに変換」この先のレッスンでは出てきませんが、「こんなのもあるんだな~」くらいで。カレンダーなのでstrtotime()内に+1day +2day +3dayと繰り返し構文で更新していく、をします。

“20”配列 $week_nameという配列に[‘日’, ‘月’~~]を用意し、$week_name[date(‘w’)]と組み合わせ$week_name[0]なら「日」、$week_name[1]なら「月」~~~が表示。今日が金曜日なら$week_name[]に「5」が入り画面表示は「金」となります。“21”連想配列とforeach ‘apple’=>‘りんご’, のように「keyと値」を結び付けます。foreach($fruits as $english => $japanese)で「$englishにapple、$japaneseにりんご」が入る。この後も都合よく「as」が使われることがありますので「~として」と呼んでおきましょう。

“22”if これは言われるままですが、elseの条件を増やすと「else if」と書きます。たま~に見かける記述でRubyでは「else if」ではなく「elsif」と書いたります……「Rubyには{}がないので~~」だったかな。“23-24”切り上げ・切り下げ floor()少数無し、ceil()は少数切り上げ、round()が四捨五入、sprintf()は書式・桁数を揃える、この辺は覚えずに「へえ~そう」でいいです。

“25”file_put_contentsを使って別ファイルに内容を書き加えます。これはバックエンドっぽいですよね。「階層」の話は重要で「パスが違う」とかいわれる、アレに関わります。1つ上階層に行きたいなら「../」とします。Sec4-5ではこういったファイルやデータベースへのデータの送信・書き込みがメインですので、file_put_contentsは使いませんが(笑)このデータのやり取りの流れは理解しておきましょう。1:58辺り猫か何かが鳴いてる?“26”file_get_content を使ってデータを取得しprint()で表示。readfile()も同じ動きですがこちらは表示だけ。getは取得するだけでprint()がないと画面に表示できません、しかし取得したデータを再利用・加工する際はgetが必要です。

“27”simplexml_load_file XML情報を……バックエンドの領域では大事なんでしょうが、本講座においてこの後で全くカケラも登場しません。”28”JSON 聞いたことはある用語ですが、これもここだけの登場です。XMLより短く分かりやすく書けるのがJSONだそうです。json_decode()で取得

“29-30”フォーム 属性が次々出てきます。デイトラでもお問い合わせフォームが難関でした。<label>のforでinputを結び付けてラベルクリックでinputに入力も出来ます。<input>のname属性はform送信時phpに渡される、valueは初期値ですがplaceholderの時もあったような(placeholderは“見本”でした)、それを<form>で囲みaction=に送信先を入力(今回はsubmit.php)

method=がgetなら受け取る側も$_GET、postなら受け取る側も$_POST、URLに値を表示するのがget、表示したくないのがpost、$_REQUESTならどちらも受け取れるが、どっちで送ったか把握できるなら$_GETか$_POSTかを指定する必要がある。

受け取るsubmit.php側で

お名前: <?php print(htmlspecialchars($_REQUEST['my_name'], ENT_QUOTES)); ?>

これはSec5で何十回と出ますので、覚えておきましょう。

<?php print($_REQUEST['my_name']); ?>

これでも表示できるが、セキュリティ上問題があり、そういう所も解説してくれるのは助かる。htmlspecialcharsはhtmlタグなどを”逃がす・エスケープ”悪意のあるユーザーがJavaScriptなどでプログラムを攻撃することが出来る、これは別タブでリンクを開く<a target=”_blank”></a>でも聞いた話とつながる。ENT_QUOTESは「どのようにエスケープするのか」他にもあるようですが、基本はENT_QUOTESでいいみたいです。ちなみにSec5で「$_REQUESTでURLパラメーターを取得します」と何十回と出てきますが、ここのことです。

“31”ラジオボタン・チェックボックス 実際に送信されるのはvalue属性であって画面に表示されている選択しではない。”32”チェックボックスの値は配列で送られるため、valueは1/1, 1/2, 1/3と異なるがname=’reserve[]’の同じ形にし、受け取る側はforeach($_POST[‘reserve’] as $reserve) {}配列で受け取る。

“33”半角数字に直す if(is_numeric($age))で「$ageが数字だったら~」になり、mb_convert_kana($age, ‘n’, ‘UTF-8’);で「$ageを半角数字に直す」”34”正規表現で郵便番号 if(preg_match(‘/\A\d{3}[-]\d{4}\z/’, $zip))で「$zipが先頭からd{3}-d{4}で終わるものだったら」になります。d{3}→数字が3つ並ぶ、\A→ここが先頭、\z→ここが最後

“35”headerで別ページへ header(‘Location: ~~~URL~~~’);exit(); これだけです。これもSec5の掲示板で「ログインしたら投稿ページへジャンプ」などよく使う機能です。”36”剰余算 10÷3=3…1の”余り”を求める計算で、10 % 3 = 1と“商”の部分は無視されます。行のストライプ柄はnth-child(2n)とか使えば別の方法でも出来ますね。

“37”cookie 前回入力したメールアドレスやパスワードを次回使うために記憶しておいてくれて簡単に表示できる機能です。setcookie()で設置して、呼び出す側では$_COOKIE[]を使う。$valueなど変数は画面を跨ぐ際に消えてしまうのでcookieやsessionが必要になるがセキュリティ上多用するものではない。”38”session 一時的にデータを保存したいだけならsessionを使います。Sec5では会員情報を入力し確認画面へ飛ぶ際に画面を跨ぐので使用します。送信・受信両方にsession_start();で準備完了、$_SESSION[‘session_message’] = ‘セッションに値を保存したよ’;とデータを格納し、呼び出す側ではprint($_SESSION[‘session_message’]); cookieはブラウザに保存でしたが、sessionはサーバーに保存なので安全性は比較的高い。

Sec3 データベース基礎

“39”画面上でSQLを操作する「phpmyAdmin」を使ってデータベースをいろいろ動かす、から始めます。GUIとかCUIってやつですね。実は1周目で照合順序を「uft8mb4_general_ci」ではなく「uft8_general_ci」で講座を進めてました。デイトラではこれだったような、特に問題はなかったですが…詳しく触れてませんが調べてみると、“照合順序”は文字と文字の並びや比較のルールなんだとか。uft8mb4は1文字に4バイトでutf8は3バイト…なんのこと?絵文字の寿司とビールが同じ扱いになる「寿司ビール問題」とか以前言われたそうですが、mb4にしておけば良さそうです。

“40”コマンドラインやターミナルは全くわからないので……  SELECTとかFROMとか意味が推測できるのは助かる。INSERTはINTOも必要だけどね。”41”テーブル my_itemsという商品データを管理するテーブルをCREATE TABLEで作ります。”42” UPDATEDELETEで変更・削除 WHERE id=1など「どこを」を指定しないと全部変わってしまうので注意。”43-44”idなどの重複を防ぐプライマリキー(主キー)と自動で番号を増やして付けてくれるオートインクリメント(A_I) 使うのはidくらいじゃないかな。”45”構造の変更 なるべく変更はしないように最初のテーブル設計が重要

“46”WHEREで条件指定 「priceが180より小さいもの」が欲しい時はWHERE price < 180のような書き方になる。「keywordに“甘い”を含む」はWHERE keyword LIKE ‘%甘い%’になります。”47”timestamp型は生成・変更した時刻を表示、SUMは合計ですがExcelっぽいですね、MAX・MIN・AVGはそのまま。

”48”これは難しい!! テーブル同士を繋げるリレーション 「my_itemsテーブルのいちごを作ったのはmaker_id=1の人」「makersテーブルのid=1は山田さん」これを結び付けます。

SELECT * FROM my_items, makers WHERE my_items.id=1 AND my_items.maker_id = makers.id

読み方は「my_itemsとmakersテーブルの、my_items.maker_id と makers.idが同じ値の、my_items.id=1のものを表示して」になります。テーブル1つずつだけではなく、この機能があるからデータベースの威力が発揮されます。

“49” 並び替えORDER BY id DESCで「idが大きい順」4→3→2→1が表示されます。小さい順はASCですが、値段が小さい順など使う場面は少ないし、そもそもORDER BY priceだけで「値段が安い順」になります。”50”商品ごとの集計など少し複雑な場合は

SELECT item_id, SUM(COUNT) FROM carts GROUP BY item_id;

「cartsテーブルの、item_idごとに、item_idとCOUNTを合わせたものを表示」になります。”51”「0個」も表示したい時にLEFT JOIN “52”重複無しはDISTINCT、price >=50 AND price<150はprice BETWEEN 50 AND 149で同じ表示になります。id=1 OR id=3はid IN (1, 3)で同じでこれは数が多い時に便利、LIMIT 3で3件だけ、FROMの中でテーブルに別名を付けるFROM my_items i, carts c すると他の箇所でc.item_idと省略できる。Sec5で何度か使います。

“53-54”バックアップ WordPressのようにエクスポートとインポートです。どの画面の状態でエクスポートを押すかで取り出すデータが変わるので注意。最後にコップを“”コンッと置きます。

おまけ「printとecho」

「PHPってechoじゃなかったっけ?」と思ったので調べてみると思わぬところで解説されていました。同じくともすたさんのUdemy講座「PHP7/8プログラミング マスター講座」のプレビュー動画にありましたし、Youtubeのチャンネルにもありました。printはパラメーターを1つしか取れない、echoは「,」で区切るとまた出力できる、という違いがあり、

<?php
print ‘PHPで出力’;
echo ’1つ目の文章’,  ’2つ目の文章’,  ’3つ目の文章’;
?>

printもechoも関数ではなく()が要らない、今ではechoが一般的なんだとか。echoも面倒くさい人はショートタグという書き方もあります。

<?= これがショートタグです ?>

‘シングルクオーテーション’と”ダブルクオーテーション”の違いの方が思わぬ収穫でした、詳しくはYoutubeのほうへ。

タイトルとURLをコピーしました