4

おそらく非常に単純な問題があり、Zend Frameworkのマニュアルや他の場所で満足のいく(主観的に見られる)答えを見つけることができません...

php変数をsqlクエリに渡す方法はたくさんあるので、概要を失い、おそらく一般的な引用についての理解が不足しています。

プリペアドステートメント

$sql =  "SELECT this, that
        FROM table
        WHERE id = ? AND restriction = ?";

$stmt = $this->_db->query($sql, array($myId, $myValue)); 
$result = $stmt->fetchAll();

このソリューションでは、dbがこれを処理するため、何も引用する必要がないことを理解しています。

APIを介したZend_Db_Tableおよび_Rowオブジェクトのクエリ

$ users = new Users();

a) $users->fetchRow('userID = ' . $userID);  
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  
c) $users->fetchRow('userID = ?', $userID);  
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));  

質問

a)はまったく引用されていないため、問題がないことを理解しています。しかし、他のバージョンはどうですか、最高のものは何ですか?c)ステートメントのように扱われ、自動的に引用されますか、それともd)を使用するときに使用する必要がありますか?識別子?

4

2 に答える 2

5

免責事項:この情報は、この回答の最初の投稿日から有効です。ZFは頻繁に変更され、この情報は将来のリリースで古くなる可能性がありますが、アーカイブの目的で変更されません。

fetchRow()(実行している)のサブクラスのメソッドに文字列を渡すと、インスタンスの一部Zend_Db_Table_Abstractとして扱われます。whereZend_Db_Table_Select

言い換えれば、内部的に、Zend_Db_Tableこれを行います:

if (!($where instanceof Zend_Db_Table_Select)) {
    $select = $this->select();

    if ($where !== null) {
        $this->_where($select, $where);
    }

それで...:

a) $users->fetchRow('userID = ' . $userID);  

全く引用されていません。

b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));  

手動で整数として引用されます。

c) $users->fetchRow('userID = ?', $userID);  

によって自動的に引用されますZend_Db_Adapter_*::quoteInto()

d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));

実際には、1回はあなたが、もう1回は自動引用を介して二重引用符で囲みます。

「最良」に関する限り、オプションCをお勧めします。フレームワークはquoteIntoパラメーター化された値を自動的に呼び出します。

覚えておいてください:代わりに、メソッドのインスタンスZend_Db_Table_Selectまたはメソッドにいつでも渡すことができます...Zend_Db_SelectfetchRow()

繰り返しますが、のサブクラスではZend_Db_Table_Abstract、次のようになります。

$this->fetchRow($this->select()->where('userID = ?', $userID));

WHEREこれを行うことの利点は、SQLクエリの句だけでなく、はるかに多くのことを制御できるため、はるかに複雑なクエリを作成できることです。理論的には、次のことを簡単に行うことができます。

$select = $this->select()->where('userID = ?', $userID)
                         ->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));

$this->fetchRow($select);

注:のインスタンスが渡された場合Zend_Db_Select、メソッドは、パラメーターが。のselectオブジェクトのメソッドを内部的に呼び出すことを除いfetchRow()て、まったく同じように機能します。fetchAll() limit()1

于 2009-07-23T02:13:27.643 に答える
0

慣れてきた

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
于 2009-07-23T11:06:31.740 に答える