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();

値をprepareexecuteで分けることで、入力値が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;

UPDATEDELETEでは、対象を絞るWHEREを忘れないでください。条件を付け忘れると全行を変更・削除する可能性があります。

一覧表示までの流れ

  1. フォームやURLから入力値を受け取る。
  2. 入力値の形式と長さを確認する。
  3. プレースホルダー付きSQLを作る。
  4. PDOで実行する。
  5. 取得結果を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、プレースホルダー、INSERTUPDATEDELETEの順に学ぶと理解しやすくなります。