2012-06-10 54 views
8

Estoy insertando algunos datos en una tabla MySQL usando CodeIgniter. Debido a que estoy usando INSERT IGNORE INTO y no quiero editar la clase de registros activos para habilitar esta característica, estoy generando la consulta SQL manualmente.Escapar consultas SQL en Codeigniter

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) 
         VALUES ('" . $data['lat'] . "', '" . $data['lng'] . "', '" . $data['date'] . "', '" . $data['type'] . "')"); 

Problema: La consulta falló cuando la cadena en $data['type'] contenía una comilla simple. ¿Cómo puedo hacer que estos caracteres que necesitan ser escapados se escapen automáticamente, como cuando se usan registros activos?

Respuesta

19

Otra forma es utilizar la consulta de unión que se escapa de forma automática todos los valores:

$sql = "INSERT IGNORE INTO my_table(lat, lng, date, type) VALUES (?,?,?,?);"; 
$this->db->query($sql, array($data['lat'], $data['lng'], $data['date'], $data['type'])); 
+2

Puede hacer esto aún más simple: '$ this-> db-> query ($ sql, $ data);' ¡Esto funciona para mí! (Supongo que no deberías tener ninguna otra clave en la matriz de datos para que funcione) – Saneem

+0

O rescríbete a Patrón de registro activo: '$ this-> db-> inset ('some_table', $ data);' mucho más sencillo y muy fácil. Solo asegúrese de que ningún campo de clave principal de autoincremento lo convierte en el método 'insert()' usando 'if (! Isset ($ data ['id'])) throw new {InvalidArgumentException ('data [id] no está permitido) para insertar '); } ' – Roland

7

use $ this-> db-> escape(); va a escapar de la cadena de forma automática

Esta función determina el tipo de datos para que pueda escapar sólo datos de cadena. También agrega automáticamente comillas simples alrededor de los datos por lo que no tienen que:

$this->db->query("INSERT IGNORE INTO my_table(lat, lng, date, type) 
VALUES ('" . $this->db->escape($data['lat']) . "', '" . $this->db->escape($data['lng']) . "', '" . $this->db->escape($data['date']$this->db->escape . "', '" . $this->db->escape($data['type']) . "')"); 

su referencia es Click Here

+4

al final de la página, la sección sobre el enlace de parámetros es un * mucho * mejor opción;) – d11wtq

+0

enlace de actualización: https://www.codeigniter.com/userguide2/d atabase/queries.html –

+0

$ this-> db-> escape() agrega las comillas simples para que no tengamos que hacerlo, pero en su consulta las ha agregado. (No sé si es la diferencia de versión o qué , Estoy usando 3.1. *) Hoy estaba escribiendo una consulta y luego me enfrenté a un problema donde había cometido este error. – yaxe