様々なサンプルコード:PDO::execでデータベースを操作

2024-05-03

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

PDO::exec は、PHPにおいて データベース操作 を行うための関数の一つです。INSERT、UPDATE、DELETE などのステートメントを実行し、影響を受けた行数を返します。SELECT ステートメント には使用できません。

PDO::exec の利点

  • シンプルで分かりやすい構文
  • 軽量で高速な処理

PDO::exec の注意点

  • プレースホルダによるパラメーターバインディングに対応していない
  • SQLインジェクションなどの脆弱性に注意が必要

PDO::exec の基本的な使用方法

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $email);

    $name = '田中 太郎';
    $email = '[email protected]';

    $stmt->execute();

    $affectedRows = $stmt->rowCount();
    echo $affectedRows . "件のレコードが挿入されました。";

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

上記コードの説明

  1. データベース接続情報、ユーザー名、パスワードを定義します。
  2. PDOオブジェクトを作成し、エラーモードを例外スローイングに設定します。
  3. INSERT ステートメントを準備し、プレースホルダを ? で定義します。
  4. プレースホルダにバインドする変数を定義します。
  5. 挿入するデータを設定します。
  6. ステートメントを実行します。
  7. 影響を受けた行数を取得し、メッセージを出力します。
  8. エラーハンドリングを行います。
  9. データベース接続を閉じます。

PDO::exec の応用例

  • データベースへのレコード挿入
  • データベースのレコード更新
  • より複雑なデータベース操作には、PDO::preparePDOStatement::execute を組み合わせた方法が推奨されます。
  • データベース操作を行う際には、常に セキュリティ対策 に注意する必要があります。


PHPにおけるPDO::execを使用したデータベース操作のサンプルコード集

このセクションでは、PDO::execを使用した様々なデータベース操作のサンプルコードを紹介します。

データベースへのレコード挿入

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'INSERT INTO users (name, email) VALUES (?, ?)';
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $name);
    $stmt->bindParam(2, $email);

    $name = '田中 太郎';
    $email = '[email protected]';

    $stmt->execute();

    echo "レコードが挿入されました。";

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

データベースのレコード更新

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'UPDATE users SET email = ? WHERE id = ?';
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $email);
    $stmt->bindParam(2, $id);

    $email = '[email protected]';
    $id = 1;

    $stmt->execute();

    echo "レコードが更新されました。";

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

データベースのレコード削除

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'DELETE FROM users WHERE id = ?';
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $id);

    $id = 1;

    $stmt->execute();

    echo "レコードが削除されました。";

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

トランザクション処理

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $dbh->beginTransaction();

    // 処理1を実行
    $sql1 = 'INSERT INTO users (name, email) VALUES (?, ?)';
    $stmt1 = $dbh->prepare($sql1);
    $stmt1->bindParam(1, $name1);
    $stmt1->bindParam(2, $email1);

    $name1 = '佐藤 花子';
    $email1 = '[email protected]';

    $stmt1->execute();

    // 処理2を実行
    $sql2 = 'UPDATE articles SET title = ? WHERE id = ?';
    $stmt2 = $dbh->prepare($sql2);
    $stmt2->bindParam(1, $title2);
    $stmt2->bindParam(2, $id2);

    $title2 = '新しい記事タイトル';
    $id2 = 10;

    $stmt2->execute();

    $dbh->commit();
    echo "トランザクション処理が成功しました。";

} catch (PDOException $e) {
    $dbh->rollBack();
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

エラーハンドリング

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

try {
    $dbh = new PDO($dsn, $username


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

PDO::exec 以外にも、PHP でデータベース操作を行う方法はいくつかあります。それぞれの特徴と使い分けを以下に説明します。

PDO::prepare と PDOStatement::execute

PDO::preparePDOStatement::execute の組み合わせは、パラメーターバインディングに対応しており、SQLインジェクション対策にも有効です。INSERT、UPDATE、DELETE だけでなく、SELECT ステートメントにも使用できます。

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'SELECT * FROM users WHERE id = ?';
    $stmt = $dbh->prepare($sql);
    $stmt->bindParam(1, $id);

    $id = 1;

    $stmt->execute();

    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
        echo $row['name'] . " (" . $row['email'] . ")\n";
    }

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

PDOStatement::query

PDOStatement::query は、SELECT ステートメントのみで使用できるメソッドです。PDO::preparePDOStatement::execute よりもシンプルですが、パラメーターバインディングには対応しておらず、SQLインジェクション対策にも注意が必要です。

<?php

$dsn = 'データベース接続情報';
$username = 'ユーザー名';
$password = 'パスワード';

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

    $sql = 'SELECT * FROM users WHERE id = 1';
    $stmt = $dbh->query($sql);

    $result = $stmt->fetchAll(PDO::FETCH_ASSOC);
    foreach ($result as $row) {
        echo $row['name'] . " (" . $row['email'] . ")\n";
    }

} catch (PDOException $e) {
    echo "エラー発生:" . $e->getMessage();
}

$dbh = null;

その他の方法

  • mysqli などの拡張モジュール: PDO 以外にも、データベース操作を行うための拡張モジュールがいくつかあります。
  • ODBC などのデータベースドライバ: ODBC などのデータベースドライバを使用して、データベースに接続することもできます。

使い分け

  • シンプルで高速な処理が必要な場合: PDO::exec
  • パラメーターバインディングが必要な場合、SQLインジェクション対策をしたい場合**: PDO::prepare と PDOStatement::execute
  • SELECT ステートメントのみを実行する場合: PDOStatement::query
  • 複雑なデータベース操作が必要な場合: mysqli などの拡張モジュール、ODBC などのデータベースドライバ
  • 使用するデータベースや目的に合った方法を選択してください。



PDOStatement::nextRowset以外の方法

PDOStatement::nextRowset は、複数の結果セットを返す SQL クエリを実行する際に、次の結果セットに移動するためのメソッドです。これは、ストアドプロシージャなど、複数の結果セットを返すことができるデータベース操作で特に役立ちます。



初心者向け解説:PHP vfprintf 関数でフォーマットされた文字列を書き込む

vfprintf 関数は、printf 関数と似ていますが、可変引数ではなく、フォーマット文字列と引数の配列を受け取ります。これは、複数の変数をフォーマットされた文字列に挿入したい場合に便利です。構文引数handle: 書き込み先のストリームリソース。ファイルポインタ、標準出力ストリーム (STDOUT) などが指定できます。


PHPで文字列を連結する7つの方法:連結演算子、heredoc、nowdoc、sprintf、implode、str_repeat、substr_replace

String は PHP における文字列型を表します。正規表現は、文字列処理において非常に強力なツールであり、さまざまな操作に使用できます。preg_last_error_msg と String の関連性preg_last_error_msg は、String 型の値を返します。この値は、直前の正規表現処理におけるエラーメッセージです。具体的なエラーメッセージは、PCRE のエラーコードに基づいて生成されます。


【PHP】"strcoll" 関数 vs "strcmp" 関数 vs "strnatcmp" 関数:徹底比較

strcoll 関数は、2つの文字列をバイト単位で比較し、現在のロケール設定に基づいて結果を返します。ロケールとは、言語、文字セット、並び順序などの地域固有の設定を定義するものです。機能2つの文字列をバイト単位で比較します。大文字と小文字を区別します。


PHPで文字列の末尾にある空白をスッキリ削除! rtrim 関数の使い方とサンプルコード

使い方string: 処理対象の文字列characters (オプション): 削除したい空白文字の種類。省略した場合、以下の空白文字が削除されます。 スペース () タブ (\t) 改行 (\n) 水平タブ (\x0B) NULL文字 (\0)



PHPでXMLエラーをデバッグする:libxml_clear_errors関数とエラーハンドラ

使用方法この関数は引数を取らず、単にエラーバッファの内容を消去します。例この例では、無効なXML文字列を解析し、エラーが発生した場合にエラーメッセージを出力します。その後、libxml_clear_errors関数を使用してエラーバッファを消去します。


エンコーディングに惑わされない!mb_strrpos関数でマルチバイト文字列を攻略

mb_strrpos 関数の概要mb_strrpos(haystack, needle [, offset [, encoding]])haystack: 検索対象の文字列needle: 検索する文字列offset: 検索開始位置(省略可)


PHP で文字列を正確に扱う:mb_strwidth 関数と文字エンコーディング

mb_strwidth の概要:マルチバイト文字列の幅を取得します。文字エンコーディングを考慮します。半角文字は 1、全角文字は 2 とカウントします。オプションで、文字種ごとに異なる幅を指定できます。mb_strwidth の使い方:この例では、mb_strwidth 関数は、$str 文字列の幅を 14 と計算します。これは、こんにちは、世界! という文字列には、半角文字が 8 文字、全角文字が 6 文字含まれているためです。


サンプルコード満載!PHPでXSLTProcessor::__constructを使いこなす

XSLT は、XML 文書を変換するためのスタイルシート言語です。XSLT スタイルシートは、XML 文書内の要素をどのように処理し、出力するかを定義します。XSLT を使用することで、XML 文書を HTML、テキスト、PDF などのさまざまな形式に変換することができます。


PHPで文字列の末尾にある空白をスッキリ削除! rtrim 関数の使い方とサンプルコード

使い方string: 処理対象の文字列characters (オプション): 削除したい空白文字の種類。省略した場合、以下の空白文字が削除されます。 スペース () タブ (\t) 改行 (\n) 水平タブ (\x0B) NULL文字 (\0)