22.

PHPのDB接続方法

編集

PHPのDB接続方法です。

子ページからDB接続方法を選択して下さい。

※PDO以外の接続方法をご存知の方、項目の作成をお願いします。

主なDB接続方法

方法特徴状況
PDO (PHP Data Objects)DB抽象化レイヤ。MySQL/PostgreSQL/SQLite等を統一APIで扱う現在の標準・推奨
mysqliMySQL専用。手続き型/オブジェクト指向の2インターフェース現役だがMySQL固定
mysql_*古いMySQL関数群PHP 7.0で削除済み
pg_*PostgreSQL専用関数群現役
oci8Oracle専用現役
sqlsrvSQL Server専用(Microsoft製)現役
各種ORM(Eloquent / Doctrine等)PDOをラップしたORMフレームワーク経由

本ページの子ページ

PDOを推奨する理由

  • SQLインジェクション対策が容易: プリペアドステートメントを標準サポート
  • DBエンジン非依存: 同じコードでMySQL/PostgreSQL/SQLiteを切替可能
  • 例外処理が統一的: PDO::ATTR_ERRMODE で例外モード
  • トランザクションサポート
  • 現役メンテナンス

PDOによる最小接続例

$dsn = 'mysql:host=127.0.0.1;dbname=mydb;charset=utf8mb4';
$user = 'myuser';
$pass = 'secret';

try {
    $pdo = new PDO($dsn, $user, $pass, [
        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
        PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
        PDO::ATTR_EMULATE_PREPARES => false,
    ]);

    $stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
    $stmt->execute([1]);
    $user = $stmt->fetch();
} catch (PDOException $e) {
    error_log($e->getMessage());
}

各DBへの接続DSN

DBDSN例
MySQL / MariaDBmysql:host=127.0.0.1;dbname=mydb;charset=utf8mb4
PostgreSQLpgsql:host=127.0.0.1;dbname=mydb
SQLitesqlite:/path/to/db.sqlite
SQL Serversqlsrv:Server=localhost;Database=mydb

セキュリティの基本

  • 絶対にSQLを文字列連結しない。必ずプリペアド + バインド
  • 本番でエラー文字列にDB情報・SQLが含まれないようにする(エラーログは別チャネルへ)
  • DBユーザーは必要最小権限で(本番DELETE権限を持つ接続を業務処理に使わない)
  • パスワードは .env や Secret Manager 経由、コード直書き禁止

注意点

  • PDO::ATTR_EMULATE_PREPARES = false を推奨。エミュレーションを切ると真のプリペアドが使われる
  • charset=utf8mb4 をDSNで指定(utf8では絵文字が文字化けする)
  • 例外モードで Driver-specific例外(PDOException::getCode())を活用

関連

編集
Post Share
子ページ
  1. PDO(PHP Data Objects)
同階層のページ
  1. 基本事項
  2. HTMLへの埋め込み
  3. 変数
  4. 可変変数
  5. 定数
  6. データ型
  7. キャスト
  8. エスケープ文字
  9. 配列
  10. 演算子
  11. 代入の際の注意点
  12. 条件分岐
  13. 繰り返し処理
  14. クラスとインスタンス
  15. コンストラクタ
  16. 関数
  17. スーパーグローバル変数
  18. スコープ
  19. staticについて
  20. yieldについて
  21. ファイルのアップロード方法
  22. DB接続方法
  23. SQL実行方法
  24. カプセル化の具体例
  25. 継承の構文
  26. オーバーライド
  27. ポリモーフィズム(多様性)の具体例
  28. 抽象クラス・メソッドの構文と具体例
  29. GET通信
  30. try catchで全てのエラーを拾う方法