2

メソッドを使用してテーブルをデータで更新したい場合Zend_Db_Table->update()、「where」句でバインド変数を使用する方法が見つかりません。

メソッドのシグネチャは次のとおりです。

int  update($data, array|string $where)

通常、次のようにメソッドを呼び出します。

$table = new Bugs();

$data = array(
    'updated_on'      => '2007-03-23',
    'bug_status'      => 'FIXED'
);

$where = $table->getAdapter()->quoteInto('bug_id = ?', 1234);

$table->update($data, $where);

quoteInto変数をバインドするのではなく、変数をエスケープするだけです。

バインド変数を使用する方法が必要です。そうしないと、DBMS はこのクエリを効果的にキャッシュできません。

何か不足していますか、それとも Zend 側の見落としですか?

4

1 に答える 1

4

データを更新しているだけで、RDBMS(MySQLを想定)はUPDATEクエリをキャッシュしません。それでもバインド変数(セキュリティ?パフォーマンス?)を使用する場合は、プリペアドステートメントを使用する必要があります。

$db = Zend_Db_Table_Abstract::getDefaultAdapter();
$stmt = $db->prepare("UPDATE table SET key = :key, value = :value");

foreach ($data as $key=>$value) {
    $stmt->bindParam('key', $key);
    $stmt->bindParam('value', $value);
    $stmt->execute();
}

しかし、バッチに何百万ものUPDATEクエリがある場合を除いて、これを気にする必要はないと思います。$ table-> update($ data、$ where);を使用するだけです。

于 2009-10-22T22:01:41.780 に答える