En Kohana 3, ahora se puede unir llamado params en las consultas, pero ¿cómo puedo escapar de los que no puedo unir?

StackOverflow https://stackoverflow.com/questions/2204149

  •  18-09-2019
  •  | 
  •  

Pregunta

En Kohana 3, I puede enlazar un parámetro en una consulta como tal

$query = 'SELECT name FROM users WHERE id = :id';

Este es limpio, pero a veces quiero otras cosas para ser configurable, como el nombre de la tabla. Cuando utilizo un parámetro llamado así por el nombre de tabla, falla. Me acaban de Creación de la cadena en estas circunstancias.

Mi pregunta es, ¿cómo puedo escapar caracteres potencialmente malo cuando se hace este tipo de edificio cuerda? En Kohana 2.x, se podría hacer $this->db->escape() pero desde Kohana 3 es radicalmente diferente, me imagino que hay un nuevo camino?

¿Fue útil?

Solución

Sólo para añadir a la respuesta de Mark Byers, la razón de que la parametrización del nombre de la tabla está fallando es que los parámetros se evitan como Los valores , mientras que un nombre de tabla es un identificador . Lo que está sucediendo es que, probablemente, el nombre de la tabla está siendo envuelto entre comillas, si bien debe ser envuelto entre comillas sencillas en su lugar.

Sin embargo, como dice Marcos, una necesidad de escapar de nombres de tabla sugiere un mal diseño. O bien deben codificarse o almacenados en algún archivo de configuración cuyo contenido puede ser de confianza para no necesitar escapar de todos modos duro. Tratando de cubrir todas sus bases hasta el punto de que no confía en su propia configuración más probable es una pérdida de tiempo.

Otros consejos

Nunca he utilizado kohana, así que disculpas si este comentario es completamente irrelevante, pero tengo algunos comentarios acerca de lo que está tratando de hacer:

  

Cuando uso un parámetro llamado así por el nombre de tabla, falla.

Asumo que esto es debido a que se basa en el mecanismo de parámetros de la base de datos subyacente, y no sé de cualquier base de datos que le permite dar un nombre de tabla como un parámetro en una consulta. Así que sí, lo más probable es que usted tiene que construir una cadena de sí mismo.

  

¿cómo puedo escapar caracteres potencialmente malo cuando se hace este tipo de edificio cuerda?

Esta pregunta parece extraño ... ya sea que tenga caracteres potencialmente malos en algunos de sus nombres de tabla ... si es así, ¿por qué? O de lo que está recibiendo el nombre de la tabla a partir de una fuente no confiable (usuario?). Esto suena como una mala idea. ¿Qué pasa si intentan leer de una tabla que no se supone que tienen acceso a? ¿No sería mejor tener una lista bien definida de los nombres de tablas permitidas y comprobar que la tabla existe en esa lista, en vez de escapar nombres de tabla potencialmente malo?

Y tengo una última observación: si usted es capaz de cambiar el nombre de la tabla en una consulta y todavía funciona, esto es, posiblemente, una señal de que su base de datos no se normaliza correctamente. Tal vez usted podría combinar sus tablas y añadir una columna adicional con información sobre la agrupación, y utilizar una cláusula WHERE para seleccionar los datos que desea? Que había necesidad de saber más acerca de su modelo para sugerir algo más concreto.

No estoy seguro si esto ayuda a responder a su pregunta en absoluto, pero éstas eran mis pensamientos en la lectura de su pregunta. Espero que puedan utilizar algo de él.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top