PHP-DB - 5. レコードの作成
引き続きSQLの実行方法について学習していきましょう。ここでは insert
文の実行方法について取り上げます。次のプログラム( pdo3.php
)を作成します。
<?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
メソッドの戻り値にテーブルのレコードは含まれない点に注意する