ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
| この記事の要点 |
|
PDO とは
PHP のDB アクセス用標準拡張。MySQLi が MySQL 専用なのに対し、PDO は複数 DB を統一 API で扱えるのが特長です。Prepared Statement のサポートによりSQL Injection 対策が容易で、現代的な PHP プロジェクトでは PDO が標準です(Laravel 内部も PDO)。
接続
try {
$pdo = new PDO(
'mysql:host=localhost;dbname=mydb;charset=utf8mb4',
'username',
'password',
[
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // ★ 必須
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // 連想配列
PDO::ATTR_EMULATE_PREPARES => false, // ★ ネイティブ Prepared
]
);
} catch (PDOException $e) {
error_log('DB connection failed: ' . $e->getMessage());
http_response_code(500);
exit('DB connection failed');
}
DB 別の DSN 文字列
| DB | DSN 例 |
|---|---|
| MySQL / MariaDB | mysql:host=localhost;dbname=mydb;charset=utf8mb4 |
| PostgreSQL | pgsql:host=localhost;port=5432;dbname=mydb |
| SQLite | sqlite:/path/to/db.sqlite |
| SQL Server | sqlsrv:Server=localhost;Database=mydb |
| Oracle | oci:dbname=//localhost:1521/XE |
SELECT - 結果を取得する
// 1 件取得
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// $user = ['id' => 1, 'name' => 'Taro', 'email' => 'taro@test.com']
// 全件取得
$stmt = $pdo->prepare('SELECT * FROM users WHERE active = ?');
$stmt->execute([1]);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// ループ取得(メモリ節約)
$stmt = $pdo->prepare('SELECT * FROM logs WHERE date > ?');
$stmt->execute(['2025-01-01']);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
process($row);
}
// 1 カラムだけ
$stmt = $pdo->prepare('SELECT COUNT(*) FROM users');
$stmt->execute();
$count = $stmt->fetchColumn();
// 1 カラム全件
$stmt = $pdo->prepare('SELECT email FROM users');
$stmt->execute();
$emails = $stmt->fetchAll(PDO::FETCH_COLUMN);
Fetch モード
| 定数 | 結果形式 |
|---|---|
PDO::FETCH_ASSOC | 連想配列 ['name' => 'Taro'] ★ 推奨 |
PDO::FETCH_NUM | 数値添字 [0 => 1, 1 => 'Taro'] |
PDO::FETCH_BOTH | 両方(既定) |
PDO::FETCH_OBJ | stdClass $row->name |
PDO::FETCH_CLASS | 指定クラス |
PDO::FETCH_COLUMN | 指定カラムだけ |
PDO::FETCH_KEY_PAIR | 2 カラムをキー/値の連想配列に |
INSERT / UPDATE / DELETE
// INSERT
$stmt = $pdo->prepare(
'INSERT INTO users (name, email, created_at) VALUES (?, ?, NOW())'
);
$stmt->execute(['Taro', 'taro@test.com']);
$newId = $pdo->lastInsertId();
// 名前付きバインド
$stmt = $pdo->prepare(
'INSERT INTO users (name, email) VALUES (:name, :email)'
);
$stmt->execute([
':name' => 'Hanako',
':email' => 'hanako@test.com',
]);
// UPDATE
$stmt = $pdo->prepare(
'UPDATE users SET name = ? WHERE id = ?'
);
$stmt->execute(['Taro Yamada', $id]);
$affectedRows = $stmt->rowCount();
// DELETE
$stmt = $pdo->prepare('DELETE FROM users WHERE id = ?');
$stmt->execute([$id]);
トランザクション
複数 SQL の「全部成功するか、全部失敗するか」を保証:
$pdo->beginTransaction();
try {
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance - ? WHERE id = ?');
$stmt->execute([100, $fromId]);
$stmt = $pdo->prepare('UPDATE accounts SET balance = balance + ? WHERE id = ?');
$stmt->execute([100, $toId]);
$stmt = $pdo->prepare('INSERT INTO transfers (from_id, to_id, amount) VALUES (?, ?, ?)');
$stmt->execute([$fromId, $toId, 100]);
$pdo->commit(); // ★ 全部成功したらコミット
} catch (\Throwable $e) {
$pdo->rollBack(); // ★ どれか失敗したらロールバック
throw $e;
}
エラーモード
| 定数 | 動作 |
|---|---|
PDO::ERRMODE_SILENT | エラーを返すだけ(旧デフォルト、危険) |
PDO::ERRMODE_WARNING | Warning 発行 |
PDO::ERRMODE_EXCEPTION | ★ PDOException 投げる(PHP 8.0+ で既定) |
PDO::ATTR_EMULATE_PREPARES
Prepared Statement の挙動を制御する重要設定:
// true (デフォルト): PHP 側で SQL 文字列を組み立ててサーバに送る
// → DB がネイティブ Prepared に対応していなくても動く
// → 1 回の往復で済む(速い)
// → ★ ただし型推論が文字列扱いになりやすい
// false: DB のネイティブ Prepared Statement を使う
// → 1. プレースホルダ込み SQL を送る(パース)
// → 2. パラメータを送る(実行)
// → 2 往復だが安全 + キャッシュが効く
// ★ 推奨設定
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);
// 型を厳密に指定
$stmt->bindValue(':age', $age, PDO::PARAM_INT);
$stmt->bindValue(':name', $name, PDO::PARAM_STR);
MySQLi との比較
| 項目 | PDO | MySQLi |
|---|---|---|
| 対応 DB | 12 種類 | MySQL のみ |
| API | OOP のみ | OOP + 手続き型 |
| 名前付きバインド | OK (:name) | NG (位置のみ) |
| 非同期 | NG | OK |
| ストアドプロシージャ | OK | OK |
| 推奨 | ★ 汎用プロジェクト | MySQL 専用 + 高度な機能必要時 |
Laravel の DB Facade との関係
use Illuminate\Support\Facades\DB;
// Laravel の DB は内部で PDO を使っている
$users = DB::select('SELECT * FROM users WHERE active = ?', [1]);
// Query Builder
$users = DB::table('users')->where('active', 1)->get();
// Eloquent
$users = User::where('active', 1)->get();
// 生 PDO が必要なら
$pdo = DB::connection()->getPdo();
FAQ
Q: query() と prepare() + execute() の違いは?
A: query() は固定 SQL 専用(ユーザー入力を含めるなら危険)。動的値を含めるなら必ず prepare() + execute()。
Q: charset=utf8mb4 が必須?
A: 絵文字や 4 バイト UTF-8 を扱うなら必須。utf8 は実は最大 3 バイトで絵文字が化ける。
Q: 接続を永続化したい
A: PDO::ATTR_PERSISTENT => true。ただしトランザクション残存リスクがあるため Web アプリでは慎重に。
Q: バインドの数値 ID が文字列扱いされて遅い
A: PDO::ATTR_EMULATE_PREPARES => false に設定 + bindValue(... , PDO::PARAM_INT) で型明示。
ページの作成
親となるページを選択してください。
親ページに紐づくページを子ページといいます。
例: 親=スポーツ, 子1=サッカー, 子2=野球
子ページを親ページとして更に子ページを作成することも可能です。
例: 親=サッカー, 子=サッカーのルール
親ページはいつでも変更することが可能なのでとりあえず作ってみましょう!
子ページはありません
同階層のページはありません
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript base URL 取得方法|window.location.origin と SSR/Node.js 対応
- 4 YouTube Data API v3 エラー一覧|403/400/404 の主要原因と切り分け
- 5 Spring Frameworkのアノテーション一覧
- 6 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 7 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- IPv6とは|128bitアドレス・コロン16進表記/::省略・リンクローカル・SLAAC・デュアルスタック NEW 2026-06-22 12:34:44
- VPNとは|暗号トンネル・サイト間/リモートアクセス・IPsec/SSL-VPN/WireGuardを解説 NEW 2026-06-22 12:19:10
- MAC アドレスフィルタリングの仕組みと限界 | ネットワーク入門 NEW 2026-06-22 12:19:10
- WebRTC とは ブラウザ間 P2P の音声・映像・データ通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- gRPC とは HTTP/2 + Protocol Buffers の高速 RPC | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/3 (QUIC) とは UDP ベースの低遅延 Web 通信 | ネットワーク入門 NEW 2026-06-22 12:17:25
- HTTP/2 とは 多重化・HPACK・バイナリフレーム | ネットワーク入門 NEW 2026-06-22 12:17:25
- Web通信プロトコル入門 HTTP/2・HTTP/3・WebSocket・gRPC・WebRTC | ネットワーク入門 NEW 2026-06-22 12:17:25
- WebSocket とは 全二重リアルタイム通信 ws/wss | ネットワーク入門 NEW 2026-06-22 12:17:25
- ファイアウォールとは|パケットフィルタ・ステートフル・DMZ・次世代FW(L4/L7)を解説 NEW 2026-06-22 12:17:24
- iptables/nftablesとは|テーブル・チェーン・ルール例・永続化をLinux視点で解説 NEW 2026-06-22 12:17:24
- HAProxy とは frontend/backend と設定例 | ネットワーク入門 NEW 2026-06-22 12:17:24
- 証明書と認証局(CA)とは|X.509・信頼チェーン・DV/OV/EV・失効(CRL/OCSP)を解説 NEW 2026-06-22 12:17:24
- CDN とは エッジキャッシュ・TTL・Cloudflare/CloudFront | ネットワーク入門 NEW 2026-06-22 12:17:24
- TLS/SSLの仕組み|ハンドシェイク・暗号スイート・前方秘匿性・証明書検証をわかりやすく解説 NEW 2026-06-22 12:17:24
コメントを削除してもよろしいでしょうか?