Escribí gran parte del código para los parámetros de la base de datos y citas en Zend Framework mientras era el líder del equipo para el proyecto (hasta la versión 1.0).
Traté de fomentar las mejores prácticas en la medida de lo posible, pero tenía que lograr un equilibrio con la facilidad de uso.
Tenga en cuenta que siempre puede examinar el valor de cadena de un Zend_Db_Select
objeto, a ver cómo ha decidido hacer la cotización.
print $select; // invokes __toString() method
También puedes usar el Zend_Db_Profiler
para inspeccionar el SQL que se ejecuta en su nombre por Zend_Db
.
$db->getProfiler()->setEnabled(true);
$db->update( ... );
print $db->getProfiler()->getLastQueryProfile()->getQuery();
print_r $db->getProfiler()->getLastQueryProfile()->getQueryParams();
$db->getProfiler()->setEnabled(false);
Aquí hay algunas respuestas a sus preguntas específicas:
-
Zend_Db_Select::where('last_name=?', $lname)
Los valores se cotizan apropiadamente. Aunque el "
?
" parece un marcador de posición de parámetro; en este método, el argumento se cita correctamente y se interpola. Por lo tanto, no es un parámetro de consulta verdadero. De hecho, las siguientes dos declaraciones producen exactamente la misma consulta que el uso anterior:$select->where( $db->quoteInto('last_name=?', $lname) ); $select->where( 'last_name=' . $db->quote($lname) );
Sin embargo, si pasa un parámetro que es un objeto de tipo
Zend_Db_Expr
, entonces no se cita. Usted es responsable de los riesgos de inyección SQL, porque se interpola palabra por palabra, para admitir valores de expresión:$select->where('last_modified < ?', new Zend_Db_Expr('NOW()'))
Cualquier otra parte de esa expresión que necesite ser citada o delimitada es de su responsabilidad. Por ejemplo, si interpola cualquier variable de PHP en la expresión, la seguridad es su responsabilidad. Si tiene nombres de columna que son palabras clave de SQL, debe delimitarlos usted mismo con
quoteIdentifier()
. Ejemplo:$select->where($db->quoteIdentifier('order').'=?', $myVariable)
-
Zend_Db_Adapter_Abstract::insert( array('colname' => 'value') )
El nombre de la tabla y los nombres de las columnas están delimitados, a menos que desactive
AUTO_QUOTE_IDENTIFIERS
.Los valores se parametrizan como parámetros de consulta verdaderos (no interpolados). A menos que el valor sea un
Zend_Db_Expr
objeto, en cuyo caso se interpola palabra por palabra, por lo que puede insertar expresiones oNULL
o lo que sea. -
Zend_Db_Adapter_Abstract::update( array('colname' => 'value'), $where )
El nombre de la tabla y los nombres de las columnas están delimitados, a menos que desactive
AUTO_QUOTE_IDENTIFIERS
.Los valores están parametrizados, a menos que sean
Zend_Db_Expr
objetos, como eninsert()
método.El
$where
El argumento no se filtra en absoluto, por lo que usted es responsable de cualquier riesgo de inyección de SQL en ese. Puede hacer uso dequoteInto()
para ayudar a que la cotización sea más conveniente.