2012-06-10 7 views
8

Ich füge einige Daten in eine MySQL-Tabelle mit CodeIgniter. Da ich INSERT IGNORE INTO verwende und die Klasse der aktiven Datensätze nicht bearbeiten möchte, um diese Funktion zu aktivieren, erzeuge ich die SQL-Abfrage manuell.Escaping SQL-Abfragen in Codeigniter

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

Problem: Die Abfrage ist fehlgeschlagen, wenn die Zeichenfolge in $data['type'] einen Apostroph enthalten. Wie kann ich es so machen, dass diese Zeichen, die maskiert werden müssen, automatisch entkernt werden, wie bei Verwendung von Active records?

Antwort

19

Eine weitere Möglichkeit, Abfragebindung zu verwenden ist, das alle Werte automatisch entkommt:

$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

Sie können dies noch einfacher machen: '$ this-> db-> query ($ sql, $ data);' Das funktioniert für mich! (Ich denke, Sie sollten keine anderen Schlüssel im Daten-Array haben, damit es funktioniert) – Saneem

+0

Oder schreiben Sie es in Active Record Pattern um: $ $ this-> db-> Einfügung ('some_table', $ data); 'viel mehr geradlinig und sehr einfach. Stellen Sie nur sicher, dass kein primäres Primärschlüsselfeld in die 'insert()' Methode über 'if (! Isset ($ data ['id'])) springt. New {InvalidArgumentException ('data [id] ist nicht erlaubt für einfügen '); } ' – Roland

7

Verwendung $ this-> db-> escape(); es wird die Zeichenfolge automatisch

Diese Funktion entkommen bestimmt den Datentyp, so dass es nur String-Daten entweichen kann. Es fügt auch automatisch einfache Anführungszeichen um die Daten so müssen Sie nicht auf:

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

Hier ist die Referenz Click Here

+4

ganz am Ende der Seite, ist der Abschnitt über Parameterbindung a * viel * bessere Option;) – d11wtq

+0

aktualisierte Link: https://www.codeigniter.com/userguide2/d atabase/queries.html –

+0

$ this-> db-> escape() fügt die einfachen Anführungszeichen hinzu, so dass wir sie nicht haben müssen, aber in Ihrer Abfrage haben Sie sie hinzugefügt. (Ich weiß nicht, ob es den Versionsunterschied oder was ist , Ich benutze 3.1. *) Früher habe ich eine Anfrage geschrieben und dann bin ich auf ein Problem gestoßen, bei dem ich diesen Fehler gemacht habe. – yaxe