zf2 zend framework php sql zend-framework quoting

php - zf2 - zend framework select



Mi Zend Framework ''citando'' lío (2)

Me acostumbré

$where = $this->getAdapter()->quoteInto(''name = ?'', $name); $this->fetchRow($where);

Tengo un problema probablemente muy simple al que no puedo encontrar una respuesta satisfactoria (vista subjetiva) en el manual de Zend Framework o en otro lugar ...

Hay tantas maneras de cómo puedo entregar mis variables php a mis consultas sql que perdí la visión general y probablemente me falte algo de comprensión acerca de las citas en general.

Declaraciones preparadas

$sql = "SELECT this, that FROM table WHERE id = ? AND restriction = ?"; $stmt = $this->_db->query($sql, array($myId, $myValue)); $result = $stmt->fetchAll();

Entiendo que con esta solución no necesito citar nada porque el db maneja esto para mí.

Consultar objetos Zend_Db_Table y _Row sobre la API

$ users = new 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''));

Preguntas

Entiendo que a) no está bien porque no se cita en absoluto. Pero ¿qué pasa con las otras versiones, qué es lo mejor? ¿Es c) tratado como una declaración y se cita automáticamente o necesito usar d) cuando uso el? identificador?


Descargo de responsabilidad: esta información es válida a partir de la fecha de publicación original de esta respuesta. ZF cambia a menudo, esta información puede quedar desactualizada en versiones futuras, sin embargo, esto no cambiará para fines de archivo.

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

En otras palabras, internamente, Zend_Db_Table hace esto:

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

Asi que...:

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

No se cita en absoluto.

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

Se cotiza manualmente como un entero.

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

Es citado automáticamente por Zend_Db_Adapter_*::quoteInto()

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

En realidad es una cita doble, una vez por usted y una vez a través de las citas automáticas.

En lo que respecta a "lo mejor", recomendaría la opción C. El framework llamará automáticamente a quoteInto sobre el valor parametrizado.

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

De nuevo, en una subclase de Zend_Db_Table_Abstract , se vería así:

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

La ventaja de hacer esto, es que puede construir consultas mucho más complejas, ya que tiene control sobre mucho, mucho más que solo la cláusula WHERE de la consulta SQL. En teoría, podrías 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 pasa una instancia de Zend_Db_Select , el método fetchRow() actúa exactamente como fetchAll() excepto que llama internamente al método limit() del objeto seleccionado, con un parámetro de 1 .