Upgrade to Pro — share decks privately, control downloads, hide ads and more …

PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組...

 PHP初心者セッション2026 〜生成AIでは見えない裏側を知る:今だからLAMPを通して仕組みを学ぶ〜

PHPカンファレンス2026のセッション資料です。
LAMPの仕組みを知って、生成AIの書いたコードの理解を深めましょう。
実際のセッションの内容とは異なる場合があります。

Avatar for Hideo Kashioka

Hideo Kashioka

July 19, 2026

More Decks by Hideo Kashioka

Other Decks in Programming

Transcript

  1. @kashioka X(旧Twitter) 有限会社アリウープ 代表取締役社長 有限会社アリウープ 柏岡 秀男 / @kashioka • PHPカンファレンス初回より初心者向けのセッション

    を話しています。 • Webアプリケーション開発を生業としています。 • アジャイル開発が好き。 • AIをフル活用してプロジェクトを進めています。
  2. このセッションの対象者 1 PHPを未経験から学びたい方 プログラミングが初めてでも OK。今日の 実習は全手順を追える構成です 2 新人教育のヒントが欲しい方 会社で教える立場の方へ。構成ごと持ち 帰って研修に使えます

    3 生成AIで開発を始めたい方 AIに書かせる前に、出力を見極めるため の「裏側」を知りたい方 どれか1つでも当てはまれば、今日は持ち帰るものがあります。
  3. LAMPとは PHPを動かす、いちばんメジャーな組み合わせの名前 1. LAMPを知る L Linux OS(土台) A Apache Webサーバー

    M MySQL / MariaDB データベース P PHP プログラム言語 Webサービスの定番セットの頭文字。次の 4ページから一つずつ紹介します。
  4. OS(Linux)とは LAMPの「L」 L OS(Linux) 土台 ひとことで言うと:コンピュータ全体を動かす基本ソフト 1 アプリとハードウェアの仲介役 PHPもApacheも、OSの上で動く「アプリのひとつ」 2

    サーバーの世界では Linuxが主流 無料で安定していて、自動化がしやすい 3 今日は手元の OSでOK WindowsやmacOSが土台の代わりになる ※ 本番サーバーに触れるころには理解が必要。本日は概要のみ覚えてください。 1. LAMPを知る
  5. Webサーバー( Apache)とは LAMPの「A」 A Webサーバー( Apache) 受付係 ひとことで言うと:リクエストを受け取り、結果を返す受付係 1 URLとファイルを対応付ける

    /php-beginner/ → htdocsフォルダの中のファイル 2 .php はPHPに処理を依頼する HTMLや画像はそのまま返す 3 同様のサーバとして nginx などもある その場合はLEMP? 1. LAMPを知る
  6. DB(MySQL / MariaDB)とは LAMPの「M」 M DB(MySQL / MariaDB) 倉庫 ひとことで言うと:データを表の形で保存しておく倉庫

    1 表(テーブル)で整理して保存 Excelの表に近いイメージ。行= 1件のデータ 2 SQLという専用言語で読み書き SELECT(読む)/ INSERT(書く)/ DELETE(消す) 3 ページを閉じても残る 消えてしまう変数と違い、「残すこと」が仕事 ※ XAMPPに入るのはMySQL互換のMariaDB。他に PostgreSQL という人気DBもある。 1. LAMPを知る
  7. PHPとは LAMPの「P」— 今日の主役 P PHP 今日の主役 Web開発に特に適した、 汎用スクリプト言語( php.netの定義より) PHP

    </> HTMLページ 今日のメイン。Webページを組み立てる { } API(JSON) スマホアプリ等の裏側のデータ窓口も作れる >_ コマンドライン バッチ処理や作業ツールも書ける ※ 世界中のWebサイトで広く使われている(WordPressもPHP製)。今日は「HTMLページを作る」使い方だけを学びます。 1. LAMPを知る
  8. 最初に全体像 URLを開いたとき、裏側で何が起きる? 2. 全体像をつかむ URLを開いたとき、 裏側で何が 起きている? http://localhost/php-beginner/ 1 PHPはサーバー側で動く

    ブラウザの中ではない 2 Apacheはリクエストを受ける係 Webサーバーが玄関になる 3 DBは必要なときだけ呼ばれる PHPが必要と判断したときだけ 4 ブラウザに返るのはHTML PHPのコードは外に出ない → なかなか文字だけだとイメージできないので、次の 8ステップで、この 流れを1つずつ追いかける
  9. URLを開くと何が起きる? 流れ 1/8 ブラウザ URLを開く ① ブラウザで URL を開く。まだ PHP

    は登場しない。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  10. URLを開くと何が起きる? 流れ 2/8 ブラウザ URLを開く Apache リクエスト を受ける GETリクエスト ②

    ブラウザのリクエストを Apache が受け取る。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  11. URLを開くと何が起きる? 流れ 3/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 GETリクエスト 渡す ③ .php なので Apache が PHP に渡し、index.php を実行する。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  12. URLを開くと何が起きる? 流れ 4/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 DB 必要なら 読み書き GETリクエスト 渡す SQLで読み書き ④ PHP は必要に応じてデータベースを読み書きする( SELECT / INSERT)。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  13. URLを開くと何が起きる? 流れ 5/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 DB 必要なら 読み書き PHP HTMLを 組み立てる GETリクエスト 渡す SQLで読み書き データを返す ⑤ DB から返ったデータを PHP が受け取る。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  14. URLを開くと何が起きる? 流れ 6/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 DB 必要なら 読み書き PHP HTMLを 組み立てる Apache レスポンス を返す GETリクエスト 渡す SQLで読み書き データを返す HTML ⑥ PHP がブラウザの読める HTML を組み立て、Apache に渡す。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  15. URLを開くと何が起きる? 流れ 7/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 DB 必要なら 読み書き PHP HTMLを 組み立てる Apache レスポンス を返す ブラウザ 画面に表示 GETリクエスト 渡す SQLで読み書き データを返す HTML HTTPレスポンス ⑦ Apache が HTTPレスポンス としてブラウザへ返す。 Apacheは「返すだけ」。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  16. URLを開くと何が起きる? 流れ 8/8 ブラウザ URLを開く Apache リクエスト を受ける PHP index.php

    を実行 DB 必要なら 読み書き PHP HTMLを 組み立てる Apache レスポンス を返す ブラウザ 画面に表示 GETリクエスト 渡す SQLで読み書き データを返す HTML HTTPレスポンス ⑧ ブラウザが受け取った HTML を解釈して、画面に表示する。ここまでが 1往復。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る
  17. 誤解しやすいポイント = このセクションの小まとめ 2. 全体像をつかむ ! ブラウザは PHP を実行しない 届くころにはPHPの仕事は終わっている

    ! ブラウザが受け取るのは HTML 「ソースを表示」しても PHPのコードは見えない ! PHP はサーバー側で動く だから「サーバーサイド言語」と呼ばれる ! JavaScript はブラウザ側で動く PHPはサーバー側・JSはブラウザ側。動く場所が違う相棒 ! DB は必要なときだけ呼ばれる PHPが必要と判断したときだけ
  18. ここまでを、 AIに聞いてみよう 覚えたら「説明させて」答え合わせをするのがコツ 2. 全体像をつかむ PROMPT ← AIにそのまま送る文(コピーして使えます) ① Apache・MySQL・PHP

    のそれぞれの役割を、レストランに例えて、やさしい言葉で説明してください。 ② URLを開いてからページが表示されるまでに何が起きているのか、   ブラウザ → Apache → PHP → DB の順番で、やさしい言葉で説明してください。 ▶ さっきの図を思い出しながら答えを読むと、自分の理解の「答え合わせ」になる。
  19. XAMPPとは PHPをローカルで試しやすくする詰め合わせセット 3. 環境をつくる X クロス プラットフォーム Win / Mac

    / Linux A Apache Webサーバー M MariaDB データベース P PHP 今日の主役 P Perl 今日は使わない + phpMyAdmin(DBをブラウザで管理できる画面)も入っている 今日のXAMPPは学習用。本番では Dockerや実サーバなどを使う(でも仕組みは今日と同じ)。
  20. Macで警告が出たら インストーラーを開くと最初に出ることがある。ブロック=危険ではなく「未確認」の意味 3. 環境をつくる 1 「開いていません」の警告が出る 「完了」で閉じてOK。Macの標準チェックです 2 システム設定 を開く

    プライバシーとセキュリティ → 下の「セキュリティ」欄へ 3 「このまま開く」を押す Macのパスワード(Touch ID)で認証すれば起動でき る システム設定 → プライバシーとセキュリティ の画面: ③ ここを押す! なぜ出る? → Apple審査外の配布アプリに出る標準の警告。公式サイトから入手していれば問題なし。他のエラーや警告が出ても、メッセー ジやスクショをAIに貼れば大体解決できる(後で紹介)。
  21. インストールの流れ(実際の画面) 基本は「許可」と「Next」を押していくだけ 3. 環境をつくる ①「許可」を押す フォルダへのアクセス確認 ②「Next」で進む 選択画面もそのままで OK ③

    待つ(数分) 止まって見えても大丈夫 ④「Finish」で完了 Launch XAMPP にチェック ③で「Installing / Unpacking files」のまま止まって見えても、そのまま待てば OK。 マシンによって数分かかることがあります。Cancel は押さない!
  22. 起動するとこうなる 「Manage Servers」で Apache と MySQL を Start 3. 環境をつくる

    XAMPPコントロールパネル(実際の画面)。オレンジ枠のタブへ 1 Manage Servers タブを開く 2 Apache と MySQL を Start 3 ブラウザで localhost を開く http://localhost → この画面が出れば成功!(詳しくは次ページ)
  23. Start を押して「 Running」にする 起動できたかどうかは Status 列で確認できます 3. 環境をつくる Manage Servers

    タブ(実際の画面)。緑 •+Running が起動中のしるし 1 サーバーを選んで「 Start」を押す Apache Web Server と MySQL Database の2つ 2 Status が「Running」になれば起動成功 緑の•が2つ並べば準備完了 3 ProFTPD は Stopped のままでOK ファイル転送用。今日は使わない 止めたいときは「 Stop」を押すだけ。 PCを再起動したら、もう一度 Start が必要です。
  24. localhost を開く この画面が出たら環境構築ゴール。ブラウザの警告が出ても慌てない 3. 環境をつくる 「Welcome to XAMPP」が見えたら成功! Apache が動いているしるし

    Firefoxではこんな警告が出ることがある 1 アドレス欄に localhost とだけ入力 http:// などは省略してOK 2 警告が出たら= httpsで開こうとしただけ 「上級者向けの情報」→「続行」で進める 3 Chrome / Safari では通常出ない ブラウザを替えるのも手 警告の正体:httpsで開こうとして失敗しただけ。 localhost は自分のPCなので、続行して問題なし。
  25. ファイルはここに置く htdocs がWebに公開されるフォルダ(Mac) 3. 環境をつくる XAMPP — Finder Applications ▾

    XAMPP ▾ htdocs ▾ php-beginner ▾ P index.php ブラウザで開くURL http://localhost/php-beginner/ 対応関係 htdocs = localhost その中のフォルダ名が そのままURLになる ※ Windowsの場合: C:\xampp\htdocs\php-beginner\index.php(考え方は同じ)
  26. 詰まったら、 AIをトラブル相談係に 環境構築は詰まって当たり前。聞き方さえ知っていれば大丈夫 3. 環境をつくる PROMPT ← AIにそのまま送る文(コピーして使えます) XAMPPをインストールして、ブラウザで localhost

    を開きましたが、表示されません。 何を確認すればいいか、私に一つずつ順番に質問してください。 答えていくので、一緒に原因を探してください。 画面に出ているメッセージはこれです:(そのままコピーして貼る。スクショを貼るだけでも OK) ▶ コツ:エラーは要約せずそのままコピペ。面倒ならスクショを貼るだけでも読んでくれる。
  27. 一番簡単な PHP 4. PHPを書いてみる <?php echo "こんにちは、PHP!"; <?php PHPの開始 echo

    画面に出す ; 命令の終わり ブラウザの表示: こんにちは、 PHP! PROMPT ← AIにそのまま送る文(コピーして使えます) このPHPコードを初心者向けに説明してください。 PHPが実行する部分と、ブラウザに返る結果を分けて説明してください。 ▶ ▶ DEMO localhost/php-beginner/hello.php
  28. 変更 → 保存 → 再読み込み 開発の基本サイクルを体に入れる 4. PHPを書いてみる <?php echo

    "PHPカンファレンスへようこそ!"; 1 変更する 2 保存する 3 再読み込み 4 結果を見る サーバーの再起動は不要。保存してリロードするだけ。 ▶ DEMO localhost/php-beginner/hello.php
  29. 変数を知る:データを入れる名前付きの箱 4. PHPを書いてみる <?php $message = "ようこそ!"; echo $message; "ようこそ!

    " = 入れる(代入) $message 箱の名前(ラベル) ・$ で始まる PHPの変数は必ず $ 付き ・= は「入れる」 等しい、ではなく代入 ・何度でも使える echo $message で中身が出る ▶ DEMO localhost/php-beginner/variable.php
  30. if文:条件で分ける 4. PHPを書いてみる <?php $price = 120; if ($price <=

    100) { echo "安いです"; } else { echo "少し高いです"; } 100円以下? はい いいえ 安い 高い 今回は120円 →「高い」 買い物リストでは「予算オーバーなら警告」のような判断に使える。 ▶ DEMO localhost/php-beginner/if.php
  31. 配列とループ:買い物リストの正体 4. PHPを書いてみる <?php $items = [ "牛乳", "パン", "卵",

    ]; foreach ($items as $item) { echo $item . "<br>"; } $items = 仕切りのある箱(1列) 牛乳 [0] パン [1] 卵 [2] foreach が1つずつ取り出す(牛乳 → パン → 卵) 下駄箱のイメージ = 2次元(配列の中に配列)も OK [0][0] [0][1] [0][2] [1][0] [1][1] [1][2] 買い物リストは「複数の値」。だから配列(まとめる)+ループ( 1件ずつ処理)。 ▶ DEMO localhost/php-beginner/loop.php
  32. foreach の読み方 「as の前」と「as の後」— 部品に分解すると読める 4. PHPを書いてみる foreach (

    $items as $item ) { …処理… } 1 2 3 4 1 $items(as の前) 全体が入った配列。ここから 1件 ずつ取り出す 2 as 「〜として」の合図。右の変数に入れてね、の意味 3 $item(as の後) 取り出した1件が入る箱。1周ごと に中身が入れ替わる 4 { … } 1件ぶんの処理。取り出すたびに毎回実行される $item の中身は 1周目「牛乳」→ 2周目「パン」→ 3周目「卵」と入れ替わる。  名前は自由($item でなくても動く)。
  33. スキルアップに、 AIを活用する 「答えを見る」より「添削してもらう」ほうが力がつく 4. PHPを書いてみる PROMPT ← AIにそのまま送る文(コピーして使えます) 変数・if・配列・foreach を使う、5行くらいのPHPの練習問題を1問出してください。

    ヒントはまだ出さないでください。私が答えを書いたら、初心者向けに添削してください。 なお、練習問題は私の好みに合わせて出してください。 ▶ 「ヒントはまだ出さないで」で答えを我慢させる。「好みに合わせて」で問題が自分ごとになる。
  34. 今日作るもの:買い物リスト 仕様(今日つくる範囲) 5. 買い物リストを作る 1 入力欄と「追加」ボタンがある  ← フォーム 2 追加した品物が一覧に表示される

     ← 配列とループ 3 ページを閉じても一覧が残る  ← DB保存 4 (宿題)「買った」ボタンで消える  ← DELETE localhost/php-beginner/ 牛乳 追加 ・牛乳 ・パン ・卵 完成イメージ ①②は今から。③はセクション 6、④は宿題で。
  35. 品物の名前を、フォームで入力する 買い物リストの入り口。入力欄と「追加」ボタンを作る 5. 買い物リストを作る <form method="post"> <input type="text" name="item"> <button

    type="submit">追加</button> </form> form 入力欄をまとめる post データを送る方法 name 受け取るときの宛名 ざっくりイメージ: 牛乳 追加 フォーム(ブラウザ) item=牛乳 PHP HTML 追加したのは:牛乳 結果(ブラウザ) ▶ DEMO localhost/php-beginner/form_unsafe.php
  36. 届いた品物を、受け取って表示する まずは素直に書いてみる 5. 買い物リストを作る <form method="post"> <input type="text" name="item"> <button

    type="submit">追加</button> </form> <?php $item = $_POST['item'] ?? ''; echo "追加したのは:" . $item; $_POST 送られたデータが入る配列 ?? '' なければ空文字 「牛乳」 → 追加したのは:牛乳 1ファイルで、フォームも受け取りも動く! このコード、本当に大丈夫? → 次のページでAIに聞いてみよう ▶ DEMO localhost/php-beginner/form_unsafe.php
  37. ここでAIに聞いてみよう 5. 買い物リストを作る PROMPT ← AIにそのまま送る文(コピーして使えます) このフォーム処理にセキュリティ上の問題がないか、 初心者向けに確認してください。特に XSSについて説明してください。 $item

    = $_POST['item'] ?? ''; echo "追加したのは:" . $item; ▶ 指摘されること: 入力をそのまま echo している(XSSの危険) XSSとは:仕込まれたスクリプトが表示時にブラウザで実行される攻撃 直し方:htmlspecialchars() でエスケープ → 次のページ
  38. 修正版:品物を安全に表示する 5. 買い物リストを作る <form method="post"> <input type="text" name="item"> <button type="submit">追加</button>

    </form> <?php $item = $_POST['item'] ?? ''; echo "追加したのは:" . htmlspecialchars($item, ENT_QUOTES, 'UTF-8'); 変わったのは最後の 1行だけ(オレンジの部分)。フォーム部分はそのまま。 危険な入力 <script>…</script> を送った場合: 修正前 スクリプトが実行されてしまう 修正後 ただの文字として表示される 鉄則:ユーザー入力を表示するときは、必ず htmlspecialchars を通す
  39. htmlspecialchars の読み方 引数は3つ。迷ったら毎回この形のまま使えばOK 5. 買い物リストを作る htmlspecialchars( $item, ENT_QUOTES, 'UTF-8' )

    1 2 3 4 1 htmlspecialchars HTMLとして特別な文字を「ただの 文字」に変換する関数 2 $item(第1引数)  変換したい文字列。フォームから来 た値など 3 ENT_QUOTES(第2引数)  " と ' も変換する指定。このま ま書けばOK 4 'UTF-8'(第3引数)  文字コード。日本語は UTF-8 の ままでOK なぜ必要? → <script>などを送られても「ただの文字」に変えて、画面で実行させないため。 使いどころは表示する直前。②だけ差し替えて、③④はいつも同じで OK。
  40. なぜ保存が必要? 追加した「牛乳」、リロードしたら消えた! 6. DBに保存する 1 変数の寿命は「1往復」だけ リクエストが終わると、変数も配列も全部捨てられる 2 リロード=新しいリクエスト PHPはまっさらな状態からもう一度実行される

    3 だから「残したいもの」は DBへ DBはリクエストが終わっても消えない置き場所 変数だけの場合 追加 → 表示OK リロード → 空っぽに… DBに保存した場合 追加 → DBに書き込む リロード → ちゃんと残る! 買い物リストは「明日も残っていてほしい」もの。だから DBの出番。 ▶ DEMO localhost/php-beginner/form_safe.php
  41. 保存して、後で呼び出す DBは時間をまたぐ置き場所。書くときと読むときは別のリクエスト 6. DBに保存する 今日 牛乳 追加 追加して閉じる INSERT(書く) DB

    牛乳 items テーブル ずっと残る SELECT(読む) 明日 買い物リスト ・牛乳 開くだけで出てくる 書くリクエストと読むリクエストは別々。間に何日空いても、 DBの中身はそのまま残っている。
  42. 保存の流れ フォーム → PHP → DB → 一覧表示 6. DBに保存する

    フォームから入力 PHP DBに保存 PHP HTMLで一覧表示 変数 1往復で消える = 開き直すとゼロに戻る データベース 後で使うデータの置き場所 = 閉じても残る 似たようなものにセッションがあるが永続的には残らない
  43. 表示の流れ 保存の逆。DBから読み出して、HTMLにして返す 6. DBに保存する ページを開く PHP DBから読む PHP HTMLで一覧表示 保存(書く)

    フォームから届いた品物を DBに書き込む = INSERT 表示(読む) DBにある品物を全部読んで 一覧にする = SELECT
  44. 商品をDBに保存して、表示する 3ステップでいく 6. DBに保存する STEP 1 保存場所(テーブル)を用意する phpMyAdminで items テーブルを作る(列は

    id と name だけ) STEP 2 「追加」されたら INSERT する フォームから届いた品物をDBに書き込む STEP 3 一覧を SELECT して表示する DBから全件取り出して foreach で並べる STEP 1 は画面操作だけ。コードを書くのは STEP 2 と 3。
  45. index.php の全体像 1つのファイルで「追加」も「表示」もやる 6. DBに保存する index.php 1 DBに接続する new PDO(...)

    2 追加リクエスト( POST)なら保存 if (POSTなら) { INSERT } 3 一覧を全部取り出す SELECT * FROM items 4 HTMLを表示(フォーム+一覧) <form> と foreach 同じファイルでも、リクエストによって通る道が違う ページを開いただけ( GET) ① → ③ → ④ (②は通らない) 表示するだけ。保存はしない 追加ボタンを押した( POST) ① → ② → ③ → ④ (全部通る) 保存してから、そのまま一覧も表示 「追加かどうか」の見分け方 = $_SERVER['REQUEST_METHOD'] が 'POST' かどうか(②の if文)
  46. STEP 1:items テーブルを作る phpMyAdmin の画面操作だけ。コードはまだ書きません 6. DBに保存する ① shopping データベースに「items」・カラム数

    2 で作成 ② 完成形:id(AUTO_INCREMENT・主キー)と name(varchar(100)) 列は id と name の2つだけ。id は A_I(自動連番)にチェックすると主キーになる。 phpMyAdmin はブラウザで localhost/phpmyadmin を開くだけ。SQLをまだ書かなくてOK。
  47. PHPからDBを利用する方法 標準の窓口 PDO(PHP Data Objects)を使う 6. DBに保存する PHP PDO 共通の窓口

    MariaDB 今日はこれ PostgreSQL SQLite 変換プラグのように、 相手が変わっても 同じ作法で使える 1 どのDBでも同じ書き方 2 値を安全に渡せる 3 PHPに標準搭載 PDO=PHPとDBの間に立つ「共通の窓口」。 DBごとの細かい違いを気にせず、安全にやり取りするための道具。 ① どのDBでも同じ書き方 ② 値を安全に渡せる ③ 標準搭載ですぐ使える。次ページから、この窓口ごしに DBへお願いしていく。
  48. STEP 2:まず、DBとつなぐ 窓口(PDO)に「shopping をお願いします」と言うだけ 6. DBに保存する <?php // DBに接続(XAMPPの初期設定: ユーザー

    root・パスワードな し) $db = new PDO('mysql:host=localhost;dbname=shopping' , 'root', ''); PHP $db(窓口) DB shopping この1行だけで接続完了。ここから先は $db を通して DBに「保存して」「読ませて」とお願いする。
  49. new PDO の読み方 引数は3つ。「どこへ・誰が・合言葉」 6. DBに保存する new PDO( 'mysql:host=localhost;dbname=shopping', 'root',

    '' ) 1 2 3 1 接続先メモ(第1引数) mysql=DBの種類/host=localhost=このPCの/dbname=shopping=shoppingというDBへ 2 'root'(第2引数) ユーザー名。XAMPPの初期設定は root 3 ''(第3引数) パスワード。XAMPPの初期設定は「なし」=空文字 root・パスワードなしは学習用 XAMPPだけの割り切り。本番ではちゃんと設定する。
  50. STEP 2:「追加」が来たら INSERT で保存 フォームから届いた値を、テーブルに1行書き込む 6. DBに保存する <?php // つなぐ(さっきの1行)

    $db = new PDO('mysql:host=localhost;dbname=shopping' , 'root', ''); // 追加ボタンが押されたら INSERT で保存 if ($_SERVER['REQUEST_METHOD' ] === 'POST') { $stmt = $db->prepare('INSERT INTO items (name) VALUES (?)' ); $stmt->execute([$_POST['item']]); } 「?」は入力値の置き場所。値は SQL文に直接書かず、あとから渡す。 ※ この書き方が安全の基本(2つ目の鉄則)。名前は覚えなくてOK、プロンプト集と配布資料で見返せます。 ▶ DEMO localhost/php-beginner/index.php
  51. INSERT の読み方 これがSQL — DBにお願いするための言葉。部品は3つ 6. DBに保存する INSERT INTO items

    (name) VALUES ('牛乳') 1 2 3 1 INSERT INTO items items テーブルに追加して 2 (name) name の列に 3 VALUES ('牛乳') この値を入れて、の意味 実際のコードでは '牛乳' の場所が「 ?」になり、フォームから届いた値があとから入る。
  52. SQLも、AIに聞いてみよう 全部覚えなくていい。読めれば十分 6. DBに保存する PROMPT ← AIにそのまま送る文(コピーして使えます) SQLとは何ですか? 買い物リストを例に、 INSERT(保存する)と

    SELECT(読み出す)がそれぞれ何をするのか、やさしく説明してください。 そのあと、私が書いたSQLが正しいかどうかのチェックもお願いします。 ▶ SQLはDBと話すための言葉。今日は INSERT と SELECT の2つが読めれば OK。
  53. 入力した「牛乳」が DBに入るまで いまのコードで、データはこう旅をする 6. DBに保存する 牛乳 追加 ① フォームに入力して送信 POST

    item=牛乳 $_POST['item'] ↓ INSERT INTO items (name) VALUES (' 牛乳') ② PHPが受け取り、 INSERTを実行 「牛乳」が 書き込まれる itemsテーブル id name 1 パン 2 卵 3 牛乳 ③ テーブルに 1行追加される(緑の行) フォームの name="item" → $_POST['item'] → INSERTの値 → テーブルの 1行 「追加」を押すたびに行が増えていく。これが「保存」の正体。
  54. STEP 3:一覧を SELECT で表示する コードは3ブロック。①取得 → ②繰り返し → ③安全に表示 6.

    DBに保存する // STEP3: 全件取り出して並べる $items = $db->query('SELECT * FROM items' ) ->fetchAll(); foreach ($items as $item) { echo '<li>' . htmlspecialchars($item['name']) . '</li>'; } 買い物リスト 追加 ・牛乳 ・パン ・卵 リロードしても残る! 1 $db->query(...)->fetchAll() DBから全件を取り出して、配列で受け取る 2 foreach ($items as $item) 受け取った配列から、 1件ずつ取り出す 3 htmlspecialchars(...) 安全な形にしてから <li> で表示(鉄則1) ▶ DEMO localhost/php-beginner/index.php
  55. SELECT の行の読み方 矢印(->)でつないで「お願い」を重ねている 6. DBに保存する $items = $db->query('SELECT * FROM

    items')->fetchAll(); 1 2 3 1 $db-> 窓口(接続)にお願いする書き方。 -> は「〜の機能を使う」の矢印 2 'SELECT * FROM items' SQL。「items テーブルから、全部の列( *)をください」 3 ->fetchAll() 返ってきた結果を、全部まとめて配列で受け取る 受け取った配列 $items は、さっき覚えた foreach で1件ずつ表示できる。文法がここでつながる。
  56. 完成! 動かしてみよう 追加 → 一覧に出る → リロードしても残る 6. DBに保存する ✔

    ① フォーム ✔ ② 一覧表示 ✔ ③ DB保存 ④「買った」で消す (宿題) localhost/php-beginner/ 買い物リスト 追加 ・牛乳 ・パン ・卵 上のとおり、仕様①②③が完成!  フォーム+配列とループ+DB保存、今日学んだ全部が入っている。残る④が宿題。
  57. 完成コードを、 AIに解説させる 動いた後こそ聞きどき。1行ずつ理解に変える 6. DBに保存する PROMPT ← AIにそのまま送る文(コピーして使えます) この index.php

    を上から1行ずつ、何をしているのか初心者向けに解説してください。 (コードを貼る) わからなかった行があれば、続けてその行だけ質問します。 ▶ 完成コードの逐行解説は AIの得意技。「動いた」を「わかった」に変えてから次へ。
  58. 宿題:「買った」ボタンで消す さっき完成させたアプリに、仕様④を追加する 7. 宿題とまとめ 買い物リスト ・牛乳 買った ・パン 買った ・卵

    買った 牛乳を 買った! 買い物リスト ・パン 買った ・卵 買った 学べること: POSTで削除リクエスト / IDで対象指定 / DELETE文 / なりすまし送信( CSRF)対策の入口 できたらコミュニティや SNSでぜひシェアを!
  59. 宿題で詰まったら: AIへの頼み方 7. 宿題とまとめ PROMPT ← AIにそのまま送る文(コピーして使えます) さっき作った買い物リストアプリに「買った」ボタンを追加してください。 ボタンを押した商品だけを DBから削除してください。

    条件: ・削除は「削除ボタン」で行う ・「削除ボタン」を押すとその行のデータが消えます。 ・脆弱性の無い作りにしてください。 ・初心者向けに、変更した場所の説明もしてください。 ▶ ポイント:丸投げではなく「条件」を付けて頼む。条件=今日学んだ安全ルールそのもの。
  60. 人とAIの役割分担 AIに任せるのはOK。ただし「判断」は人の仕事 7. 宿題とまとめ 人がやること ・方向性を決める  何を作るか・どこまで作るか ・仕組みを理解して設計を判断  拡張しやすい形か、効率が良いか ・出力を検証する

     動く=安全ではない。鉄則でチェック AIに任せてよいこと ・実装の相棒  たたき台のコードを素早く出す ・わからない所の説明役  今日のプロンプトのように聞けば良い ・選択肢を出す  やり方の候補を並べて比較する 注意:AIが書いたコードも必ず検証する。チェックする観点は今日の鉄則 2つ(最後のまとめでおさらい) 裏側を知る人だけが、 AIの出力を判断できる。
  61. AIに聞くときのプロンプト集 ①学ぶ・作る 「ここまで理解したら、こう聞く」— 理解の後に使うのがコツ PROMPT コードの説明 このPHPコードを初心者向けに説明してください。 PHPが実行する部分と、ブラウザに返る結果を 分けて説明してください。 PROMPT

    変数の理解 このコードの $message には何が入っていますか?変数を使うメリットを初心者向けに説明してく ださい。 PROMPT 機能追加(条件付き) 「買った」ボタンを追加してください。条件: POSTで削除/IDで指定/PDOプリペアドステートメント /htmlspecialchars。変更点を初心者向けに説明してください。 安全を確かめるプロンプトは次のページ →
  62. AIに聞くときのプロンプト集 ②安全を確かめる 動いたら終わりではなく、出てきたコードを検証する聞き方 PROMPT セキュリティ確認 (今日の鉄則) このフォーム処理にセキュリティ上の問題がないか、初心者向けに確認してください。特に XSS (htmlspecialchars)とSQLインジェクション(prepareの「?」)について説明してください。 PROMPT

    OWASP Top 10 チェック このPHPコード全体を OWASP Top 10 に照らして、脆弱性がないか項目ごとに確認してください。 特にインジェクションを重点的に。見つかった問題は、危険な理由と修正版コードをセットで初心者 向けに説明してください。 OWASP Top 10 = Webアプリの代表的な脆弱性トップ10のリスト。名前だけ覚えて帰ればOK。 おつかれさまでした! Happy Hacking with PHP
  63. 今日、覚えて帰ること 3つ 1 LAMP — PHPはサーバー側で動く ブラウザ⇄サーバーの往復の裏側で、 Apache・PHP・DB が働いている。これが今日見た全部。 2

    わからなければ、 AIに聞く 説明させる・質問させる・添削させる。今日のプロンプトは全部、配布資料で見返せる。 3 最後の責任は、人間が持つ 入力は信用しない(鉄則2つ)。AIの出力を判断できるのは、裏側を知っている人。 ご清聴ありがとうございました 有限会社アリウープ  柏岡 秀男 @kashioka