2012-06-10 12 views
8

Sto inserendo alcuni dati in una tabella MySQL utilizzando CodeIgniter. Poiché sto usando INSERT IGNORE INTO e non voglio modificare la classe di record attiva per abilitare questa funzione, sto generando manualmente la query SQL.Escaping query SQL in Codeigniter

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

Problema: La query fallito quando la stringa in $data['type'] conteneva una sola offerta. Come posso fare in modo che questi caratteri che devono essere sfuggiti vengano scappati automaticamente, come quando si usano i record attivi?

risposta

19

Un altro modo è quello di utilizzare Query Binding che sfugge automaticamente tutti i valori:

$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

È possibile semplificare ulteriormente la procedura: '$ this-> db-> query ($ sql, $ data);' Questo funziona per me! (Immagino che non dovresti avere altre chiavi nell'array di dati perché funzioni) – Saneem

+0

Oppure riscrivilo su Active Record Pattern: '$ this-> db-> inset ('some_table', $ data);' molto di più dritto in avanti e molto facile. Assicurati solo che nessun campo della chiave primaria di auto-incremento lo faccia nel metodo 'insert()' usando 'if (! Isset ($ data ['id'])) getti nuovo {InvalidArgumentException ('data [id] non è permesso per l'inserto '); } ' – Roland

7

utilizzare $ this-> db-> escape(); sarà sfuggire la stringa automaticamente

Questa funzione determina il tipo di dati in modo che possa fuoriuscire solo dati stringa. Inoltre aggiunge automaticamente le virgolette singole intorno ai dati di quindi non c'è bisogno di:

$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']) . "')"); 

Ecco il riferimento Click Here

+4

alla fine della pagina, la sezione relativa associazione parametro è un * molto * opzione migliore;) – d11wtq

+0

collegamento aggiornato: https://www.codeigniter.com/userguide2/d atabase/query.html –

+0

$ this-> db-> escape() aggiunge le virgolette singole quindi non è necessario, tuttavia nella query le hai aggiunte. (Non so se è la differenza di versione o cosa , Sto usando 3.1. *) In precedenza oggi stavo scrivendo una domanda e poi ho affrontato un problema in cui avevo commesso questo errore. – yaxe