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メソッドの戻り値にテーブルのレコードは含まれない点に注意する