導入 - autoPrepare & autoExecute -- SQL 文を自動で組み立て、実行する
説明
目的
autoPrepare() および
autoExecute()
を使用することで、あのうんざりするような
INSERT 文や UPDATE
文を書く必要がなくなります。例えばテーブルにフィールドを
追加したような場合に、いちいち書き直す必要もなくなります。
3 つのフィールド (id、name そして country) を持つ
'user' というテーブルがあるとしましょう。
この場合、以下のような SQL クエリを書くことになるでしょう。
INSERT INTO table (id, name, country) VALUES (?, ?, ?)
UPDATE table SET id=?, name=?, country=? WHERE ... |
もしフィールド (たとえば 'birthYesr') を追加したとすると、
このクエリを書き直す必要があります。これはあまりにつまらない作業であり、
バグを生み出しやすいものです (もしひとつだけクエリを書き換えるのを
忘れたりしたら?)。
autoPrepare
autoPrepare() を使用すると、insert クエリや
update クエリを書く必要がなくなります。例えば、
<?php
// $db という名前の DB オブジェクトを取得しているとします...
$table_name = 'user';
$table_fields = array('id', 'name', 'country');
$sth = $db->autoPrepare($table_name, $table_fields,
DB_AUTOQUERY_INSERT);
if (PEAR::isError($sth)) {
die($sth->getMessage());
}
?> |
この例では、
autoPrepare() は次の SQL クエリを組み立てます。
INSERT INTO user (id, name, country) VALUES (?, ?, ?) |
その後、
prepare() をコールします。
レコードを追加するには、以下のようにして
execute() あるいは
executeMultiple() を使用する必要があります。
<?php
// ... 上の例の続きです...
$table_values = array(1, 'Fabien', 'France');
$res =& $db->execute($sth, $table_values);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?> |
そう、もはや SQL の
INSERT クエリを
一切書かなくてもよくなるのです!
UPDATE クエリについても同様です。
柔軟性を高めるため、クエリの
WHERE
句についてだけは自分で書く必要があります。たとえばこのようになります。
<?php
// $db という名前の DB オブジェクトを取得しているとします...
$table_name = 'user';
$table_fields = array('name', 'country');
$table_values = array('Bob', 'USA');
$sth = $db->autoPrepare($table_name, $table_fields,
DB_AUTOQUERY_UPDATE, 'id = 1');
if (PEAR::isError($sth)) {
die($sth->getMessage());
}
$res =& $db->execute($sth, $table_values);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?> |
autoPrepare() は、
次のようなクエリを組み立てます。
UPDATE user SET name=?, country=? WHERE id=1 |
その後、
prepare() をコールします。
何も WHERE 句を指定しなかった場合は、
テーブルのすべてのレコードが更新されてしまうことに注意しましょう。
autoExecute
insert クエリや update クエリを実行する一番簡単な方法は、
autoExecute() を使用することです。
これは
autoPrepare() および
execute() を組み合わせたものです。
必要なのは、フィールド名をキーとしてフィールドの値を対応させた
連想配列のみでず。例えばこのようになります。
<?php
// $db という名前の DB オブジェクトを取得しているとします...
$table_name = 'user';
$fields_values = array(
'id' => 1,
'name' => 'Fabien',
'country' => 'France'
);
$res = $db->autoExecute($table_name, $fields_values,
DB_AUTOQUERY_INSERT);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?> |
たったこれだけです! これで、次のようなクエリが組み立てられ、
そして実行されます。
INSERT INTO user (id, name, country)
VALUES (1, 'Fabien', 'France') |
UPDATE クエリの場合も同様です。
<?php
// $db という名前の DB オブジェクトを取得しているとします...
$table_name = 'user';
$fields_values = array(
'name' => 'Fabien',
'country' => 'France'
);
$res = $db->autoExecute($table_name, $fields_values,
DB_AUTOQUERY_UPDATE, 'id = 1');
if (PEAR::isError($res)) {
die($res->getMessage());
}
?> |
これは、次のようなクエリを組み立てて実行します。
UPDATE user SET name='Fabien', country='France'
WHERE id = 1 |
何も WHERE 句を指定しなかった場合は、
テーブルのすべてのレコードが更新されてしまうことに注意しましょう。
警告 |
$data に渡す値は、リテラルである必要があります。
SQL 関数 (例えば CURDATE() など) を渡さないでください。
実行時に処理される SQL 関数は、プリペアドステートメント内に記述する
必要があります。
|