この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:3
ページ更新者:atom
更新日時:2026-05-13 06:53:52

タイトル: 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())を活用

関連