Question

J'ai une question sans doute très simple à laquelle je ne trouve pas satisfaisante (subjectivement vu) réponse dans le manuel Zend Framework ou ailleurs ...

Il y a tellement de façons comment je peux main sur mes variables php à mes requêtes SQL que j'ai perdu la vue d'ensemble et probablement je manque une certaine compréhension au sujet de citer en général.

Déclarations préparées

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

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

Je comprends que cette solution je ne pas besoin de citer quoi que ce soit parce que le db gère cela pour moi.

Interrogation objets Zend_Db_Table et _Row sur l'API

$ utilisateurs = nouveaux utilisateurs ();

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'));  

Questions

Je comprends que a) n'est pas correct car il est pas cité du tout. Mais les autres versions, ce qui est le meilleur? Est-c) être traité comme une déclaration et citais automatiquement ou dois-je utiliser d) lorsque j'utilise le? identifiant?

Était-ce utile?

La solution

Disclaimer: Ces informations sont valides à la date de publication originale de cette réponse. ZF change souvent, ces informations peuvent devenir obsolètes avec les futures versions, cependant, cela ne changera pas à des fins d'archivage.

Si vous passez une chaîne à la méthode fetchRow() d'une sous-classe de Zend_Db_Table_Abstract (que vous faites), elle sera traitée comme une partie de where d'une instance Zend_Db_Table_Select.

En d'autres termes, à l'interne, Zend_Db_Table fait ceci:

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

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

...

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

est pas cité du tout.

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

est cité manuellement comme un entier.

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

est cité automatiquement par Zend_Db_Adapter_*::quoteInto()

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

est en fait entre guillemets doubles, une fois par vous, et une fois par la citation automatique.

En ce qui concerne « meilleur » est concerné, je recommande l'option C. Le cadre appellera automatiquement quoteInto sur la valeur paramétrés.

Gardez à l'esprit: Vous pouvez toujours passer une instance de Zend_Db_Table_Select ou Zend_Db_Select à la méthode fetchRow() à la place ...

Encore une fois, dans une sous-classe de Zend_Db_Table_Abstract, qui ressemblerait à ceci:

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

Le plus de le faire, est que vous pouvez construire des requêtes beaucoup plus complexes, que vous avez le contrôle sur beaucoup, beaucoup plus que la clause WHERE de la requête SQL. En théorie, vous pouvez facilement faire:

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

$this->fetchRow($select);

Remarque: Si elle est adoptée une instance de Zend_Db_Select, la méthode fetchRow() agit exactement comme fetchAll() sauf il appelle en interne la méthode limit() de l'objet choisi, avec un paramètre de 1 .

Autres conseils

Je me suis habitué à

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top