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?

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top