【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クエリの文字列を渡します。成功した場合の戻り値は、INSERTやUPDATE、DELETEのようなデータ操作言語(DML)では処理によって影響を受けた行数が整数で返されます。CREATE TABLEなどのデータ定義言語(DDL)の場合、通常は0が返されます。もしSQLの実行に失敗した場合はfalseが返されるため、エラー処理を行う際にこの戻り値を確認することが重要です。
サンプルコードでは、SQLiteデータベースに接続後、CREATE TABLE文でusersテーブルを作成し、続いてINSERT文でデータを挿入する一連の流れでPDO::execを使用しています。これにより、データベースの構造定義やデータ操作を簡単に行うことができるのです。
PDO::execメソッドは、結果セットを返さないSQL文(データの追加・更新・削除、テーブル作成・変更など)の実行に利用します。SELECT文でデータを取得する目的には使用できませんのでご注意ください。
特に重要なのは、ユーザーからの入力値を含むSQL文には絶対にexecを使用しないことです。このメソッドはプレースホルダに対応していないため、SQLインジェクションの脆弱性が生じるリスクがあります。ユーザー入力がある場合は、必ずPDO::prepareとPDOStatement::executeメソッドを使って、安全に処理してください。execは完全に固定されたSQL文にのみ適しています。
メソッドの戻り値は、成功時には影響を受けた行数(テーブル作成などのDDLの場合は通常0)、失敗時にはfalseが返ります。そのため、成功したかの確認は!== falseと厳密に行う必要があります。サンプルコードのようにPDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTIONを設定すると、SQLエラー発生時に例外として捕捉でき、適切なエラー処理につながります。