# ch02 — PDO で SQLite 接続 / DSN 比較

Source: https://php-school.pages.dev/topics/db/ch02-pdo-connect/
Site: AIと学ぶPHPの学校 (https://php-school.pages.dev)
Lesson: データベース連携
Level: L4

Reference (official): https://www.php.net/manual/ja/book.pdo.php

## 本文

# ch02 — PDO で SQLite 接続 / DSN 比較

## 概要

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` を設定する習慣を付ける

## 所要時間

スライド 4 分 + ドリル 2 問 = **12 分**

## ドリル

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

## 採点用 DB について

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

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

## スライド

---
marp: true
theme: dojo
paginate: true
size: 16:9
---

<!--
LLM_CONTEXT:
  Lesson 11 / Chapter 2
  目的: PDO で DB に接続できるようになる / DSN の読み方を覚える
  扱わない: SELECT (ch03) / WHERE (ch04) / INSERT (ch05) / トランザクション (ch08)
  読み上げ時間目安: 4 分
-->

# PDO で DB に接続する

Lesson 11 / Chapter 2

---

## PDO とは

**PDO** = PHP Data Objects。PHP 標準の **DB 接続ライブラリ**。

```php
<?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 名 …)

---

## 認証 (ユーザー / パスワード) が要るか

```php
// 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
<?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 だけ差し替え)

---

## エラーモードを必ず例外にする

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

→ ドリルへ
