質問

おそらく非常に単純な問題があり、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();

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

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

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

役に立ちましたか?

解決

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

に文字列を渡すと、 fetchRow() のサブクラスのメソッド Zend_Db_Table_Abstract (あなたがやっている)、それはとして扱われます where の一部 Zend_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, 、 fetchRow() メソッドはまったく同じように動作します fetchAll() を除外する 内部的には limit() パラメータを指定した選択オブジェクトのメソッド 1.

他のヒント

私はに慣れ

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top