2012-01-28 19 views
6

Estoy usando key como nombre de columna en una tabla MySQL.Cómo citar nombres de columna con Zend_Db?

Dado que este es reservado, tiene que ser escapado adecuadamente para ser utilizado en una consulta:

… WHERE `key` = 'test' 

manualmente esto no es problema, pero yo estoy usando el Zend Framework y quieren tener que manejar el escape correctamente, así:

$table = new Application_Model_ATable(); 
$table->fetchRow ($table->select()->where('key = ?','test')); 

Entonces la pregunta es:

¿Cómo citar/escapar de nombres de columna con Zend_Db_Table?

+0

hm, eso es extraño ... Debería haber funcionado ... Bueno, no tengo tiempo para inspeccionar las fuentes de ZF, lo siento, entonces ... PD: como solución alternativa, puede hacerlo manualmente: $ table- > fetchRow ($ table-> select() -> where ('' key '=? ',' test ')); (espacios agregados alrededor de 'clave' porque SO lo resalta) – zerkms

+0

Estoy haciendo exactamente esa solución en este momento, pero estaba buscando una solución" más limpia ":-) ¡Gracias por probar! :-) – favo

+0

Si hay una respuesta válida, por favor escríbame con un comentario que comience con mi nombre, tengo curiosidad de la forma "correcta" de hacerlo ;-) – zerkms

Respuesta

4

avoiding MySQL injections with the Zend_Db class

El chico explica aquí en realidad, pero mal acaba de sacar la cita rápidamente ...

En cualquier otra parte de esa expresión que necesita ser citado o delimitado es su responsabilidad. Por ejemplo, si interpola cualquier variable PHP en la expresión, la seguridad es su responsabilidad. Si tiene los nombres de la columna que son palabras clave de SQL, debe delimitarlos usted mismo con quoteIdentifier(). Ejemplo:

$select->where($db->quoteIdentifier('order').'=?', $myVariable) 

Espero que esto ayude !!

1

intentar algo como:

$table = new Application_Model_ATable(); 
$where = $table->getAdapter()->quoteInto('key = ?', 'test'); 
$table->fetchRow ($where); 

* --excerpt de referencia Zend_Db_Table - *
Nota Los valores y los identificadores en la expresión SQL no se citan para usted. Si tiene valores o identificadores que requieren cotización, usted es responsable de haciendo esto. Utilice los métodos quote(), quoteInto() y quoteIdentifier() del adaptador de base de datos.

+2

Esto no escapa a la "clave" del nombre de la columna, se mantiene intacta pero proporcionó la respuesta citando parte de la documentación. La solución es: $ table-> fetchRow ($ table-> select() -> where ($ table-> getAdapter() -> quoteIdentifier ('key'). '=?', 'Test')); - ¡Gracias! – favo

+0

sabía que estaba cerca :) – RockyFord

+0

método quoteIdentifier() es clave para el éxito aquí –

1

Uno debe citar los nombres de las columnas cuando se han utilizado letras mayúsculas. Es útil citar esos nombres con $ db-> quoteIdentifier ($ columnName) cuando planee cambiar el adaptador databese en el futuro.

Cuestiones relacionadas