PHPにおけるPDO::execでデータベースをシンプルに操作する方法

2024-05-24

PHPにおけるPDO::execを使用したデータベース操作の解説

PDO::execの特徴

  • 結果セットを返さない: 処理の影響を受けた行数のみを返します。
  • 非プレアペアドステートメント: 事前にSQL文を準備せず、直接実行します。
  • シンプルな構文: 記述が簡潔で分かりやすいです。
  • 軽量: シンプルな操作を効率的に実行できます。
  • メモリ使用量が少ない: プレアペアドステートメントと比較してメモリ使用量を抑えられます。
  • SQLインジェクション対策が必要: ユーザー入力を取り扱う場合は、必ず対策が必要です。
  • 複雑な操作には向かない: 複雑な処理やパラメーターバインディングが必要な場合は、PDO::preparePDOStatement::execute の組み合わせを使用する必要があります。
<?php

$dsn = 'mysql:host=localhost;dbname=testdb';
$username = 'user';
$password = 'password';

try {
    $dbh = new PDO($dsn, $username, $password);
    $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    // データ挿入
    $sql = "INSERT INTO users (name, email) VALUES ('田中 太郎', '[email protected]')";
    $affectedRows = $dbh->exec($sql);
    echo $affectedRows . "件のレコードが挿入されました。" . PHP_EOL;

    // データ更新
    $sql = "UPDATE users SET name = '山田 花子' WHERE id = 1";
    $affectedRows = $dbh->exec($sql);
    echo $affectedRows . "件のレコードが更新されました。" . PHP_EOL;

    // データ削除
    $sql = "DELETE FROM users WHERE email = '[email protected]'";
    $affectedRows = $dbh->exec($sql);
    echo $affectedRows . "件のレコードが削除されました。" . PHP_EOL;
} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage() . PHP_EOL;
}

$dbh = null;

補足

  • 上記の例では、エラー処理のための try...catch ブロックを使用しています。
  • 実際の開発においては、適切なデータベース設定やエラーハンドリングを忘れずに実装してください。


    PDO::exec を使ったサンプルコード

    データベース接続

    <?php
    
    $dsn = 'mysql:host=localhost;dbname=testdb';
    $username = 'user';
    $password = 'password';
    
    try {
        $dbh = new PDO($dsn, $username, $password);
        $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    } catch (PDOException $e) {
        echo "エラー発生:" . $e->getMessage() . PHP_EOL;
        exit;
    }
    

    ユーザーデータの挿入

    $name = '田中 太郎';
    $email = '[email protected]';
    
    $sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':name', $name);
    $stmt->bindParam(':email', $email);
    $stmt->execute();
    
    echo "ユーザーデータが挿入されました。" . PHP_EOL;
    

    ユーザー情報の更新

    $id = 1;
    $name = '山田 花子';
    
    $sql = "UPDATE users SET name = :name WHERE id = :id";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    echo "ユーザー情報が更新されました。" . PHP_EOL;
    
    $email = '[email protected]';
    
    $sql = "DELETE FROM users WHERE email = :email";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':email', $email);
    $stmt->execute();
    
    echo "ユーザーデータが削除されました。" . PHP_EOL;
    
    $dbh = null;
    
    • このコードは、PDOプレアペアドステートメント を使用しています。プレアペアドステートメントは、SQLインジェクション対策パラメーターバインディング に有効です。
    • コード中の :name:email などのプレースホルダは、bindParam メソッドを使って実際の値に置き換える必要があります。
    • エラー処理は省略されていますが、実際の開発においては適切なエラーハンドリングを実装する必要があります。


    PDO::exec 以外のデータベース操作方法

    PDO::query

    PDO::query は、SELECT 文を実行するための関数です。結果セット を返します。

    特徴

    • 結果セットを操作できます。
    • シンプルな構文で記述できます。

    利点

    • シンプルな SELECT 文を実行する場合に適しています。

    注意点

    • データ更新操作には使用できません。
    • プレアペアドステートメントと比較して、SQLインジェクションのリスクが若干高くなります。

    $sql = "SELECT * FROM users";
    $stmt = $dbh->query($sql);
    
    foreach ($stmt->fetchAll() as $row) {
        echo $row['name'] . " (" . $row['email'] . ")" . PHP_EOL;
    }
    

    PDO::prepare & PDOStatement::execute

    PDO::preparePDOStatement::execute は、プレアペアドステートメント を使用してデータベース操作を行うための関数です。SQLインジェクション対策パラメーターバインディング に有効です。

    • SQLインジェクション対策に有効です。
    • パラメーターバインディングにより、可読性と安全性を向上できます。
    • 複雑な操作にも柔軟に対応できます。
    • 安全性と柔軟性を兼ね備えています。
    • 複雑な操作や複数回のクエリ実行に適しています。
    • PDO::exec と比較して、記述が若干複雑になります。
    $id = 1;
    $name = '山田 花子';
    
    $sql = "UPDATE users SET name = :name WHERE id = :id";
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(':id', $id);
    $stmt->bindParam(':name', $name);
    $stmt->execute();
    
    echo "ユーザー情報が更新されました。" . PHP_EOL;
    

    その他の方法

    上記以外にも、以下のような方法でデータベース操作を行うことができます。

    • MySQLi: PHP 5 以降で使用できるMySQL用の拡張モジュール
    • Data Objects (DO): データベース操作をオブジェクト指向で簡略化するためのライブラリ
    • Active Record: オブジェクトとデータベーステーブルをマッピングするフレームワーク

    使い分け

    具体的な状況に応じて、適切な方法を選択する必要があります。

    • シンプルなデータ操作には、PDO::execPDO::query が適しています。
    • 安全性や柔軟性を重視する場合は、PDO::preparePDOStatement::execute を使用します。
    • 複雑なアプリケーション開発には、DOActive Record などのフレームワークを活用するのも有効です。