[PHP]DB2でプリペアドステートメントを使おう!db2_bind_paramの完全ガイド

PHP

こんにちは!今回は、DB2データベースでSQL文のパラメータをバインドするdb2_bind_param関数について、分かりやすく解説していきます!

db2_bind_paramって何?🤔

プリペアドステートメントで使用するパラメータを設定する関数です。SQLインジェクション対策として重要で、より安全なデータベース操作が可能になります。

基本構文

bool db2_bind_param(
    resource $stmt,      // プリペアドステートメント
    int $parameter_index,// パラメータの位置(1から始まる)
    string $variable,    // バインドする変数
    int $parameter_type, // パラメータの型
    int $data_type = 0,  // データ型(オプション)
    int $precision = -1, // 精度(オプション)
    int $scale = -1      // 小数点以下の桁数(オプション)
)

実践的な使用例

例1:基本的な使い方

// プリペアドステートメントの準備
$sql = "INSERT INTO users (name, age) VALUES (?, ?)";
$stmt = db2_prepare($connection, $sql);

// パラメータの設定
$name = "山田太郎";
$age = 25;

db2_bind_param($stmt, 1, $name, DB2_PARAM_IN);  // 1番目のパラメータ
db2_bind_param($stmt, 2, $age, DB2_PARAM_IN);   // 2番目のパラメータ

// 実行
if (db2_execute($stmt)) {
    echo "データ挿入成功!";
}

例2:検索条件でのバインド

// 年齢で検索する例
$sql = "SELECT * FROM users WHERE age > ?";
$stmt = db2_prepare($connection, $sql);

$min_age = 20;
db2_bind_param($stmt, 1, $min_age, DB2_PARAM_IN);

if (db2_execute($stmt)) {
    while ($row = db2_fetch_assoc($stmt)) {
        echo "名前: " . $row['NAME'] . ", 年齢: " . $row['AGE'] . "\n";
    }
}

例3:複数の型を使用する場合

// 商品登録の例
$sql = "INSERT INTO products (name, price, description) VALUES (?, ?, ?)";
$stmt = db2_prepare($connection, $sql);

$product_name = "新商品A";
$price = 1500;
$description = "これは新商品の説明です";

db2_bind_param($stmt, 1, $product_name, DB2_PARAM_IN, DB2_CHAR);
db2_bind_param($stmt, 2, $price, DB2_PARAM_IN, DB2_INTEGER);
db2_bind_param($stmt, 3, $description, DB2_PARAM_IN, DB2_VARCHAR);

db2_execute($stmt);

よく使用するパラメータタイプ

// 入力パラメータ
DB2_PARAM_IN    // 入力用
DB2_PARAM_OUT   // 出力用
DB2_PARAM_INOUT // 入力/出力両用

// データ型
DB2_CHAR        // 文字列
DB2_INTEGER     // 整数
DB2_DECIMAL     // 小数
DB2_VARCHAR     // 可変長文字列
DB2_DATE        // 日付

セキュリティ対策のポイント

1. SQLインジェクション対策

// 悪い例 ❌
$sql = "SELECT * FROM users WHERE name = '$name'";

// 良い例 ✅
$sql = "SELECT * FROM users WHERE name = ?";
$stmt = db2_prepare($connection, $sql);
db2_bind_param($stmt, 1, $name, DB2_PARAM_IN);

2. エラーハンドリング

try {
    $stmt = db2_prepare($connection, $sql);
    if (!db2_bind_param($stmt, 1, $value, DB2_PARAM_IN)) {
        throw new Exception("バインドエラー");
    }
    // 処理続行
} catch (Exception $e) {
    error_log($e->getMessage());
    // エラー処理
}

まとめ

  1. セキュリティ向上のため、必ずバインドパラメータを使用する
  2. 適切なデータ型を指定する
  3. エラーハンドリングを忘れずに
  4. プリペアドステートメントと組み合わせて使用する

Tips 💡

  • 同じSQL文を複数回実行する場合、プリペアドステートメントを使用すると処理が効率的
  • パラメータのインデックスは1から始まることに注意
  • 複雑なクエリでも、バインドパラメータを使うことで安全に実行可能

では、安全で効率的なデータベース操作を実現していきましょう!

Happy Coding! 😊

タイトルとURLをコピーしました