Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【PHP8.x】Pdo\Sqlite::exec()メソッドの使い方

execメソッドの使い方について、初心者にもわかりやすく解説します。

作成日: 更新日:

基本的な使い方

execメソッドは、データベースに対してSQL文を実行するメソッドです。主に、結果セット(データの表)を返さない種類のSQL文を実行する際に利用されます。具体的には、データベースへのデータの追加(INSERT文)、既存データの更新(UPDATE文)、データの削除(DELETE文)といったデータ操作言語(DML)の操作や、テーブルの作成(CREATE TABLE)、テーブル構造の変更(ALTER TABLE)、テーブルの削除(DROP TABLE)などのデータ定義言語(DDL)の操作を行うSQL文が該当します。

このメソッドは、SQL文の実行が成功した場合、そのSQL文によって実際に影響を受けた行の数を整数値で返します。例えば、5件のデータを更新した場合は「5」が戻り値となります。SQL文の実行に失敗した場合は、falseが返されます。PDOが例外モードに設定されている場合は、エラーが発生するとPDOExceptionがスローされ、より詳細なエラー情報を取得できます。

ただし、execメソッドはSQL文をそのまま実行するため、ユーザーからの入力をSQL文に直接含めると、SQLインジェクションと呼ばれるセキュリティ上の脆弱性の原因となる可能性があります。セキュリティを確保するため、外部からの入力値を含むSQL文を実行する際には、prepareメソッドとexecuteメソッドを組み合わせて使用する「プリペアドステートメント」の利用が強く推奨されます。Pdo\Sqlite環境を含む、PDOを利用したデータベース操作において、安全かつ効率的なデータベースアクセスを実現するために重要なメソッドの一つです。

構文(syntax)

1<?php
2$pdo = new PDO('sqlite::memory:');
3$sqlStatement = "CREATE TABLE IF NOT EXISTS settings (key TEXT PRIMARY KEY, value TEXT)";
4$affectedRows = $pdo->exec($sqlStatement);
5?>

引数(parameters)

string $statement

  • string $statement: 実行するSQL文またはその他SQL実行文を指定する文字列

戻り値(return)

int|false

PDOStatement::execute()メソッドは、SQL文を実行し、影響を受けた行数を整数で返します。SQL文の実行に失敗した場合はfalseを返します。

サンプルコード

PHP PDO::exec でSQLiteテーブル作成とデータ挿入

1<?php
2
3/**
4 * PDO::exec メソッドを使用してSQLiteデータベースにテーブルを作成し、データを挿入するサンプル。
5 *
6 * PDO::exec は、結果セットを返さないSQLステートメント(DDL: CREATE, ALTER, DROP や DML: INSERT, UPDATE, DELETE)の実行に使用されます。
7 * 成功した場合は影響を受けた行数(DDLの場合は通常0)、失敗した場合は false を返します。
8 *
9 * システムエンジニアを目指す初心者向けに、基本的なデータベース操作の実行方法を示します。
10 */
11
12// データベースファイルのパスを指定
13$dbFile = 'sample.db';
14
15// 例外処理を導入し、エラーが発生した場合にメッセージを表示できるようにします。
16try {
17    // 1. SQLiteデータベースに接続
18    // 'sqlite:' の後にデータベースファイルのパスを指定します。
19    // PDO::ERRMODE_EXCEPTION を設定することで、エラー発生時にPDOExceptionをスローさせます。
20    $pdo = new PDO('sqlite:' . $dbFile, null, null, [
21        PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
22    ]);
23
24    echo "データベース '{$dbFile}' に接続しました。\n";
25
26    // 2. `PDO::exec` メソッドを使用してテーブルを作成
27    $createTableSql = "
28        CREATE TABLE IF NOT EXISTS users (
29            id INTEGER PRIMARY KEY AUTOINCREMENT,
30            name TEXT NOT NULL,
31            email TEXT UNIQUE NOT NULL
32        );
33    ";
34    // exec は成功した場合に影響を受けた行数(CREATE TABLEのようなDDLでは通常0)、
35    // 失敗した場合に false を返します。
36    $affectedRows = $pdo->exec($createTableSql);
37
38    if ($affectedRows !== false) {
39        echo "テーブル 'users' を作成または既に存在しています。\n";
40    } else {
41        echo "テーブル 'users' の作成に失敗しました。\n";
42    }
43
44    // 3. `PDO::exec` メソッドを使用してデータを挿入
45    $insertDataSql = "
46        INSERT INTO users (name, email) VALUES
47        ('田中 太郎', 'tanaka.t@example.com'),
48        ('佐藤 花子', 'sato.h@example.com');
49    ";
50    // exec は成功した場合に影響を受けた行数(この場合は挿入された行数)、
51    // 失敗した場合に false を返します。
52    $affectedRows = $pdo->exec($insertDataSql);
53
54    if ($affectedRows !== false) {
55        echo "{$affectedRows} 件のデータを 'users' テーブルに挿入しました。\n";
56    } else {
57        echo "データの挿入に失敗しました。\n";
58    }
59
60    // 4. (オプション) データベース接続を閉じる
61    // PHPスクリプトの実行終了時に自動的に閉じられますが、明示的にnullを設定することも可能です。
62    $pdo = null;
63    echo "データベース接続を閉じました。\n";
64
65} catch (PDOException $e) {
66    // データベース操作中にエラーが発生した場合、ここで捕捉されます。
67    echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
68} finally {
69    // スクリプト終了後のクリーンアップ(任意)
70    // 生成されたデータベースファイルを削除したい場合は、以下のコメントアウトを解除します。
71    // if (file_exists($dbFile)) {
72    //     unlink($dbFile);
73    //     echo "データベースファイル '{$dbFile}' を削除しました。\n";
74    // }
75}

PHPのPDO::execメソッドは、データベースに対してSQLステートメントを実行するための機能です。このメソッドは、結果としてデータ(結果セット)を返さないSQLコマンド、例えばテーブルを作成するCREATE TABLE、データを追加するINSERT、更新するUPDATE、削除するDELETEなどに主に利用されます。

引数には実行したいSQLクエリの文字列を渡します。成功した場合の戻り値は、INSERTUPDATEDELETEのようなデータ操作言語(DML)では処理によって影響を受けた行数が整数で返されます。CREATE TABLEなどのデータ定義言語(DDL)の場合、通常は0が返されます。もしSQLの実行に失敗した場合はfalseが返されるため、エラー処理を行う際にこの戻り値を確認することが重要です。

サンプルコードでは、SQLiteデータベースに接続後、CREATE TABLE文でusersテーブルを作成し、続いてINSERT文でデータを挿入する一連の流れでPDO::execを使用しています。これにより、データベースの構造定義やデータ操作を簡単に行うことができるのです。

PDO::execメソッドは、結果セットを返さないSQL文(データの追加・更新・削除、テーブル作成・変更など)の実行に利用します。SELECT文でデータを取得する目的には使用できませんのでご注意ください。

特に重要なのは、ユーザーからの入力値を含むSQL文には絶対にexecを使用しないことです。このメソッドはプレースホルダに対応していないため、SQLインジェクションの脆弱性が生じるリスクがあります。ユーザー入力がある場合は、必ずPDO::preparePDOStatement::executeメソッドを使って、安全に処理してください。execは完全に固定されたSQL文にのみ適しています。

メソッドの戻り値は、成功時には影響を受けた行数(テーブル作成などのDDLの場合は通常0)、失敗時にはfalseが返ります。そのため、成功したかの確認は!== falseと厳密に行う必要があります。サンプルコードのようにPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONを設定すると、SQLエラー発生時に例外として捕捉でき、適切なエラー処理につながります。

PHP PDO::exec の戻り値を知る

1<?php
2
3/**
4 * PDO\Sqlite::exec メソッドの使用例
5 *
6 * システムエンジニアを目指す初心者向けに、SQLステートメントを実行し、
7 * 成功した場合は影響を受けた行数(int)、失敗した場合は false を返す挙動を示します。
8 */
9function demonstratePdoSqliteExec(): void
10{
11    echo "--- PDO\\Sqlite::exec メソッドのデモンストレーション ---\n\n";
12
13    // インメモリSQLiteデータベースを使用。これにより、ファイルを作成せずに一時的なデータベースが利用できます。
14    $dsn = 'sqlite::memory:';
15
16    try {
17        // データベースに接続
18        $pdo = new PDO($dsn);
19
20        // PDOのエラーモードをPDO::ERRMODE_SILENTに設定します。
21        // これにより、SQLエラーが発生した場合にexec()メソッドがfalseを返すようになります。
22        // (通常推奨されるPDO::ERRMODE_EXCEPTIONでは、エラー時に例外がスローされます)
23        $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT);
24
25        echo "1. テーブルの作成 (CREATE TABLE) - DDL文\n";
26        // DDL (Data Definition Language) 文を実行します。
27        // CREATE TABLE文は行を直接操作しないため、通常、影響を受けた行数は0を返します。
28        $createTableSql = 'CREATE TABLE users (id INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT NOT NULL)';
29        $rowsAffected = $pdo->exec($createTableSql);
30
31        if ($rowsAffected === false) {
32            echo "  [失敗] テーブル作成に失敗しました。\n";
33            // falseが返された場合、errorInfo()で詳細なエラー情報を取得できます。
34            echo "  エラー情報: " . implode(" | ", $pdo->errorInfo()) . "\n";
35        } else {
36            echo "  [成功] テーブル 'users' を作成しました。exec()の戻り値: " . $rowsAffected . " (DDL文では通常0)\n\n";
37        }
38
39        echo "2. データの挿入 (INSERT) - DML文\n";
40        // DML (Data Manipulation Language) 文を実行し、データを挿入します。
41        // 挿入された行数(この場合は1)が戻り値として返されます。
42        $insertSql1 = "INSERT INTO users (name) VALUES ('Alice')";
43        $rowsAffected = $pdo->exec($insertSql1);
44
45        if ($rowsAffected === false) {
46            echo "  [失敗] データ挿入 (Alice) に失敗しました。\n";
47            echo "  エラー情報: " . implode(" | ", $pdo->errorInfo()) . "\n";
48        } else {
49            echo "  [成功] データ 'Alice' を挿入しました。exec()の戻り値: " . $rowsAffected . "\n";
50        }
51
52        $insertSql2 = "INSERT INTO users (name) VALUES ('Bob')";
53        $rowsAffected = $pdo->exec($insertSql2);
54
55        if ($rowsAffected === false) {
56            echo "  [失敗] データ挿入 (Bob) に失敗しました。\n";
57            echo "  エラー情報: " . implode(" | ", $pdo->errorInfo()) . "\n";
58        } else {
59            echo "  [成功] データ 'Bob' を挿入しました。exec()の戻り値: " . $rowsAffected . "\n\n";
60        }
61
62        echo "3. データの更新 (UPDATE) - DML文\n";
63        // データを更新します。更新された行数(この場合は1)が戻り値として返されます。
64        $updateSql = "UPDATE users SET name = 'Alicia' WHERE name = 'Alice'";
65        $rowsAffected = $pdo->exec($updateSql);
66
67        if ($rowsAffected === false) {
68            echo "  [失敗] データ更新に失敗しました。\n";
69            echo "  エラー情報: " . implode(" | ", $pdo->errorInfo()) . "\n";
70        } else {
71            echo "  [成功] データ更新を実行しました。exec()の戻り値: " . $rowsAffected . "\n\n";
72        }
73
74        echo "4. 無効なSQLステートメントの実行 (戻り値: false のケース)\n";
75        // 意図的に構文エラーのあるSQLステートメントを実行します。
76        // ERRMODE_SILENT設定のため、この場合exec()はfalseを返します。
77        $invalidSql = "INSERT INTO non_existent_table (name) VALUES ('Charlie')";
78        $rowsAffected = $pdo->exec($invalidSql);
79
80        if ($rowsAffected === false) {
81            echo "  [失敗] 無効なSQLステートメントを実行しました。exec() は 'false' を返しました。\n";
82            echo "  エラーコード: " . $pdo->errorCode() . "\n";
83            echo "  エラー情報: " . implode(" | ", $pdo->errorInfo()) . "\n";
84        } else {
85            // このブロックは通常実行されません(エラーが発生するため)
86            echo "  [予期しない成功] 無効なSQLステートメントが成功しました。exec()の戻り値: " . $rowsAffected . "\n";
87        }
88
89        echo "\n--- デモンストレーション終了 ---\n";
90
91    } catch (PDOException $e) {
92        // PDOオブジェクトの初期化段階で問題が発生した場合(例: SQLiteドライバーが利用できない)
93        echo "データベース接続エラー: " . $e->getMessage() . "\n";
94    }
95}
96
97// 関数を実行してデモンストレーションを開始
98demonstratePdoSqliteExec();

PDO::execメソッドは、PHPでデータベースに対してSQLステートメントを実行するための機能です。主に、結果セットを直接返さないDDL(データ定義言語:テーブルの作成など)やDML(データ操作言語:データの挿入、更新、削除など)の実行に適しています。

このメソッドは、引数として実行したいSQLステートメントを文字列で受け取ります。

戻り値は、SQLステートメントの実行結果によって変わります。 SQLの実行が成功した場合、データベース上で影響を受けた行数(整数値)を返します。例えば、データを1件挿入すれば1を、複数件更新すれば更新された件数を返します。ただし、テーブル作成のようなDDL文の場合は、通常0が返されます。 もしSQLステートメントの実行に失敗した場合は、falseを返します。このとき、PDO::errorInfo()メソッドを使用することで、エラーの詳細な情報を確認できます。

サンプルコードでは、インメモリのSQLiteデータベースに接続し、このPDO::execメソッドの挙動を具体的に示しています。まずテーブルを作成するDDL文を実行し、その後にデータの挿入や更新といったDML文を実行して、それぞれが返す影響行数を表示しています。また、意図的に無効なSQLステートメントを実行して、失敗時にfalseが返されるケースと、その際のエラー情報の取得方法もデモンストレーションしています。システム開発においてデータベース操作のエラーハンドリングは非常に重要ですので、戻り値がfalseでないか常に確認し、適切に対処する習慣をつけましょう。

PDO::execメソッドは、SQLステートメントを直接実行し、データ操作言語(DML)では影響を受けた行数を、データ定義言語(DDL)では通常0を返します。実行に失敗した場合はfalseを返すため、戻り値がfalseでないかを=== falseで厳密に確認することが重要です。エラーの詳細はPDO::errorInfo()で取得できます。このメソッドはプリペアドステートメントを利用しないため、ユーザー入力値を直接SQL文に含めるとSQLインジェクションのリスクがあります。そのため、セキュリティを考慮し、可変データを扱う場合はPDO::prepare()PDOStatement::execute()の利用を強くお勧めします。

PHP PDO exec関数でDB操作する

1<?php
2
3/**
4 * PDO::exec() メソッドのサンプルコード
5 *
6 * PDO::exec() は、結果セットを返さないSQLステートメントを実行するために使用されます。
7 * 主に CREATE TABLE, INSERT, UPDATE, DELETE などのDDL (データ定義言語) や
8 * DML (データ操作言語) で利用され、影響を受けた行数を返します。
9 * 失敗した場合は false を返します。
10 *
11 * この例では、SQLiteデータベースを使用し、テーブルの作成、データの挿入、更新を行います。
12 */
13
14// データベースファイルのパスを定義
15$databaseFile = 'example.sqlite';
16
17// テスト用に既存のデータベースファイルを削除し、毎回クリーンな状態から開始
18if (file_exists($databaseFile)) {
19    unlink($databaseFile);
20}
21
22// データベース接続を確立
23try {
24    // SQLiteデータベースへのDSN (Data Source Name)
25    $dsn = 'sqlite:' . $databaseFile;
26
27    // PDOオブジェクトを作成
28    // データベースに接続できなかった場合、PDOExceptionがスローされます
29    $pdo = new PDO($dsn);
30
31    // エラーモードを例外に設定
32    // これにより、SQL実行エラーが発生した場合にPDOExceptionがスローされ、try-catchで捕捉できます。
33    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
34
35    echo "SQLiteデータベースに正常に接続しました。\n";
36
37    // --- PDO::exec() の使用例1:テーブルの作成 (DDL) ---
38    // 結果セットを返さないCREATE TABLE文を実行
39    $createTableSql = "
40        CREATE TABLE IF NOT EXISTS users (
41            id INTEGER PRIMARY KEY AUTOINCREMENT,
42            name TEXT NOT NULL,
43            email TEXT UNIQUE NOT NULL
44        );
45    ";
46    // exec() は成功した場合に影響を受けた行数 (DDLの場合は通常0)、失敗した場合に false を返します。
47    $affectedRows = $pdo->exec($createTableSql);
48
49    if ($affectedRows !== false) {
50        echo "テーブル 'users' を作成しました。\n";
51    } else {
52        echo "テーブル 'users' の作成に失敗しました。\n";
53    }
54
55    // --- PDO::exec() の使用例2:データの挿入 (DML) ---
56    // 結果セットを返さないINSERT文を実行
57    // 通常、データ挿入にはプリペアドステートメント (prepare/execute) が推奨されますが、
58    // exec() の動作を示すためにここでは直接SQL文字列を使用します。
59    $insertSql1 = "INSERT INTO users (name, email) VALUES ('Alice', 'alice@example.com');";
60    $affectedRows = $pdo->exec($insertSql1);
61
62    if ($affectedRows !== false) {
63        echo "$affectedRows 行のデータを挿入しました。\n"; // 通常1が返る
64    } else {
65        echo "データの挿入に失敗しました。\n";
66    }
67
68    $insertSql2 = "INSERT INTO users (name, email) VALUES ('Bob', 'bob@example.com');";
69    $affectedRows = $pdo->exec($insertSql2);
70
71    if ($affectedRows !== false) {
72        echo "$affectedRows 行のデータを挿入しました。\n"; // 通常1が返る
73    } else {
74        echo "データの挿入に失敗しました。\n";
75    }
76
77    // --- PDO::exec() の使用例3:データの更新 (DML) ---
78    // 結果セットを返さないUPDATE文を実行
79    $updateSql = "UPDATE users SET name = 'Alicia' WHERE email = 'alice@example.com';";
80    $affectedRows = $pdo->exec($updateSql);
81
82    if ($affectedRows !== false) {
83        echo "$affectedRows 行のデータを更新しました。\n"; // 更新された行数が返る
84    } else {
85        echo "データの更新に失敗しました。\n";
86    }
87
88    // --- 補足:SELECT文はPDO::exec() では使用しません ---
89    // PDO::exec() は結果セットを返さないため、SELECT文には PDO::query() または
90    // プリペアドステートメント (prepare/execute) を使用します。
91    echo "\n現在のユーザーデータ:\n";
92    $stmt = $pdo->query("SELECT id, name, email FROM users");
93    while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
94        echo "ID: {$row['id']}, 名前: {$row['name']}, メール: {$row['email']}\n";
95    }
96
97    // データベース接続を閉じる
98    // PHPではスクリプト終了時に自動的に閉じられますが、明示的にnullを設定することも可能です。
99    $pdo = null;
100    echo "\nデータベース接続を閉じました。\n";
101
102} catch (PDOException $e) {
103    // PDO関連のエラーを捕捉
104    echo "データベースエラーが発生しました: " . $e->getMessage() . "\n";
105    // 必要に応じて、より詳細なエラー情報を出力することもできます。
106    // echo "エラーコード: " . $e->getCode() . "\n";
107} catch (Exception $e) {
108    // その他の予期せぬエラーを捕捉
109    echo "予期せぬエラーが発生しました: " . $e->getMessage() . "\n";
110}
111

PDO::exec()は、PHPでデータベースを操作するためのPDO拡張機能の一つで、結果セットを返さないSQLステートメントを実行する際に使用されるメソッドです。主にテーブルの作成(CREATE TABLE)、データの挿入(INSERT)、更新(UPDATE)、削除(DELETE)といったDDL(データ定義言語)やDML(データ操作言語)で利用されます。

引数$statementには、実行したいSQL文字列を渡します。このメソッドは、SQLの実行によって影響を受けた行数を整数値で返します。たとえば、1行挿入すれば1が、3行更新すれば3が返されます。もしSQLの実行が失敗した場合はfalseを返しますので、戻り値をチェックしてエラーハンドリングを行うことが重要です。

このサンプルコードでは、SQLiteデータベースに接続後、PDO::exec()を使ってusersテーブルを作成しています。その後、データの挿入(INSERT文)と既存データの更新(UPDATE文)を行い、それぞれ影響を受けた行数が正しく返されることを示しています。なお、結果を返すSELECT文にはPDO::exec()ではなく、PDO::query()やプリペアドステートメント(prepare/execute)を使用しますのでご注意ください。

PDO::exec()は、結果セットを返さないSQLステートメント(CREATE TABLE, INSERT, UPDATE, DELETEなど)を実行する際に用います。SELECT文には使用できませんのでご注意ください。メソッドは成功すると影響を受けた行数(DDLでは通常0)、失敗するとfalseを返します。そのため、必ず戻り値がfalseでないことを確認して、処理の成功を判断してください。サンプルコードのように直接SQL文字列を記述する場合、ユーザーからの入力値をSQLに含めるとSQLインジェクションのリスクがあるため、通常はPDO::prepare()とPDOStatement::execute()を使ったプリペアドステートメントの利用を強く推奨します。PDO::exec()は、主に固定されたSQLやDDLで安全に利用できます。また、エラーモードをPDO::ERRMODE_EXCEPTIONに設定し、try-catchブロックでPDOExceptionを捕捉することで、データベースエラーを適切に処理できます。

関連コンテンツ

【PHP8.x】Pdo\Sqlite::exec()メソッドの使い方 | いっしー@Webエンジニア