PHPとSQLの役割を分けて考える
データベースアプリは、画面から入力された情報を保存し、必要なときに検索・表示・更新・削除する仕組みです。PHPとSQLは役割が異なります。PHPは画面表示や処理の流れを担当し、SQLはデータベースの検索・保存・変更・削除を担当します。
PHPの基本構文
変数と文字列
PHPの変数は$から始まります。文の終わりにはセミコロン;を付けます。
<?php
$name = '山田';
$message = "こんにちは、{$name}さん";
echo $message;
条件分岐と繰り返し
<?php
$price = 800;
if ($price >= 1000) {
echo '高額商品';
} else {
echo '通常商品';
}
$items = ['パン', 'スープ', '飲み物'];
foreach ($items as $item) {
echo $item . '<br>';
}
データベースから取得した複数行を表示するときは、foreachをよく使います。
SQLの基本:SELECTで検索する
SQLの基本は、どの表からどの列を取り出すかを指定するSELECTです。
SELECT id, name, email
FROM customers
WHERE name = '山田';
SELECT:取り出す列FROM:検索する表WHERE:条件
必要な列だけを指定すると、処理内容が分かりやすくなります。
並び順と件数
SELECT id, title, created_at
FROM inquiries
WHERE status = 'open'
ORDER BY created_at DESC
LIMIT 20;
ORDER BYで並び順、DESCで新しい順、LIMITで取得件数を指定できます。
PHPからPDOで接続する
PHPからMySQLなどへ接続するときはPDOを使う方法が一般的です。接続情報はソースコードへ直接書かず、設定ファイルや環境変数で管理します。
<?php
$pdo = new PDO(
'mysql:host=localhost;dbname=sample;charset=utf8mb4',
$dbUser,
$dbPassword,
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]
);
PDO::ERRMODE_EXCEPTIONを設定すると、接続やSQLの失敗を例外として扱えます。詳細なエラーは利用者へ表示せず、ログへ記録します。
プレースホルダーで安全に検索する
入力値をSQL文字列へ直接連結するのは危険です。SQLインジェクションを防ぐため、プレースホルダーを使います。
<?php
$sql = 'SELECT id, name, email
FROM customers
WHERE email = :email';
$stmt = $pdo->prepare($sql);
$stmt->execute(['email' => $email]);
$customer = $stmt->fetch();
値をprepareとexecuteで分けることで、入力値がSQL命令として解釈されるリスクを下げられます。
INSERT・UPDATE・DELETEの基本
登録:INSERT
INSERT INTO customers (name, email)
VALUES (:name, :email);
更新:UPDATE
UPDATE customers
SET name = :name
WHERE id = :id;
削除:DELETE
DELETE FROM customers
WHERE id = :id;
UPDATEとDELETEでは、対象を絞るWHEREを忘れないでください。条件を付け忘れると全行を変更・削除する可能性があります。
一覧表示までの流れ
- フォームやURLから入力値を受け取る。
- 入力値の形式と長さを確認する。
- プレースホルダー付きSQLを作る。
- PDOで実行する。
- 取得結果を
foreachで表示する。
<?php
$keyword = trim((string)($_GET['q'] ?? ''));
$stmt = $pdo->prepare(
'SELECT id, name FROM customers
WHERE name LIKE :keyword ORDER BY id DESC LIMIT 50'
);
$stmt->execute(['keyword' => '%' . $keyword . '%']);
foreach ($stmt->fetchAll() as $customer) {
echo '<li>' . htmlspecialchars($customer['name'], ENT_QUOTES, 'UTF-8') . '</li>';
}
データベースから取得した文字列をHTMLへ出すときは、htmlspecialcharsでHTMLとして解釈されないようにします。SQL対策とHTML出力時のエスケープは別々に必要です。
初心者がつまずきやすい点
- SQLの列名・表名が実際の構造と一致していない。
- PHPの括弧やセミコロンが閉じていない。
WHEREなしで更新・削除してしまう。- 入力値をSQLへ直接連結している。
- 取得結果が空のときの表示を用意していない。
- 本番データを試験用コードで変更してしまう。
最初はテスト用の表と少量のデータで確認します。変更系SQLを実行する前に、対象行を確認するSELECTを先に実行する習慣を付けると安全です。
まとめ
PHPとSQLでデータベースアプリを作るときは、PHPで処理の流れを組み、SQLでデータを操作します。PHPの変数・条件分岐・繰り返し、SQLのSELECT、PDO、プレースホルダー、INSERT・UPDATE・DELETEの順に学ぶと理解しやすくなります。