1 of 12

PHP教材

PHP で始める

Webアプリ開発

config.php / DB接続 / include / SQL / セキュリティ

config.php

index.php

insert.php

delete.php

2 of 12

ToDo管理アプリ ─ ファイル構成と処理の流れ

🌐 ブラウザ

フォーム送信

(POST)

GETリクエスト

index.php

・タスク一覧表示

・新規フォーム表示

・include config.php

insert.php

・空チェック

・INSERT SQL実行

・index.phpへリダイレクト

delete.php

DELETE SQL → リダイレクト

POST送信

POST送信

⚙ config.php

・エラー設定

・DB接続情報

・$conn オブジェクト

include

🗄 MySQL DB

3 of 12

config.php とは何か

⚙️ 設定の一元管理

DB接続情報・エラー設定などを

1ファイルにまとめる

🔒 セキュリティ

パスワード等の機密情報を

1箇所に隔離できる

🔧 変更の容易さ

DB情報が変わっても

config.phpだけ修正すれば良い

config.php

<?php

// ① エラー設定

ini_set('display_errors', 1);

// 本番は「0」に変更

error_reporting(E_ALL);

// ② DB接続情報

$servername = "localhost";

$username = "root";

$password = "●●●●";

$dbname = "myapp";

// ③ 接続オブジェクト生成

$conn = new mysqli(...);

if ($conn->connect_error) {

die("接続失敗");

}

💡 本番環境では display_errors を 0 に! エラー内容が外部に漏れるのを防ぐ

4 of 12

include とは ─ ファイルを読み込む仕組み

insert.php

include 'config.php';

// ↑ ここで展開される

$id = ...;

$task_name = $_POST[...];

$stmt = $conn->prepare(...);

展開

config.php

$servername = "...";

$username = "...";

$password = "...";

$dbname = "...";

$conn = new mysqli(...);

// ← $conn がここで作られ

// insert.php で使える!

✅ $conn

が使える

1

include はファイルの内容をそのまま貼り付けるイメージ

2

config.php を include すると $conn 変数が使えるようになる

3

全PHPファイルが include config.php から始まる

5 of 12

空チェック(empty)とは ─ なぜ必要か

❌ 空チェックなしの場合

ユーザーがタスク名を空のまま�「追加」ボタンを押すと…��→ task_name = '' が INSERT される�→ 空のタスクがDBに登録される�→ アプリの品質低下・バグの原因��SQLで NOT NULL 制約があれば

エラーにもなる可能性がある

✅ 空チェックありの場合

insert.php の先頭で確認:

if (empty($_POST['task_name'])) {

header('Location: index.php');

exit;

}

→ 空の場合は index.php に戻す�→ DBには何も保存されない�→ アプリが安全に動作する��※ HTMLの required 属性も

あるが、PHPでも必ず確認する

empty($var) が true になる場合:""(空文字)/ 0 / false / null / 未定義の変数 ← どれも「値がない」状態とみなす

6 of 12

prepare / bind_param(バインド)とは

① prepare( SQL )

SQL文の「型」だけ先にDBに送る

値の場所は ? で仮置き

$stmt = $conn->prepare(

"INSERT INTO list

(id, task_name, status)

VALUES(?, ?, ?)" );

② bind_param( 型指定, 変数... )

? に実際の値を「安全に」結びつける

型を文字列で指定する

$stmt->bind_param(

"isi",

$id, $task_name, $status

);

型指定文字 一覧

文字

説明

"i"

integer(整数)

$id = 123

"s"

string(文字列)

$name = "sample"

"d"

double(小数)

$price = 9.99

"b"

blob(バイナリ)

画像データ等

🔒 なぜバインドが必要? → SQLインジェクション攻撃を防ぐため。値を直接SQL文に埋め込むのは危険!

7 of 12

🔒 SQLインジェクション ─ バインドがない場合の危険

❌ 危険な書き方(バインドなし)

$name = $_POST["task_name"];

$sql = "INSERT INTO list

(task_name)

VALUES('$name')";

$conn->query($sql);

攻撃者の入力例

'); DROP TABLE list; --

↓ 結果的に実行されるSQL

INSERT INTO list (task_name)

VALUES(''); DROP TABLE list; --'

⚠ テーブルが全削除される! → データ完全消失

✅ 安全な書き方(バインドあり)

$stmt = $conn->prepare("INSERT INTO list (task_name) VALUES(?)");

$stmt->bind_param("s", $task_name); // ← 値はここで安全に渡す

$stmt->execute();

// ? の部分は「文字列」として扱われ、SQL命令として解釈されない

bind_param を使うと、? 部分は必ず「データ」として扱われる。SQL命令として実行されない。

8 of 12

SQL 復習 ─ SELECT(データの取得)

SELECT カラム名 FROM テーブル名 [WHERE 条件] [ORDER BY カラム] [LIMIT 件数]

SELECT id, task_name, status FROM list

⬇ 取得結果イメージ

id

task_name

status

000001

牛乳を買う

0

000002

メール返信

1

000003

資料作成

0

PHPでの流れ

$stmt = $conn->prepare(

"SELECT id,

task_name, status

FROM list"

);

$stmt->execute();

$result =

$stmt->get_result();

while ($row =

$result->fetch_assoc())

{

echo $row["task_name"];

}

num_rows > 0 でデータが存在するか確認 → fetch_assoc() で1行ずつ配列として取得

9 of 12

SQL 復習 ─ INSERT / DELETE / UPDATE

INSERT ─ データを追加

INSERT INTO テーブル名 (カラム1, カラム2, ...) VALUES (値1, 値2, ...);

例: $conn->prepare("INSERT INTO list (id, task_name, status) VALUES(?, ?, ?)");

DELETE ─ データを削除

DELETE FROM テーブル名 WHERE 条件;

例: $conn->prepare("DELETE FROM list WHERE id = ?"); ← WHERE 必須!忘れると全件削除!

UPDATE ─ データを更新(参考)

UPDATE テーブル名 SET カラム1=値1, ... WHERE 条件;

例: $conn->prepare("UPDATE list SET status = ? WHERE id = ?");

⚠ DELETE・UPDATE には必ず WHERE を付ける! 付け忘れると全データが対象になる

10 of 12

DB接続エラーの確認 / XSS対策(htmlspecialchars)

DB接続エラーチェックの流れ

new mysqli(...) を実行

connect_error を確認

エラー あり → die() で停止

エラー なし → 処理を続行

if ($conn->connect_error) {

die("接続失敗: " . $conn->connect_error);

}

🔒 XSS対策 htmlspecialchars()

XSSとは:

ユーザー入力に悪意ある

HTMLやJSが含まれると

ブラウザで実行されてしまう

<script>alert("ハック")</script>

↓ htmlspecialchars()を通すと

&lt;script&gt;...&lt;/script&gt;

HTMLタグとして無効化され

安全に表示できる

echo htmlspecialchars($row["task_name"]); ← 出力時は必ずエスケープ!

11 of 12

insert.php 処理フロー ─ 全体の流れを確認

① include 'config.php'

$conn を取得

② 空チェック

empty($_POST['task_name'])

③ 変数に値を受け取る

$id $task_name $status

④ prepare( SQL )

INSERT INTO list (...) VALUES(?,?,?)

⑤ bind_param( 型, 変数 )

"isi", $id, $task_name, $status

⑥ execute() → リダイレクト

成功: index.php へ / 失敗: エラー表示

空なら

index.phpへ戻る

空の場合

12 of 12

まとめ

config.php

設定・DB接続を一元管理。全PHPファイルから include して使う

include

ファイルの内容をその場に展開する。$conn などの変数が引き継がれる

空チェック

empty() でフォーム入力の有無を確認。空なら処理を中断してリダイレクト

prepare / bind_param

SQLインジェクション対策。? で型を定義し、値は必ず bind_param で渡す

htmlspecialchars

画面出力時にHTMLタグを無効化。XSS(クロスサイトスクリプティング)を防ぐ

SQL基本4操作

SELECT / INSERT / DELETE / UPDATE。DELETE・UPDATEは必ずWHEREを付ける