Slide 1

Slide 1 text

PHPカンファレンス PHP初心者セッション 2026 生成AIでは見えない裏側を知る 今だからLAMPを通して仕組みを学ぶ XAMPPで動かしながら、買い物リストを作る実習付き

Slide 2

Slide 2 text

@kashioka X(旧Twitter) 有限会社アリウープ 代表取締役社長 有限会社アリウープ 柏岡 秀男 / @kashioka ● PHPカンファレンス初回より初心者向けのセッション を話しています。 ● Webアプリケーション開発を生業としています。 ● アジャイル開発が好き。 ● AIをフル活用してプロジェクトを進めています。

Slide 3

Slide 3 text

このセッションの対象者 1 PHPを未経験から学びたい方 プログラミングが初めてでも OK。今日の 実習は全手順を追える構成です 2 新人教育のヒントが欲しい方 会社で教える立場の方へ。構成ごと持ち 帰って研修に使えます 3 生成AIで開発を始めたい方 AIに書かせる前に、出力を見極めるため の「裏側」を知りたい方 どれか1つでも当てはまれば、今日は持ち帰るものがあります。

Slide 4

Slide 4 text

なぜ今、LAMPで「裏側」を学ぶのか AIがコードを書ける時代 でも仕組みを知らないままだと、設計や運用の判断ができない LAMPは「ちょうどいい」教材 環境構築・データベース(DB)・アプリの全体像を、適度な難易度で掴める AIに任せたその後は? 基礎があれば「方向性・効率・拡張性・テスト」の観点が持てる 今日の進め方: LAMPを一つずつ組み上げる + AIとの作業の進め方(プロンプト)も一緒に紹介

Slide 5

Slide 5 text

SECTION 1 LAMPを知る PHPを動かす4つを、まず知っておく ・LAMPとは ・OS(Linux)/ Webサーバー(Apache)/ DB(MySQL)/ PHP

Slide 6

Slide 6 text

LAMPとは PHPを動かす、いちばんメジャーな組み合わせの名前 1. LAMPを知る L Linux OS(土台) A Apache Webサーバー M MySQL / MariaDB データベース P PHP プログラム言語 Webサービスの定番セットの頭文字。次の 4ページから一つずつ紹介します。

Slide 7

Slide 7 text

OS(Linux)とは LAMPの「L」 L OS(Linux) 土台 ひとことで言うと:コンピュータ全体を動かす基本ソフト 1 アプリとハードウェアの仲介役 PHPもApacheも、OSの上で動く「アプリのひとつ」 2 サーバーの世界では Linuxが主流 無料で安定していて、自動化がしやすい 3 今日は手元の OSでOK WindowsやmacOSが土台の代わりになる ※ 本番サーバーに触れるころには理解が必要。本日は概要のみ覚えてください。 1. LAMPを知る

Slide 8

Slide 8 text

Webサーバー( Apache)とは LAMPの「A」 A Webサーバー( Apache) 受付係 ひとことで言うと:リクエストを受け取り、結果を返す受付係 1 URLとファイルを対応付ける /php-beginner/ → htdocsフォルダの中のファイル 2 .php はPHPに処理を依頼する HTMLや画像はそのまま返す 3 同様のサーバとして nginx などもある その場合はLEMP? 1. LAMPを知る

Slide 9

Slide 9 text

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を知る

Slide 10

Slide 10 text

PHPとは LAMPの「P」— 今日の主役 P PHP 今日の主役 Web開発に特に適した、 汎用スクリプト言語( php.netの定義より) PHP HTMLページ 今日のメイン。Webページを組み立てる { } API(JSON) スマホアプリ等の裏側のデータ窓口も作れる >_ コマンドライン バッチ処理や作業ツールも書ける ※ 世界中のWebサイトで広く使われている(WordPressもPHP製)。今日は「HTMLページを作る」使い方だけを学びます。 1. LAMPを知る

Slide 11

Slide 11 text

ここまでの小まとめ L:Linux = 土台。今日は手元のOSが代役 A:Apache = 受付係。リクエストを受けて返す M:MySQL / MariaDB = 倉庫。データを残す P:PHP = 主役。 1. LAMPを知る

Slide 12

Slide 12 text

SECTION 2 全体像をつかむ URLを開いてから画面に表示されるまでの1往復を、8ステップで追いかける ・最初に全体像 ・URLを開くと何が起きる?(流れ 1/8〜8/8) ・誤解しやすいポイント

Slide 13

Slide 13 text

最初に全体像 URLを開いたとき、裏側で何が起きる? 2. 全体像をつかむ URLを開いたとき、 裏側で何が 起きている? http://localhost/php-beginner/ 1 PHPはサーバー側で動く ブラウザの中ではない 2 Apacheはリクエストを受ける係 Webサーバーが玄関になる 3 DBは必要なときだけ呼ばれる PHPが必要と判断したときだけ 4 ブラウザに返るのはHTML PHPのコードは外に出ない → なかなか文字だけだとイメージできないので、次の 8ステップで、この 流れを1つずつ追いかける

Slide 14

Slide 14 text

URLを開くと何が起きる? 流れ 1/8 ブラウザ URLを開く ① ブラウザで URL を開く。まだ PHP は登場しない。 ポイント:ブラウザが PHP を実行するのではなく、サーバー側の PHP が HTML を作る

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

誤解しやすいポイント = このセクションの小まとめ 2. 全体像をつかむ ! ブラウザは PHP を実行しない 届くころにはPHPの仕事は終わっている ! ブラウザが受け取るのは HTML 「ソースを表示」しても PHPのコードは見えない ! PHP はサーバー側で動く だから「サーバーサイド言語」と呼ばれる ! JavaScript はブラウザ側で動く PHPはサーバー側・JSはブラウザ側。動く場所が違う相棒 ! DB は必要なときだけ呼ばれる PHPが必要と判断したときだけ

Slide 23

Slide 23 text

ここまでを、 AIに聞いてみよう 覚えたら「説明させて」答え合わせをするのがコツ 2. 全体像をつかむ PROMPT ← AIにそのまま送る文(コピーして使えます) ① Apache・MySQL・PHP のそれぞれの役割を、レストランに例えて、やさしい言葉で説明してください。 ② URLを開いてからページが表示されるまでに何が起きているのか、   ブラウザ → Apache → PHP → DB の順番で、やさしい言葉で説明してください。 ▶ さっきの図を思い出しながら答えを読むと、自分の理解の「答え合わせ」になる。

Slide 24

Slide 24 text

SECTION 3 環境をつくる 手元のPCにPHPが動く環境を用意する ・XAMPPとは ・警告が出たときの対処 / インストールの流れ(実際の画面) ・起動するとこうなる / ファイルはどこに置く?

Slide 25

Slide 25 text

XAMPPとは PHPをローカルで試しやすくする詰め合わせセット 3. 環境をつくる X クロス プラットフォーム Win / Mac / Linux A Apache Webサーバー M MariaDB データベース P PHP 今日の主役 P Perl 今日は使わない + phpMyAdmin(DBをブラウザで管理できる画面)も入っている 今日のXAMPPは学習用。本番では Dockerや実サーバなどを使う(でも仕組みは今日と同じ)。

Slide 26

Slide 26 text

Macで警告が出たら インストーラーを開くと最初に出ることがある。ブロック=危険ではなく「未確認」の意味 3. 環境をつくる 1 「開いていません」の警告が出る 「完了」で閉じてOK。Macの標準チェックです 2 システム設定 を開く プライバシーとセキュリティ → 下の「セキュリティ」欄へ 3 「このまま開く」を押す Macのパスワード(Touch ID)で認証すれば起動でき る システム設定 → プライバシーとセキュリティ の画面: ③ ここを押す! なぜ出る? → Apple審査外の配布アプリに出る標準の警告。公式サイトから入手していれば問題なし。他のエラーや警告が出ても、メッセー ジやスクショをAIに貼れば大体解決できる(後で紹介)。

Slide 27

Slide 27 text

インストールの流れ(実際の画面) 基本は「許可」と「Next」を押していくだけ 3. 環境をつくる ①「許可」を押す フォルダへのアクセス確認 ②「Next」で進む 選択画面もそのままで OK ③ 待つ(数分) 止まって見えても大丈夫 ④「Finish」で完了 Launch XAMPP にチェック ③で「Installing / Unpacking files」のまま止まって見えても、そのまま待てば OK。 マシンによって数分かかることがあります。Cancel は押さない!

Slide 28

Slide 28 text

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

Slide 29

Slide 29 text

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 が必要です。

Slide 30

Slide 30 text

localhost を開く この画面が出たら環境構築ゴール。ブラウザの警告が出ても慌てない 3. 環境をつくる 「Welcome to XAMPP」が見えたら成功! Apache が動いているしるし Firefoxではこんな警告が出ることがある 1 アドレス欄に localhost とだけ入力 http:// などは省略してOK 2 警告が出たら= httpsで開こうとしただけ 「上級者向けの情報」→「続行」で進める 3 Chrome / Safari では通常出ない ブラウザを替えるのも手 警告の正体:httpsで開こうとして失敗しただけ。 localhost は自分のPCなので、続行して問題なし。

Slide 31

Slide 31 text

ファイルはここに置く 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(考え方は同じ)

Slide 32

Slide 32 text

詰まったら、 AIをトラブル相談係に 環境構築は詰まって当たり前。聞き方さえ知っていれば大丈夫 3. 環境をつくる PROMPT ← AIにそのまま送る文(コピーして使えます) XAMPPをインストールして、ブラウザで localhost を開きましたが、表示されません。 何を確認すればいいか、私に一つずつ順番に質問してください。 答えていくので、一緒に原因を探してください。 画面に出ているメッセージはこれです:(そのままコピーして貼る。スクショを貼るだけでも OK) ▶ コツ:エラーは要約せずそのままコピペ。面倒ならスクショを貼るだけでも読んでくれる。

Slide 33

Slide 33 text

SECTION 4 PHPを書いてみる 4つの基本文法だけで、買い物リストの部品が揃う ・一番簡単なPHP ・変更 → 保存 → 再読み込み ・変数 / if文 / 配列とループ

Slide 34

Slide 34 text

一番簡単な PHP 4. PHPを書いてみる

Slide 35

Slide 35 text

変更 → 保存 → 再読み込み 開発の基本サイクルを体に入れる 4. PHPを書いてみる

Slide 36

Slide 36 text

変数を知る:データを入れる名前付きの箱 4. PHPを書いてみる

Slide 37

Slide 37 text

if文:条件で分ける 4. PHPを書いてみる

Slide 38

Slide 38 text

配列とループ:買い物リストの正体 4. PHPを書いてみる "; } $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

Slide 39

Slide 39 text

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 でなくても動く)。

Slide 40

Slide 40 text

ここまでの小まとめ 4. PHPを書いてみる 変数 = 名前付きの箱にデータを入れる($name) if文 = 条件で処理を分ける(もし〜なら) 配列 = 仕切りのある箱に複数まとめる ループ = foreach で1つずつ取り出して繰り返す

Slide 41

Slide 41 text

スキルアップに、 AIを活用する 「答えを見る」より「添削してもらう」ほうが力がつく 4. PHPを書いてみる PROMPT ← AIにそのまま送る文(コピーして使えます) 変数・if・配列・foreach を使う、5行くらいのPHPの練習問題を1問出してください。 ヒントはまだ出さないでください。私が答えを書いたら、初心者向けに添削してください。 なお、練習問題は私の好みに合わせて出してください。 ▶ 「ヒントはまだ出さないで」で答えを我慢させる。「好みに合わせて」で問題が自分ごとになる。

Slide 42

Slide 42 text

SECTION 5 買い物リストを作る 学んだ部品を組み合わせて、動くWebアプリにする ・今日作るもの:買い物リスト ・品物の名前をフォームで入力して送る ・受け取った品物を安全に表示する

Slide 43

Slide 43 text

今日作るもの:買い物リスト 仕様(今日つくる範囲) 5. 買い物リストを作る 1 入力欄と「追加」ボタンがある  ← フォーム 2 追加した品物が一覧に表示される  ← 配列とループ 3 ページを閉じても一覧が残る  ← DB保存 4 (宿題)「買った」ボタンで消える  ← DELETE localhost/php-beginner/ 牛乳 追加 ・牛乳 ・パン ・卵 完成イメージ ①②は今から。③はセクション 6、④は宿題で。

Slide 44

Slide 44 text

品物の名前を、フォームで入力する 買い物リストの入り口。入力欄と「追加」ボタンを作る 5. 買い物リストを作る 追加 form 入力欄をまとめる post データを送る方法 name 受け取るときの宛名 ざっくりイメージ: 牛乳 追加 フォーム(ブラウザ) item=牛乳 PHP HTML 追加したのは:牛乳 結果(ブラウザ) ▶ DEMO localhost/php-beginner/form_unsafe.php

Slide 45

Slide 45 text

届いた品物を、受け取って表示する まずは素直に書いてみる 5. 買い物リストを作る 追加

Slide 46

Slide 46 text

ここでAIに聞いてみよう 5. 買い物リストを作る PROMPT ← AIにそのまま送る文(コピーして使えます) このフォーム処理にセキュリティ上の問題がないか、 初心者向けに確認してください。特に XSSについて説明してください。 $item = $_POST['item'] ?? ''; echo "追加したのは:" . $item; ▶ 指摘されること: 入力をそのまま echo している(XSSの危険) XSSとは:仕込まれたスクリプトが表示時にブラウザで実行される攻撃 直し方:htmlspecialchars() でエスケープ → 次のページ

Slide 47

Slide 47 text

修正版:品物を安全に表示する 5. 買い物リストを作る 追加 … を送った場合: 修正前 スクリプトが実行されてしまう 修正後 ただの文字として表示される 鉄則:ユーザー入力を表示するときは、必ず htmlspecialchars を通す

Slide 48

Slide 48 text

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 なぜ必要? → などを送られても「ただの文字」に変えて、画面で実行させないため。 使いどころは表示する直前。②だけ差し替えて、③④はいつも同じで OK。

Slide 49

Slide 49 text

SECTION 6 DBに保存する 追加した品物を「消えないデータ」にする ・なぜ保存が必要? ・保存の流れ ・買い物リストを完成させる(3ステップ)

Slide 50

Slide 50 text

なぜ保存が必要? 追加した「牛乳」、リロードしたら消えた! 6. DBに保存する 1 変数の寿命は「1往復」だけ リクエストが終わると、変数も配列も全部捨てられる 2 リロード=新しいリクエスト PHPはまっさらな状態からもう一度実行される 3 だから「残したいもの」は DBへ DBはリクエストが終わっても消えない置き場所 変数だけの場合 追加 → 表示OK リロード → 空っぽに… DBに保存した場合 追加 → DBに書き込む リロード → ちゃんと残る! 買い物リストは「明日も残っていてほしい」もの。だから DBの出番。 ▶ DEMO localhost/php-beginner/form_safe.php

Slide 51

Slide 51 text

保存して、後で呼び出す DBは時間をまたぐ置き場所。書くときと読むときは別のリクエスト 6. DBに保存する 今日 牛乳 追加 追加して閉じる INSERT(書く) DB 牛乳 items テーブル ずっと残る SELECT(読む) 明日 買い物リスト ・牛乳 開くだけで出てくる 書くリクエストと読むリクエストは別々。間に何日空いても、 DBの中身はそのまま残っている。

Slide 52

Slide 52 text

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

Slide 53

Slide 53 text

表示の流れ 保存の逆。DBから読み出して、HTMLにして返す 6. DBに保存する ページを開く PHP DBから読む PHP HTMLで一覧表示 保存(書く) フォームから届いた品物を DBに書き込む = INSERT 表示(読む) DBにある品物を全部読んで 一覧にする = SELECT

Slide 54

Slide 54 text

商品をDBに保存して、表示する 3ステップでいく 6. DBに保存する STEP 1 保存場所(テーブル)を用意する phpMyAdminで items テーブルを作る(列は id と name だけ) STEP 2 「追加」されたら INSERT する フォームから届いた品物をDBに書き込む STEP 3 一覧を SELECT して表示する DBから全件取り出して foreach で並べる STEP 1 は画面操作だけ。コードを書くのは STEP 2 と 3。

Slide 55

Slide 55 text

index.php の全体像 1つのファイルで「追加」も「表示」もやる 6. DBに保存する index.php 1 DBに接続する new PDO(...) 2 追加リクエスト( POST)なら保存 if (POSTなら) { INSERT } 3 一覧を全部取り出す SELECT * FROM items 4 HTMLを表示(フォーム+一覧) と foreach 同じファイルでも、リクエストによって通る道が違う ページを開いただけ( GET) ① → ③ → ④ (②は通らない) 表示するだけ。保存はしない 追加ボタンを押した( POST) ① → ② → ③ → ④ (全部通る) 保存してから、そのまま一覧も表示 「追加かどうか」の見分け方 = $_SERVER['REQUEST_METHOD'] が 'POST' かどうか(②の if文)

Slide 56

Slide 56 text

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。

Slide 57

Slide 57 text

PHPからDBを利用する方法 標準の窓口 PDO(PHP Data Objects)を使う 6. DBに保存する PHP PDO 共通の窓口 MariaDB 今日はこれ PostgreSQL SQLite 変換プラグのように、 相手が変わっても 同じ作法で使える 1 どのDBでも同じ書き方 2 値を安全に渡せる 3 PHPに標準搭載 PDO=PHPとDBの間に立つ「共通の窓口」。 DBごとの細かい違いを気にせず、安全にやり取りするための道具。 ① どのDBでも同じ書き方 ② 値を安全に渡せる ③ 標準搭載ですぐ使える。次ページから、この窓口ごしに DBへお願いしていく。

Slide 58

Slide 58 text

STEP 2:まず、DBとつなぐ 窓口(PDO)に「shopping をお願いします」と言うだけ 6. DBに保存する

Slide 59

Slide 59 text

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だけの割り切り。本番ではちゃんと設定する。

Slide 60

Slide 60 text

STEP 2:「追加」が来たら INSERT で保存 フォームから届いた値を、テーブルに1行書き込む 6. DBに保存する prepare('INSERT INTO items (name) VALUES (?)' ); $stmt->execute([$_POST['item']]); } 「?」は入力値の置き場所。値は SQL文に直接書かず、あとから渡す。 ※ この書き方が安全の基本(2つ目の鉄則)。名前は覚えなくてOK、プロンプト集と配布資料で見返せます。 ▶ DEMO localhost/php-beginner/index.php

Slide 61

Slide 61 text

INSERT の読み方 これがSQL — DBにお願いするための言葉。部品は3つ 6. DBに保存する INSERT INTO items (name) VALUES ('牛乳') 1 2 3 1 INSERT INTO items items テーブルに追加して 2 (name) name の列に 3 VALUES ('牛乳') この値を入れて、の意味 実際のコードでは '牛乳' の場所が「 ?」になり、フォームから届いた値があとから入る。

Slide 62

Slide 62 text

SQLも、AIに聞いてみよう 全部覚えなくていい。読めれば十分 6. DBに保存する PROMPT ← AIにそのまま送る文(コピーして使えます) SQLとは何ですか? 買い物リストを例に、 INSERT(保存する)と SELECT(読み出す)がそれぞれ何をするのか、やさしく説明してください。 そのあと、私が書いたSQLが正しいかどうかのチェックもお願いします。 ▶ SQLはDBと話すための言葉。今日は INSERT と SELECT の2つが読めれば OK。

Slide 63

Slide 63 text

入力した「牛乳」が 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行 「追加」を押すたびに行が増えていく。これが「保存」の正体。

Slide 64

Slide 64 text

STEP 3:一覧を SELECT で表示する コードは3ブロック。①取得 → ②繰り返し → ③安全に表示 6. DBに保存する // STEP3: 全件取り出して並べる $items = $db->query('SELECT * FROM items' ) ->fetchAll(); foreach ($items as $item) { echo '
  • ' . htmlspecialchars($item['name']) . '
  • '; } 買い物リスト 追加 ・牛乳 ・パン ・卵 リロードしても残る! 1 $db->query(...)->fetchAll() DBから全件を取り出して、配列で受け取る 2 foreach ($items as $item) 受け取った配列から、 1件ずつ取り出す 3 htmlspecialchars(...) 安全な形にしてから
  • で表示(鉄則1) ▶ DEMO localhost/php-beginner/index.php
  • Slide 65

    Slide 65 text

    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件ずつ表示できる。文法がここでつながる。

    Slide 66

    Slide 66 text

    完成! 動かしてみよう 追加 → 一覧に出る → リロードしても残る 6. DBに保存する ✔ ① フォーム ✔ ② 一覧表示 ✔ ③ DB保存 ④「買った」で消す (宿題) localhost/php-beginner/ 買い物リスト 追加 ・牛乳 ・パン ・卵 上のとおり、仕様①②③が完成!  フォーム+配列とループ+DB保存、今日学んだ全部が入っている。残る④が宿題。

    Slide 67

    Slide 67 text

    完成コードを、 AIに解説させる 動いた後こそ聞きどき。1行ずつ理解に変える 6. DBに保存する PROMPT ← AIにそのまま送る文(コピーして使えます) この index.php を上から1行ずつ、何をしているのか初心者向けに解説してください。 (コードを貼る) わからなかった行があれば、続けてその行だけ質問します。 ▶ 完成コードの逐行解説は AIの得意技。「動いた」を「わかった」に変えてから次へ。

    Slide 68

    Slide 68 text

    SECTION 7 宿題とまとめ 持ち帰って挑戦。詰まったらAIと一緒に ・宿題:「買った」ボタンで消す ・宿題で使えるプロンプト ・人とAIの役割分担 ・プロンプト集

    Slide 69

    Slide 69 text

    宿題:「買った」ボタンで消す さっき完成させたアプリに、仕様④を追加する 7. 宿題とまとめ 買い物リスト ・牛乳 買った ・パン 買った ・卵 買った 牛乳を 買った! 買い物リスト ・パン 買った ・卵 買った 学べること: POSTで削除リクエスト / IDで対象指定 / DELETE文 / なりすまし送信( CSRF)対策の入口 できたらコミュニティや SNSでぜひシェアを!

    Slide 70

    Slide 70 text

    宿題で詰まったら: AIへの頼み方 7. 宿題とまとめ PROMPT ← AIにそのまま送る文(コピーして使えます) さっき作った買い物リストアプリに「買った」ボタンを追加してください。 ボタンを押した商品だけを DBから削除してください。 条件: ・削除は「削除ボタン」で行う ・「削除ボタン」を押すとその行のデータが消えます。 ・脆弱性の無い作りにしてください。 ・初心者向けに、変更した場所の説明もしてください。 ▶ ポイント:丸投げではなく「条件」を付けて頼む。条件=今日学んだ安全ルールそのもの。

    Slide 71

    Slide 71 text

    人とAIの役割分担 AIに任せるのはOK。ただし「判断」は人の仕事 7. 宿題とまとめ 人がやること ・方向性を決める  何を作るか・どこまで作るか ・仕組みを理解して設計を判断  拡張しやすい形か、効率が良いか ・出力を検証する  動く=安全ではない。鉄則でチェック AIに任せてよいこと ・実装の相棒  たたき台のコードを素早く出す ・わからない所の説明役  今日のプロンプトのように聞けば良い ・選択肢を出す  やり方の候補を並べて比較する 注意:AIが書いたコードも必ず検証する。チェックする観点は今日の鉄則 2つ(最後のまとめでおさらい) 裏側を知る人だけが、 AIの出力を判断できる。

    Slide 72

    Slide 72 text

    AIに聞くときのプロンプト集 ①学ぶ・作る 「ここまで理解したら、こう聞く」— 理解の後に使うのがコツ PROMPT コードの説明 このPHPコードを初心者向けに説明してください。 PHPが実行する部分と、ブラウザに返る結果を 分けて説明してください。 PROMPT 変数の理解 このコードの $message には何が入っていますか?変数を使うメリットを初心者向けに説明してく ださい。 PROMPT 機能追加(条件付き) 「買った」ボタンを追加してください。条件: POSTで削除/IDで指定/PDOプリペアドステートメント /htmlspecialchars。変更点を初心者向けに説明してください。 安全を確かめるプロンプトは次のページ →

    Slide 73

    Slide 73 text

    AIに聞くときのプロンプト集 ②安全を確かめる 動いたら終わりではなく、出てきたコードを検証する聞き方 PROMPT セキュリティ確認 (今日の鉄則) このフォーム処理にセキュリティ上の問題がないか、初心者向けに確認してください。特に XSS (htmlspecialchars)とSQLインジェクション(prepareの「?」)について説明してください。 PROMPT OWASP Top 10 チェック このPHPコード全体を OWASP Top 10 に照らして、脆弱性がないか項目ごとに確認してください。 特にインジェクションを重点的に。見つかった問題は、危険な理由と修正版コードをセットで初心者 向けに説明してください。 OWASP Top 10 = Webアプリの代表的な脆弱性トップ10のリスト。名前だけ覚えて帰ればOK。 おつかれさまでした! Happy Hacking with PHP

    Slide 74

    Slide 74 text

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

    Slide 75

    Slide 75 text

    PHP Foundation https://opencollective.com/phpfoundation PHP本体の開発は、非営利の PHP Foundation が企業や個人の支援を受けて支えています PHPはオープンソフトウェア

    Slide 76

    Slide 76 text

    有限会社アリウープ https://alleyoop.jp フリーランス・個人事業主・副業希望の方!お気軽にお声が けください。 みなさまブースや懇親会でお話させてください SNS @kashioka ご静聴ありがとうございました。

    Slide 77

    Slide 77 text

    No content