2012-05-03 29 views
5

Estoy usando codeigniter y la mayoría de las veces uso el registro activo para mis consultas (que automáticamente se les escapa), pero esta consulta no parece encajar perfectamente en ella debido a la variable. Así que tengo que averiguar cómo escapar de la consulta de forma manual.SQL query escaping + codeigniter

documentos sugieren CodeIgniter escapar de las consultas de esta manera:

$sql = "INSERT INTO table (title) VALUES(".$this->db->escape($title).")"; 

Mi búsqueda original

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}'"; 

Mi escapó consulta

$sql = "SELECT * FROM (`user_language`) WHERE `user_id` = '{$id}' VALUES(".$this->db->escape($user_language).")"; 

pero estoy teniendo problemas getti ng la sintaxis derecha. Los mensajes de error son los siguientes: mensaje de error

  • PHP: Undefined variable: USER_LANGUAGE
  • SQL error: sintaxis mal ... cerca de los 'valores (null)' en la línea 1
+0

¿Desea insertar o seleccionar algo con su consulta? – Hajo

+0

SELECCIONAR. El INSERT es de los documentos de Codeigniter. – chowwy

+0

actualizó mi respuesta, espero que funcione para usted:] – Hajo

Respuesta

12
$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . $this->db->escape($id); 

si desea seleccionar el idioma del usuario dado por $ id, debería funcionar de esa manera.

tratar con números alternativa sería:

$sql = "SELECT * FROM `user_language` WHERE `user_id` = " . (int)$id; 

CodeIgniter también soporta declaraciones preparadas como "Enlaces de consulta":

The secondary benefit of using binds is that the values are automatically escaped, producing safer queries. You don't have to remember to manually escape data; the engine does it automatically for you.

+0

Gracias; ¡funciona! Acepté y voté tu respuesta. Pregunta al margen: ¿Hay alguna manera de que pueda confirmar que la consulta se ha escapado? Tengo algunas otras consultas para escapar y quiero verificarlas después. – chowwy

+0

Gracias por la actualización. Eso es útil. – chowwy

+0

bueno, estoy usando declaraciones preparadas y no escapo por años. No sé si codeigniter los admite: http://php.net/manual/en/pdo.prepared-statements.php – Hajo

4

Estoy confundido por qué usted dice que no puede utilizar el Clase de registro activo con CI, esta es una llamada SQL simple (el ejemplo siguiente usa method chaining):

$this->db->select('*')->from('user_language')->where('user_id', $id); 
$query = $this->db->get(); 

Su $id se escapó correctamente y mitiga cualquier inyección. Personalmente utilizo AR siempre que sea posible, me permite escribir códigos rápidos y eficientes, y no preocuparme por las cosas malas con las llamadas SQL (consultas personalizadas).

+0

De acuerdo, esto es una votación ascendente. No es que no pudiera, pero no había oído hablar del método de encadenamiento. No sabía cómo indicar la variable en la cláusula where. Muy apreciado. – chowwy

+0

@chowwy, todo está en la [Guía del usuario] (http://codeigniter.com/user_guide/database/index.html), es muy completo con buenos ejemplos – Jakub

+0

Sí, lo uso como referencia. Gracias de nuevo. – chowwy