|
|
(Next) 可搬性 |
||||
| |
|||||
|
|||||
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 ...
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());
}
?>
INSERT INTO user (id, name, country) VALUES (?, ?, ?)
レコードを追加するには execute() あるいは executeMultiple() を次のように使用します。
<?php
// ... 上の例からの続きです ...
$table_values = array(1, 'Fabien', 'France');
$res =& $sth->execute($table_values);
if (PEAR::isError($res)) {
die($res->getMessage());
}
?>
<?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());
}
?>
UPDATE user SET name=?, country=? WHERE id=1
注意しなければならないのは、もし 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 関数は、プリペアドステートメントに 埋め込んでおく必要があります。
|
|
(Next) 可搬性 |
||||||||
| |
|||||||||
|
|||||||||