章: 第5章: Web・DB・セキュリティ
「DBに接続する」というとき、あなたのコードは本当に安全ですか?
問題と解決策
「とりあえず動く」DB接続コードは、セキュリティ上の問題を抱えていることが多いです。かつてよく使われていた mysql_* 関数はPHP7で廃止されており、今の開発では使えません。
PDO(PHP Data Objects)を使えば、DB種別を問わない統一インターフェースで接続でき、プリペアドステートメントと組み合わせてSQLインジェクションも防げます。「動くコード」から「安全なコード」への第一歩がPDOです。
PDO vs 古い接続方法
| 比較項目 | mysql_*(非推奨) | PDO(推奨) |
| 対応DB | MySQLのみ | MySQL / SQLite / PostgreSQL 等 |
| SQLインジェクション対策 | 手動エスケープが必要 | プリペアドステートメント |
| エラー処理 | 手動でエラーコード確認 | 例外(Exception)で統一 |
| 現在のサポート | PHP 7 で廃止済み | 現在も標準 |
チェックポイント:
new PDO(...)のオプション配列にPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONを必ず設定しましょう。これがないとエラーが握りつぶされて原因究明が困難になります。
コードサンプル
<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '');
$stmt = $pdo->query('SELECT 1');
まとめ & 次のステップ
- PDOはDB種別を問わない統一インターフェースを提供します
- プリペアドステートメントとの組み合わせで安全なDB操作が実現できます
PDO::ERRMODE_EXCEPTIONの設定でエラーを確実に検出しましょう- DSN文字列の形式(
mysql:host=...;dbname=...;charset=utf8mb4)を手で書いて覚えておくと実務で役立ちます
次回は SQLインジェクション対策 — プリペアドステートメントの仕組みをさらに深く学びます。