フォルダとファイル名
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 を設定していない可能性あり |
