ch02 12章中 2章目

ch02 — PDO で SQLite 接続 / DSN 比較

スライドで見る

この章を AI と学ぶ

💬 AI に聞く質問例 3 件
  1. 「ch02 — PDO で SQLite 接続 / DSN 比較」のつまずきやすいポイントを、初学者向けに3つ教えてください

    ChatGPT Claude Gemini

  2. 「ch02 — PDO で SQLite 接続 / DSN 比較」について、自分の手で試せる練習問題を3つ出してください (難易度を上げながら)

    ChatGPT Claude Gemini

  3. 「ch02 — PDO で SQLite 接続 / DSN 比較」を学んだ後、次に学ぶと良いトピックは何ですか?理由も教えてください

    ChatGPT Claude Gemini

概要

PHP から DB を触るには PDO (PHP Data Objects) という標準ライブラリを使う。PDO は SQLite / MySQL / PostgreSQL を 同じインターフェース で扱えるよう抽象化されていて、後から DB を切り替えても呼び出しコードはほぼ無修正で済む。実務でもまず PDO を覚えれば困らない。

接続時に渡す DSN (Data Source Name) は「どの種類の DB の・どこに繋ぐか」を表す文字列で、sqlite:/path/to.db / mysql:host=localhost;dbname=app;charset=utf8mb4 / pgsql:host=localhost;dbname=app のように DB 種類ごとに記法が違う。先頭の sqlite: / mysql: / pgsql: が DB の種類を切り替えるスイッチになる。

接続したら必ず setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION) を呼ぶこと。これを設定しないと DB エラーが 静かに無視 される。設定しておけば SQL の失敗が即 PDOException として飛んでくるので、exception トピックで学んだ try / catch で扱える。

学習目標

  • PDO で DB に接続するコードを書ける
  • DSN (Data Source Name) が「どの DB のどこに繋ぐか」を表す文字列だと理解する
  • SQLite / MySQL / PostgreSQL の DSN を読み分けられる
  • PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION を設定する習慣を付ける

ドリル

no 内容
01 SQLite に接続して「接続成功」と出力
02 接続中のドライバ名を取り出して出力

採点用 DB について

このチャプター以降、ドリルの採点ランナーは tests/setup.sql を一時 SQLite に流し込んで、そのファイルパスを環境変数 DOJO_DB_PATH で渡してきます。受講生コードは次の形で接続してください。

$pdo = new PDO('sqlite:' . getenv('DOJO_DB_PATH'));
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

解説スライド 全 7 枚

右の ボタン キー(またはスワイプ)で次のスライドに進めます。 下の「縦表示」を開くと全スライドを一気に読めます。

  1. PDO で DB に接続する

    Lesson 11 / Chapter 2

  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
  3. 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 名 …)
  4. 認証 (ユーザー / パスワード) が要るか

    // 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 必要
  5. このコースでは 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 だけ差し替え)
  6. エラーモードを必ず例外にする

    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    • これを 書かないと、SQL を間違えても false が返るだけで気付けない
    • これを 書くと、失敗時に PDOException が投げられる → 気付ける
    • DB を触るコードでは 毎回これを書く くらいの気持ちで OK
  7. このチャプターでできるようになること

    new PDO($dsn) で DB に接続できる ✅ DSN の先頭で DB の種類が決まると言える ✅ SQLite / MySQL / PostgreSQL の DSN を読み分けられる ✅ PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION を設定する

    → ドリルへ

1 / 7
📜 スライドを全部一気に読む(縦表示)

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 を設定する

→ ドリルへ

この章で取り組む 演習問題の流れ (2ステップ)
  1. 01 ドリル 01 — SQLite に接続して「接続成功」と出力 README.md starter.php answer.php
  2. 02 ドリル 02 — 接続中のドライバ名を出力 README.md starter.php answer.php

演習問題の詳細

この章の演習問題の内容を読めます。実際に手元で解くには教材リポジトリを clone してください。

ドリル 01 — SQLite に接続して「接続成功」と出力

問題

環境変数 DOJO_DB_PATH に渡されている SQLite ファイルに PDO で接続し、ちょうど次の 1 行を出力してください。

期待される出力:

接続成功

ヒント

  • DSN は 'sqlite:' . getenv('DOJO_DB_PATH')
  • 接続が失敗すると例外が飛ぶように、 PDO::ATTR_ERRMODE = PDO::ERRMODE_EXCEPTION を設定する
  • 接続できたら echo "接続成功\n";

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

ドリル 02 — 接続中のドライバ名を出力

問題

PDO で SQLite に接続し、PDO::ATTR_DRIVER_NAME 属性を取り出して、接続中のドライバ名 (今回は sqlite) をちょうど 1 行で出力してください。

期待される出力:

sqlite

ヒント

  • 接続後に $pdo->getAttribute(PDO::ATTR_DRIVER_NAME) を呼ぶ
  • 返ってきた文字列を echo する (末尾に \n を忘れずに)
  • DSN を mysql:... にすればこれが mysql になる、というのが PDO の良いところ

🧪 ブラウザで試す

スライドのコードを写経して ▶ 実行、自分で書いて 📝 採点 で答え合わせ。初回のみ PHP ランタイム読込で数秒かかります。

PHP ランタイム未読込

          

        

演習問題(2問)

  1. ドリル 01 — SQLite に接続して「接続成功」と出力

    README.md starter.php answer.php

  2. ドリル 02 — 接続中のドライバ名を出力

    README.md starter.php answer.php

サイト内で問題文・雛形・解答例を確認できます。実際に手元で解くには教材リポジトリを clone してください。

完了にすると進捗に反映されます