採点されません。匿名です。 間違えることは学習の一部です。読むだけでもかまいません。

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'
);
DBuser / 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 の良いところ