Il mio Zend Framework 'citando' pasticcio
-
19-09-2019 - |
Domanda
Ho un problema probabilmente molto semplice, che non riesco a trovare una risposta soddisfacente (soggettivamente visto) nel manuale di Zend Framework o altrove ...
Ci sono tanti modi come posso consegnare le mie variabili php ai miei query SQL che ho perso la visione d'insieme e probabilmente mi manca un po 'di comprensione circa citando in generale.
prepared statement
$sql = "SELECT this, that
FROM table
WHERE id = ? AND restriction = ?";
$stmt = $this->_db->query($sql, array($myId, $myValue));
$result = $stmt->fetchAll();
Mi rendo conto che con questa soluzione non ho bisogno di citare nulla perché il db gestisce questo per me.
Interrogazione Zend_Db_Table e _Row oggetti su l'API
$ = utenti nuovi utenti ();
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'));
Domande
Capisco che a) non va bene perché non è quotato a tutti. Ma per quanto riguarda le altre versioni, qual è il migliore? È c) di essere trattato come una dichiarazione e citato in modo automatico o devo usare d) quando uso il? identificatore?
Soluzione
Avviso: Queste informazioni sono valide a partire dalla data di registrazione originale di questa risposta. ZF cambia spesso, queste informazioni possono diventare obsolete con versioni future, tuttavia, questa rimarrà invariata per scopi di archiviazione.
Se si passa una stringa al metodo fetchRow()
di una sottoclasse di Zend_Db_Table_Abstract
(che si sta facendo), sarà trattata come una parte where
di un'istanza Zend_Db_Table_Select
.
In altre parole, al suo interno, Zend_Db_Table
fa questo:
if (!($where instanceof Zend_Db_Table_Select)) {
$select = $this->select();
if ($where !== null) {
$this->_where($select, $where);
}
Quindi ...:
a) $users->fetchRow('userID = ' . $userID);
Non è quotato a tutti.
b) $users->fetchRow('userID = ' . $users->getAdapter()->quote($userID, 'INTEGER'));
è citato manualmente come un intero.
c) $users->fetchRow('userID = ?', $userID);
È automaticamente citato da Zend_Db_Adapter_*::quoteInto()
d) $users->fetchRow('userID = ?', $users->getAdapter()->quote($userID, 'INTEGER'));
In realtà è doppio citato, una volta che da voi, e una volta attraverso la citazione automatica.
Per quanto riguarda il "migliore" è interessato, mi sento di raccomandare l'opzione C. Il quadro chiamerà automaticamente quoteInto
sul valore parametrizzato.
Tenete a mente: Si può sempre passare un'istanza di Zend_Db_Table_Select
o Zend_Db_Select
al metodo fetchRow()
invece ...
Ancora una volta, in una sottoclasse di Zend_Db_Table_Abstract
, che sarebbe simile a questa:
$this->fetchRow($this->select()->where('userID = ?', $userID));
Il plus di fare questo, è che si può creare query molto più complesse, come si ha il controllo su gran parte molto di più che la clausola, WHERE
della query SQL. In teoria, si potrebbe facilmente fare:
$select = $this->select()->where('userID = ?', $userID)
->join(array('sat' => 'superAwesomeTable'), array('sat.user_id = userID', array('superAwesomeColumn'));
$this->fetchRow($select);
Nota: Se approvata un'istanza Zend_Db_Select
, il metodo fetchRow()
agisce esattamente come fetchAll()
tranne che chiama internamente il metodo limit()
dell'oggetto di selezione, con un parametro di 1
.
Altri suggerimenti
mi sono abituato a
$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);