PHP教材
PHP で始める
Webアプリ開発
config.php / DB接続 / include / SQL / セキュリティ
config.php
index.php
insert.php
delete.php
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
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 に! エラー内容が外部に漏れるのを防ぐ
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 から始まる
空チェック(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 / 未定義の変数 ← どれも「値がない」状態とみなす
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文に埋め込むのは危険!
🔒 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命令として実行されない。
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行ずつ配列として取得
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 を付ける! 付け忘れると全データが対象になる
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()を通すと
<script>...</script>
HTMLタグとして無効化され
安全に表示できる
echo htmlspecialchars($row["task_name"]); ← 出力時は必ずエスケープ!
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へ戻る
空の場合
まとめ
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を付ける