PDO で DB に接続する
テクノロジ系 / db (PDO / SQL / マルチDB)
PDO で DB に接続する
Lesson 11 / Chapter 2
PDO とは
PDO = PHP Data Objects。PHP 標準の DB 接続ライブラリ。
<?php
$pdo = new PDO('sqlite:/tmp/test.sqlite');- DB の種類が変わっても 書き方がほぼ同じ (SQLite / MySQL / PostgreSQL …)
- 違うのは最初の文字列 (DSN) だけ
- PHP で DB を触るときは「まず PDO」で OK
DSN は「どの DB のどこに繋ぐか」
DSN = Data Source Name。new PDO() の第 1 引数に渡す文字列。
SQLite : 'sqlite:/path/to/file.sqlite' MySQL : 'mysql:host=localhost;dbname=mydb;charset=utf8mb4' PostgreSQL : 'pgsql:host=localhost;dbname=mydb'
- 先頭
sqlite:/mysql:/pgsql:で DB の種類 を指定 - 後ろは DB ごとに必要な情報 (ファイルパス / ホスト名 / DB 名 …)
認証 (ユーザー / パスワード) が要るか
// SQLite はファイルなのでユーザー認証なし
$pdo = new PDO('sqlite:/tmp/test.sqlite');
// MySQL / PostgreSQL はサーバーに繋ぐので user / password が必要
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'myuser',
'mypassword'
);| DB | user / password |
|---|---|
| SQLite | 不要 (ファイルにアクセスするだけ) |
| MySQL | 必要 |
| PostgreSQL | 必要 |
このコースでは SQLite を使う
<?php
$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
echo "接続成功\n";- 採点ランナーが一時 SQLite を作って、そのパスを
DOJO_DB_PATH環境変数で渡してくる getenv('DOJO_DB_PATH')で取り出して DSN に連結する- MySQL や PostgreSQL でもコードはほぼ同じ (DSN だけ差し替え)
エラーモードを必ず例外にする
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
- これを 書かないと、SQL を間違えても
falseが返るだけで気付けない - これを 書くと、失敗時に
PDOExceptionが投げられる → 気付ける - DB を触るコードでは 毎回これを書く くらいの気持ちで OK
このチャプターでできるようになること
✅ new PDO($dsn) で DB に接続できる
✅ DSN の先頭で DB の種類が決まると言える
✅ SQLite / MySQL / PostgreSQL の DSN を読み分けられる
✅ PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION を設定する
→ ドリルへ
考えてみよう
既定では正解・不正解の判定はしません。自分のペースで「答えを見る」を。採点してほしい場合だけ「採点してほしい」を押してください。
ドリル 01 — SQLite に接続して「接続成功」と出力
問題
環境変数 DOJO_DB_PATH に渡されている SQLite ファイルに PDO で接続し、ちょうど次の 1 行を出力してください。
期待される出力:
接続成功
採点
php scripts/grade.php topics/db/ch02-pdo-connect/drill/01-connect-print/
ヒント
- DSN は
'sqlite:' . getenv('DOJO_DB_PATH') - 接続が失敗すると例外が飛ぶように、
PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTIONを設定する - 接続できたら
echo "接続成功\n";
ドリル 02 — 接続中のドライバ名を出力
問題
PDO で SQLite に接続し、PDO::ATTR_DRIVER_NAME 属性を取り出して、接続中のドライバ名 (今回は sqlite) をちょうど 1 行で出力してください。
期待される出力:
sqlite
採点
php scripts/grade.php topics/db/ch02-pdo-connect/drill/02-show-driver/
ヒント
- 接続後に
$pdo->getAttribute(PDO::ATTR_DRIVER_NAME)を呼ぶ - 返ってきた文字列を
echoする (末尾に\nを忘れずに) - DSN を
mysql:...にすればこれがmysqlになる、というのが PDO の良いところ