PHP-DB - 5. レコードの作成

引き続きSQLの実行方法について学習していきましょう。ここでは insert 文の実行方法について取り上げます。次のプログラム( pdo3.php )を作成します。

$dsn = "sqlite:eldb.sqlite3";
$pdo = new PDO($dsn);

$sql = "insert into categories (id, title) values (4, 'Photo')";
$count = $pdo->exec($sql);
echo "Count: $count" . PHP_EOL;

PDO クラスには select 文を実行する際に利用する fetch メソッドや fetchAll メソッド以外にも、 insert 文や後で学習する update 文、 delete 文を実行する際に利用する exec メソッドが用意されています。

このプログラムでは $sql 変数に "insert into categories (id, title) values (4, 'Photo')" を文字列データとして代入、$pdo->exec($sql) メソッドを呼び出して insert 文を実行しています。

PDO クラスの exec メソッドは戻り値にint型の整数値を返します。この整数値は、SQLによって発生したレコードの更新件数(この場合は登録件数)を意味します。この場合、1件のレコードが新規作成されるので $pdo->exec($sql) の戻り値は 1 となります。

それではコマンドラインからプログラムを実行してみましょう。

$ php pdo3.php
Count: 1

実行結果から insert 文による登録件数である 1 が出力されているのがわかります。

実行結果の確認

データベースにレコードが登録されているかどうかを確認してみましょう。SQLite 上で categories テーブルのレコードを検索します。

sqlite> select * from categories order by id;
id          title
----------  -----------
1           Programming
2           Design
3           Marketing
4           Photo

あるいは以前に作成したプログラム( pdo2.php )を実行しても良いでしょう。

$ php pdo2.php
1:Programming
2:Design
3:Marketing
4:Photo

参考:主キーの重複

ここで作成したプログラム( pdo3.php )は連続して実行すると次のような結果となってしまいます。

$ php pdo3.php
Count:

これは categories テーブルに対して id:4 のレコードの登録を試みた結果、主キーの重複によって insert 文が失敗するからです。PDOクラスの exec メソッドは、SQLの実行に失敗した場合、デフォルトで false を返します。ここでは echo 命令で false を出力しているので false"" 空文字に変換されています。

このようなデフォルトの振る舞いは、PDOインスタンスの設定を変更することでカスタマイズできます。たとえばSQLの実行に失敗した場合に例外( PDOException )をスローするように変更できます。

まとめ

  • PDO インスタンスの exec メソッドによって insert 文を実行する
  • exec メソッドは戻り値に更新件数( insert 文の場合は作成件数)を返却する
  • exec メソッドの戻り値にテーブルのレコードは含まれない点に注意する