PDOまたはmysqliを使用したクエリの実行

PHPでデータベースと連携する際、主に使用される拡張機能は PDO(PHP Data Objects)MySQLi(MySQL Improved) です。どちらもMySQLなどのデータベースと接続して、SQLクエリを実行するために使われますが、それぞれに特徴があります。


1. PDOによるクエリの実行

特徴:

  • 複数のデータベース(MySQL, PostgreSQL, SQLiteなど)をサポート

  • プリペアドステートメントによるSQLインジェクション対策が容易

基本的な使用手順:

php
<?php try { // データベースに接続 $pdo = new PDO("mysql:host=localhost;dbname=testdb;charset=utf8", "username", "password"); $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); // プリペアドステートメントを作成 $stmt = $pdo->prepare("SELECT * FROM users WHERE email = :email"); $stmt->bindParam(':email', $email); // パラメータを設定して実行 $email = "example@example.com"; $stmt->execute(); // 結果を取得 $result = $stmt->fetchAll(PDO::FETCH_ASSOC); foreach ($result as $row) { echo $row['name'] . "<br>"; } } catch (PDOException $e) { echo "エラー: " . $e->getMessage(); } ?>

2. MySQLiによるクエリの実行

特徴:

  • MySQL専用(他のDBは使えない)

  • 手続き型とオブジェクト指向型の両方に対応

手続き型の使用例:

php
<?php // 接続 $conn = mysqli_connect("localhost", "username", "password", "testdb"); // エラーチェック if (!$conn) { die("接続失敗: " . mysqli_connect_error()); } // プリペアドステートメント $stmt = mysqli_prepare($conn, "SELECT * FROM users WHERE email = ?"); mysqli_stmt_bind_param($stmt, "s", $email); // パラメータを設定して実行 $email = "example@example.com"; mysqli_stmt_execute($stmt); // 結果を取得 $result = mysqli_stmt_get_result($stmt); while ($row = mysqli_fetch_assoc($result)) { echo $row['name'] . "<br>"; } // 接続を閉じる mysqli_close($conn); ?>

3. 比較と推奨

項目 PDO MySQLi
対応DB 複数 MySQLのみ
スタイル オブジェクト指向のみ 両対応
プレースホルダ 名前付きプレースホルダ ?マークのみ
柔軟性 高い 限定的

推奨:
今後の保守性や移植性を考えると、PDOの使用が望ましいです。特にセキュリティやコードの再利用性を重視する場合、PDOのプリペアドステートメントは強力な手段となります。

生成日:2025/05/03