autoPrepare() および autoExecute() は、うんざりするような INSERT、UPDATE、DELETE や SELECT 文を書く手間を軽減します。 これらの SQL 文を使用していると、例えばテーブルにフィールドを追加した場合などの メンテナンスが大変ですよね? autoPrepare() および autoExecute() を使用するには、 Extended モジュールを 使用する必要があります。
'user' テーブルに次の 3 つのフィールド (id, name そして country) があるとしましょう。 きっと、こんな SQL クエリを書くことになるでしょう。
INSERT INTO table (id, name, country) VALUES (?, ?, ?) UPDATE table SET id=?, name=?, country=? WHERE ...
ここでフィールドを追加 (例えば 'birthYear' など) したとすると、 クエリを書き直さなければなりません。これはうんざりするような作業であり、 (ひとつだけクエリの修正を忘れてしまうなどの) バグの元となります。
autoPrepare() を使用すると、insert や update、delete そして select といったクエリを書く必要がなくなります。例を見てみましょう。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
$table_fields = array('id', 'name', 'country');
$types = array('integer', 'text', 'text');
$mdb2->loadModule('Extended');
$sth = $mdb2->extended->autoPrepare($table_name, $table_fields,
MDB2_AUTOQUERY_INSERT, null, $types);
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 =& $sth->execute($table_values);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?>
どうです? SQL の INSERT 文を一切書く必要がないのです! そしてこれは UPDATE や DELETE でも同様に動作します。ただし、柔軟性を確保するため、クエリの WHERE 句だけは書かなければなりません。 例えばこのようになります。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
$mdb2->loadModule('Extended');
$sth = $mdb2->extended->autoPrepare($table_name, null,
MDB2_AUTOQUERY_DELETE, 'id = '.$mdb2->quote(1, 'integer'));
if (PEAR::isError($sth)) {
die($sth->getMessage());
}
$res =& $mdb2->execute($sth, $table_values);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?>
autoPrepare() は、次のようなクエリを作成します。
UPDATE user SET name=?, country=? WHERE id=1
それから、そのクエリを使用して prepare() をコールします。
注意しなければならないのは、もし WHERE 句を指定しなければ、 テーブルの全レコードが更新されてしまうということです。
insert、update、delete あるいは select クエリを実行する最も簡単な方法が、 autoExecute() をコールすることです。 これは autoPrepare() と execute() を組み合わせたものです。
必要なのは連想配列だけです。連想配列のキーにフィールド名、 対応する値としてそのフィールドの値を指定します。 これは、insert や update クエリの場合にのみ影響します。 例を見てみましょう。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
$fields_values = array(
'id' => 1,
'name' => 'Fabien',
'country' => 'France'
);
$types = array('integer', 'text', 'text');
$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, $fields_values,
MDB2_AUTOQUERY_INSERT, null, $types);
if (PEAR::isError($affectedRows)) {
die($affectedRows->getMessage());
}
?>
たったこれだけです! これで、次のクエリが作成され、そして実行されます。
INSERT INTO user (id, name, country) VALUES (1, 'Fabien', 'France')
UPDATE クエリについても同様です。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
$fields_values = array(
'name' => 'Fabien',
'country' => 'France'
);
$types = array('text', 'text');
$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, $fields_values,
MDB2_AUTOQUERY_UPDATE, 'id = '.$mdb2->quote(1, 'integer'), $types);
if (PEAR::isError($affectedRows)) {
die($affectedRows->getMessage());
}
?>
これで、以下のクエリが作成され、そして実行されます。
UPDATE user SET name='Fabien', country='France' WHERE id = 1
注意しなければならないのは、もし WHERE 句を指定しなければ、 テーブルの全レコードが更新されてしまうということです。
これが DELETE クエリの例です。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
$mdb2->loadModule('Extended');
$affectedRows = $mdb2->extended->autoExecute($table_name, null,
MDB2_AUTOQUERY_DELETE, 'id = '.$mdb2->quote(1, 'integer'));
if (PEAR::isError($affectedRows)) {
die($affectedRows->getMessage());
}
?>
これで、以下のクエリが作成され、そして実行されます。
DELETE FROM user WHERE id = 1
最後に SELECT クエリの例を見てみましょう。
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$table_name = 'user';
// 配列を指定しない場合は、'*' を使用してすべてのフィールドを取得します。
// その場合、この変数を true に設定すると自動的に型の判別を行います。
$result_types = array(
'name' => 'text',
'country' => 'text'
);
$mdb2->loadModule('Extended');
$res = $mdb2->extended->autoExecute($table_name, null,
MDB2_AUTOQUERY_SELECT, 'id = '.$mdb2->quote(1, 'integer'),
null, true, $result_types);
if (PEAR::isError($res)) {
die($res->getMessage());
}
$row = $res->fetchRow();
?>
これで、以下のクエリが作成され、そして実行されます。
SELECT name, country FROM user WHERE id = 1
$data
に渡す値はリテラルでなければなりません。 SQL の関数 (例えばCURDATE()
など) を使用しないでください。 実行時に使用する SQL 関数は、プリペアドステートメントに 埋め込んでおく必要があります。