PHPを使ってデータベースに接続してみよう(PDO / try-catch)

フォルダとファイル名

MySQL データベースに接続する基本を学びます。PHP の PDO クラスを使って接続し、try-catch でエラーを検出・表示する方法を確認します。

php-dbフォルダにdb01.phpファイルを作成します。

チェックポイント

  • DSN の書き方を理解できたか?
  • PDO で接続できたか?
  • try-catch で失敗時のエラーを確認できたか?

基本コード

下記の基本コードを入力してみましょう(php-db/db01.php)

<?php
// DSN: データベース接続情報(ホスト・DB名・文字コード)
$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
$user = 'root';      // ユーザー名
$password = '';      // パスワード(XAMPPでは空が多い)

try {
    // PDOオブジェクトを作成(ここで接続される)
    $pdo = new PDO($dsn, $user, $password);

    // エラーモードを例外に設定
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    echo "接続成功!<br>";

    $stmt = $pdo->prepare("SELECT * FROM test");
    $stmt->execute();

    $row = $stmt->fetch(PDO::FETCH_ASSOC);
    var_dump($row);

} catch (PDOException $e) {
    echo "接続失敗:" . $e->getMessage();
    exit;
}
?>

DSN(Data Source Name)

$dsn = 'mysql:host=localhost;dbname=testdb;charset=utf8mb4';
  • DSN は「どのデータベースに接続するか」を表す文字列です。
  • mysql: → 使用するデータベースドライバ
  • host=localhost → ローカルのMySQLサーバー
  • dbname=testdb → 使用するデータベース名(データベース上にtestdbがある前提)
  • charset=utf8mb4 → 日本語や絵文字対応の文字コード

ユーザー名とパスワード

$user = 'root';
$password = '';
  • XAMPPやMAMPでは「root/空」で接続できる
  • セキュリティのため本番環境では必ず専用ユーザー+パスワードを設定します。

PDOオブジェクトを作成

$pdo = new PDO($dsn, $user, $password);
  • PHPの PDO(PHP Data Objects) クラスを使って、DBに接続します。
  • $pdo には 接続されたDBオブジェクト が代入され、以後この $pdo を通してSQLを実行します。

エラーモードの設定(とても大事!)

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

この1行は、「データベースのエラーをしっかりキャッチするための設定」です。

なぜ必要なの?

通常、データベースに間違ったSQL文を書いても、PHPは「エラーっぽいな…」と思いながらも止まらずに動こうとしてしまいます。そのため、気づかないまま間違った処理が進んでしまうこともあります。

例えば

$stmt = $pdo->prepare("SELEC * FROM users"); // ← タイプミス(SELECTがSELECに)

このようなスペルミスがあっても、エラー表示されずに画面が真っ白…なんてことも

解決方法:「エラーはちゃんと“例外”として投げて!」と設定する

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

この設定を入れると、エラーが発生したときに**「例外(Exception)」**という形でエラーが投げられます。
これにより、try-catch 文でエラー処理ができるようになります。

SQLを実行してみよう

接続できたら、実際にSQLを投げてデータを取り出してみましょう。

$stmt = $pdo->prepare("SELECT * FROM test"); // SQLを準備する
$stmt->execute();                             // SQLを実行する

$row = $stmt->fetch(PDO::FETCH_ASSOC);        // 1件だけ取り出す
var_dump($row);                               // 中身を確認する
  • $pdo->prepare("SELECT * FROM test")
    users テーブルから全件データを取るSQL文を準備します。
    prepare は「SQLをあらかじめ準備する」という意味です。
  • $stmt->execute()
    準備したSQLを実際に実行します。
  • $stmt->fetch(PDO::FETCH_ASSOC)
    結果セットの中から1行だけ取り出します。PDO::FETCH_ASSOC を指定すると「連想配列」として取り出せます。
  • var_dump($row
    PHPの変数の中身を「型情報つき」でそのまま表示するデバッグ用関数です。
  • これで「確かにDBの中身が取れている!」と確認できます。

try-catch による例外処理

PHPでデータベースに接続するときは、エラーが出る可能性があります。たとえば「パスワードを間違えた」「データベースが存在しない」といった場合です。そのときに使うのが try-catch です。

try {
    // うまくいくか試す処理
} catch (PDOException $e) {
    // エラーが出たらここに来る
    echo "接続失敗:" . $e->getMessage();
}

  • try { ... }
    「ここでエラーが出るかもしれないから、とりあえずやってみる」という部分。
  • catch (PDOException $e) { ... }
    実際にエラーが出たときに処理が飛んでくる場所。
    ここでエラーメッセージを表示したり、ログに残したりできる。
  • $e->getMessage()
    エラーの内容(「どこが悪いのか」)を文字列として取り出す。

トラブル例(XAMPP/MAMP)

症状原因・対処法
接続失敗:SQLSTATE[HY000] [1049] Unknown database 'testdb'testdbが存在しない。phpMyAdminで作成してください。
接続失敗:Access denied for user 'root'@'localhost'ユーザー名・パスワードが違う。MAMPの場合は root / root のことも。
エラーメッセージが出ないERRMODE_EXCEPTION を設定していない可能性あり