🇯🇵 日本語 | 🇺🇸 English | 🇪🇸 Español | 🇵🇹 Português | 🇹🇭 ไทย | 🇨🇳 中文

【PHP入門】PHPとデータベース(SQL)を連携させて一覧表示する基本

これまでの記事で、PHPの配列やループ、関数といった基本的な文法を学んできました。しかし、実際のWebサイトでは、お知らせや商品リストなどのデータは、PHPファイルに直接書き込むのではなく、データベースという専用の金庫で管理するのが一般的です。

「PHPとデータベースをどうやって繋ぐの?」、「SQLで取得したデータをどうやってWebページに表示するの?」これは、多くのWeb制作者が通る大きな関門です。この記事では、その疑問を解消します。PHPからデータベースに接続し、SQLで取得したデータを`foreach`ループで表(テーブル)として表示する、という一連の流れを、コピペで動く完結したコードで体験してみましょう。PHPとSQLが繋がる瞬間の感動を味わえば、きっとあなたも自分のデータで試してみたくなるはずです!

PHPを動かすための準備(開発環境)まだXAMPP「ザンプ」を構築してない方は、【PHP入門】XAMPPのダウンロードとインストール方法を徹底解説!を参照してください。 インストール後、指定されたフォルダ(`htdocs`など)にPHPファイルを置けば、準備は完了です!

1. PHPとデータベース連携の3ステップ

PHPがデータベースと対話する流れは、大きく分けて以下の3つのステップで成り立っています。

  1. 接続 (Connect): PHPがデータベースに「こんにちは、お話よろしいですか?」と挨拶し、接続を確立します。
  2. 命令 (Execute Query): PHPがSQLという言語で「このテーブルから、このデータをください」とデータベースに命令します。
  3. 表示 (Display Results): データベースから受け取ったデータを、PHPがHTMLに変換してWebページに表示します。

今回は、この3ステップを安全かつ現代的な方法で実現するPDO (PHP Data Objects) という仕組みを使います。PDOは、様々な種類のデータベースに対応できるPHPの標準的な機能で、セキュリティ面でも優れているため、現在のPHP開発では必須の知識となっています。

2. 実践!商品リストをデータベースから表示する

それでは、実際にデータベースから商品リストを取得して表示するコードを書いていきましょう。

ステップA: データベースとテーブルの準備

まず、データを格納するためのテーブルを準備する必要があります。phpMyAdminなどのデータベース管理ツールで、以下のSQL文を実行して`products`テーブルを作成し、サンプルデータを3件登録してください。

CREATE TABLE products (
  id INT AUTO_INCREMENT PRIMARY KEY,
  name VARCHAR(255) NOT NULL,
  price INT NOT NULL,
  created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

INSERT INTO products (name, price) VALUES
('高性能ノートPC', 120000),
('ワイヤレスイヤホン', 15000),
('4Kモニター', 45000);

ステップB: PHPでデータを取得・表示する

テーブルの準備ができたら、いよいよPHPの出番です。以下のコードは、データベースへの接続からデータの取得、HTMLでの表示までを全て含んだ完全なサンプルです。このファイルをサーバーにアップロードすれば、ブラウザで結果を確認できます。

<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>商品リスト</title>
    <style>
        body { font-family: sans-serif; padding: 20px; }
        h1 { border-bottom: 2px solid #0056b3; }
        .product-table { width: 100%; border-collapse: collapse; margin-top: 20px; }
        .product-table th, .product-table td { border: 1px solid #ddd; padding: 12px; text-align: left; }
        .product-table th { background-color: #f2f2f2; }
        .product-table tr:nth-child(even) { background-color: #f9f9f9; }
        .error-message { color: red; font-weight: bold; border: 1px solid red; padding: 10px; }
    </style>
</head>
<body>
    <h1>商品リスト</h1>

    <?php
    // --- 1. データベースへの接続 ---
    $db_host = 'localhost';     // データベースサーバーのホスト名
    $db_name = 'your_database_name'; // データベース名
    $db_user = 'your_username';       // データベースのユーザー名
    $db_pass = 'your_password';       // データベースのパスワード

    try {
        // PDOオブジェクトを作成してデータベースに接続
        $pdo = new PDO("mysql:host={$db_host};dbname={$db_name};charset=utf8", $db_user, $db_pass);
        // エラー発生時に例外をスローするように設定
        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

        // --- 2. SQLの実行 ---
        // productsテーブルから全てのデータを取得するクエリ
        $stmt = $pdo->prepare("SELECT id, name, price FROM products ORDER BY id");
        $stmt->execute();

        // --- 3. 結果の取得と表示 ---
        // 全てのデータを連想配列として取得
        $products = $stmt->fetchAll(PDO::FETCH_ASSOC);

        if ($products) {
            echo '<table class="product-table">';
            echo '<tr><th>商品ID</th><th>商品名</th><th>価格</th></tr>';
            
            // foreachでループ処理
            foreach ($products as $product) {
                echo '<tr>';
                echo '<td>' . htmlspecialchars($product['id']) . '</td>';
                echo '<td>' . htmlspecialchars($product['name']) . '</td>';
                echo '<td>¥' . number_format($product['price']) . '</td>';
                echo '</tr>';
            }
            echo '</table>';
        } else {
            echo '<p>商品データが見つかりませんでした。</p>';
        }

    } catch (PDOException $e) {
        // 接続エラーやクエリエラーが発生した場合の処理
        echo '<div class="error-message">データベースエラー: ' . htmlspecialchars($e->getMessage()) . '</div>';
    }
    ?>
</body>
</html>

重要:上記のコードを実行する前に、`your_database_name`, `your_username`, `your_password` の部分を、ご自身の環境に合わせて必ず書き換えてください。

ブラウザでこのファイルにアクセスし、テーブルに商品リストが表示されれば成功です!PHPがデータベースと対話し、その結果を動的にHTMLとして生成した瞬間です。

3. 気をつけるべき点

データベース連携は非常に強力ですが、いくつか注意すべき点があります。特にセキュリティとエラー処理は重要です。

エラー処理 (try...catch構文)

データベースのパスワードが間違っていたり、SQLの構文にミスがあったりすると、プログラムはエラーで停止してしまいます。`try...catch`構文で処理全体を囲むことで、もしエラーが発生しても、サイトが真っ白になる代わりに、キャッチして独自のエラーメッセージを表示させることができます。

<?php
try {
    // データベースに接続し、データを取得する処理
    // もしこの中でエラーが起きると...
    $pdo = new PDO("mysql:host=localhost;dbname=wrong_db;charset=utf8", "user", "pass");

} catch (PDOException $e) {
    // ...ここの処理が実行される
    echo "エラーが発生しました: " . $e->getMessage();
    // 実際のサイトでは、ユーザーには簡単なメッセージだけを見せ、
    // エラーの詳細はログファイルに記録するなどの対応をします。
    // exit(); // 処理を中断
}
?>

この仕組みにより、予期せぬエラーが起きてもユーザーを混乱させることなく、開発者はエラーの原因を特定しやすくなります。

SQLインジェクション対策

ユーザーからの入力(検索キーワードなど)を元にSQL文を組み立てる場合、**SQLインジェクション**という非常に危険な攻撃を受ける可能性があります。これは、悪意のあるSQL文を注入されてデータベースを不正に操作されてしまう攻撃です。

PDOの**プリペアドステートメント**(`prepare()`と`execute()`を使う方法)は、このSQLインジェクションに対する最も効果的な対策です。たとえ今回はユーザー入力がなくても、常にこの方法を使う癖をつけておきましょう。

4. まとめ

今回は、PHPとデータベースを連携させる基本の3ステップ(接続・命令・表示)を、PDOを使って一気通貫で学びました。これまでPHPファイル内に直接書いていたデータを、データベースという外部の保管庫から動的に取得して表示できるようになったことは、Webアプリケーション開発における大きな一歩です。

この基本形をマスターすれば、`WHERE`句を追加して特定の条件でデータを絞り込んだり、フォームと連携させて`INSERT`文でデータを登録したりと、様々な応用が可能になります。ぜひ、自分で作ったテーブルやデータで色々と試してみてください!