Pregunta

Tengo un problema probablemente muy sencilla con la que no puedo encontrar una respuesta satisfactoria (subjetivamente visto) en el manual de Zend Framework o en otro lugar ...

Hay muchas maneras de cómo puedo mano sobre mi php variables a mis consultas SQL que he perdido la visión general y, probablemente, me faltan algunos conocimientos sobre citando en general.

instrucciones preparadas

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

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

Yo entiendo que con esta solución no necesito citar nada porque el PP se encarga de esto por mí.

Consulta Zend_Db_Table y _Row objetos por encima de la API

$ = usuarios nuevos usuarios ();

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

Preguntas

Yo entiendo que a) no es aceptable, ya que no es citado en absoluto. Pero ¿qué pasa con las otras versiones, lo que es el mejor? Es c) ser tratada como una declaración y citado de forma automática o tengo que usar d) cuando se utiliza la? identificador?

¿Fue útil?

Solución

Renuncia: Esta información es válida a partir de la fecha de contabilización original de esta respuesta. ZF cambia a menudo, esta información puede llegar a ser obsoleta con futuras versiones, sin embargo, esto no cambiará con fines de archivo.

Si pasa una cadena al método fetchRow() de una subclase de Zend_Db_Table_Abstract (que se está haciendo), será tratado como parte de una instancia where Zend_Db_Table_Select.

En otras palabras, a nivel interno, Zend_Db_Table hace esto:

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

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

Así que ...:

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

No es citado en absoluto.

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

es citado de forma manual como un entero.

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

Se cita automáticamente por Zend_Db_Adapter_*::quoteInto()

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

En realidad, es entre comillas dobles, una vez por usted, y una vez a través de la cita automática.

En cuanto a la "mejor" se refiere, yo recomendaría la opción C. El marco llamará automáticamente quoteInto en el valor parametrizado.

Tenga en cuenta: Siempre se puede pasar una instancia de Zend_Db_Table_Select o Zend_Db_Select al método fetchRow() lugar ...

Una vez más, en una subclase de Zend_Db_Table_Abstract, que se vería así:

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

La ventaja de hacer esto, es que se puede construir consultas más complejas, ya que tienes el control sobre gran parte mucho más que la cláusula, WHERE de la consulta SQL. En teoría, se podría hacer fácilmente:

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

$this->fetchRow($select);

Nota: Si se aprueba una instancia de Zend_Db_Select, el método fetchRow() actúa exactamente igual que fetchAll() excepto que llama internamente al método limit() del objeto seleccionado, con un parámetro de 1 .

Otros consejos

Me acostumbré a

$where = $this->getAdapter()->quoteInto('name = ?', $name);
$this->fetchRow($where);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top