PHPからMySQLへ接続!PDOを使ったデータベース接続の基本

データベースとSQLの基本を学んだら、次はいよいよPHPプログラムからデータベースに接続し、データを操作するステップに進みます。PHPとデータベースを繋ぐことで、Webアプリケーションは初めてデータを「記憶」し、活用できるようになります。

現在、PHPからデータベースに接続する方法として、PDO (PHP Data Objects) を利用するのが最も標準的で安全な方法です。

この記事では、PDOを使ってMySQLデータベースに接続するための基本的な手順と、エラーが起きても安全に処理するための作法を分かりやすく解説します。


目次

1. データベース接続に必要な4つの情報

PHPからデータベースに接続するには、まず以下の4つの情報が必要です。ローカル開発環境(MAMP/XAMPP)を前提としていますので、ご自身の環境に合わせて準備してください。

  1. DSN (Data Source Name): データベースの「住所」のようなものです。どの種類のデータベースに、どのサーバーの、どのデータベースに接続するかを指定します。 mysql:host=localhost;dbname=my_first_db;charset=utf8mb4
    • mysql:: 使用するデータベースの種類
    • host=localhost: サーバーの場所(自分のPCなのでlocalhost)
    • dbname=my_first_db: 使用するデータベース名
    • charset=utf8mb4: 文字コード(絵文字も扱えるこの設定を推奨)
  2. ユーザー名: データベースにアクセスするためのユーザー名です。(例: root
  3. パスワード: 上記ユーザーのパスワードです。(MAMPの初期設定はroot、XAMPPは空''の場合が多いです)

2. PDOを使った接続とエラー処理 try...catch

データベースへの接続は、パスワードが違う、サーバーが起動していないなどの理由で失敗することがあります。プログラムが途中でエラーを出して停止するのを防ぐため、PDOでの接続処理はtry...catchブロックで囲むのが定石です。

  • try: 接続処理など、エラーが起こる可能性のあるコードをこの中に書きます。
  • catch: tryの中でエラー(専門用語で例外)が発生した場合に、このブロックの処理が実行されます。

基本的な接続コード:

<?php
$dsn = 'mysql:host=localhost;dbname=my_first_db;charset=utf8mb4';
$user = 'root';
$password = 'root'; // ご自身の環境に合わせて変更してください

try {
    // データベースへの接続を試みる
    $pdo = new PDO($dsn, $user, $password);
    echo "データベースへの接続に成功しました。";

} catch (PDOException $e) {
    // 接続失敗時にエラーメッセージを表示
    echo "接続失敗: " . $e->getMessage();
    exit(); // プログラムを終了
}
?>

このコードを実行し、「成功しました」と表示されれば、PHPとデータベースの間の道が繋がったことになります。


3. 覚えておきたいPDOの重要設定

接続が成功したら、より安全で開発しやすくなるように、PDOオブジェクトにいくつかの設定を追加しましょう。これは接続直後に行うおまじないのようなものだと考えてください。

// 上記の try ブロックの中に追加
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
  1. ATTR_ERRMODE, ERRMODE_EXCEPTION: SQL文の実行でエラーが発生した場合に、警告を出すだけでなく、catchで捕まえられる例外を発生させる設定です。これにより、SQLのエラーも接続エラーと同じように処理でき、デバッグが非常に楽になります。
  2. ATTR_EMULATE_PREPARES, false: セキュリティ(SQLインジェクションという攻撃)対策に関連する設定です。データベースが持つ本来の静的プレースホルダ機能を使うように指示し、アプリケーションをより安全にします。

4. 接続後の流れ:データを安全に取得する

データベースに接続できたら、実際にデータを取得してみましょう。 以下は、前回作成したreviewsテーブルから全てのデータを取り出して表示する、推奨される書き方です。

fetch_reviews.phpのサンプルコード:

<?php
$dsn = 'mysql:host=localhost;dbname=my_first_db;charset=utf8mb4';
$user = 'root';
$password = 'root';

try {
    // 1. データベースに接続
    $pdo = new PDO($dsn, $user, $password);
    // 2. 重要設定を追加
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);

    // 3. SQL文を準備
    $sql = "SELECT * FROM reviews";
    $stmt = $pdo->prepare($sql);

    // 4. SQLを実行
    $stmt->execute();

    // 5. 結果を配列として全て取得
    $reviews = $stmt->fetchAll(PDO::FETCH_ASSOC);

} catch (PDOException $e) {
    echo "接続失敗: " . $e->getMessage();
    exit();
}
?>
<!DOCTYPE html>
<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>レビュー一覧</title>
</head>
<body>
    <h1>レビュー一覧</h1>
    <?php foreach ($reviews as $review): ?>
        <dl>
            <dt>書籍名:</dt>
            <dd><?php echo htmlspecialchars($review['book_title'], ENT_QUOTES, 'UTF-8'); ?></dd>
            <dt>評価:</dt>
            <dd><?php echo htmlspecialchars($review['rating'], ENT_QUOTES, 'UTF-8'); ?></dd>
        </dl>
    <?php endforeach; ?>
</body>
</html>

ポイント:

  • prepare()でSQL文を「準備」し、execute()で「実行」するのが安全な流れです。
  • fetchAll(PDO::FETCH_ASSOC)は、結果をカラム名がキーとなった連想配列の形で取得する便利な命令です。

なお、データの操作が終わった後に接続を明示的に閉じるには$pdo = null;と書きますが、通常はスクリプトが終了すると自動的に接続が閉じるため、必須ではありません。

まとめ

  • PHPからデータベースへの接続には、PDOを使うのが現代の標準。
  • 接続情報はDSNユーザー名パスワードの3つが基本。
  • 接続処理は**try...catch**で囲み、エラーを確実に捕捉する。
  • 接続後は、エラー処理とセキュリティのための**setAttribute**を忘れずに行う。

この安全な接続処理は、あらゆるデータベース操作の土台となります。一度書き方を覚えてしまえば、様々なアプリケーションで使い回すことができる強力な武器になります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次