2012-06-10 14 views
8

Wstawiam niektóre dane do tabeli MySQL za pomocą CodeIgniter. Ponieważ używam INSERT IGNORE INTO i nie chcę edytować aktywnej klasy rekordów, aby włączyć tę funkcję, generuję zapytanie SQL ręcznie.Uciekające zapytania SQL w Codeigniter

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

Problem: Zapytanie nie powiodło się, gdy łańcuch w $data['type'] zawierał jeden cytat. W jaki sposób mogę sprawić, że te znaki, które muszą być zmienione, zostaną automatycznie usunięte, na przykład podczas korzystania z Aktywnych rekordów?

Odpowiedz

19

Innym sposobem jest użycie Query Binding, która automatycznie ucieka wszystkie wartości:

$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

Możesz uczynić to jeszcze prostszym: '$ this-> db-> query ($ sql, $ data);' To działa dla mnie! (Domyślam się, że nie powinieneś mieć żadnych innych kluczy w tablicy danych, aby działał) – Saneem

+0

Lub przepisać go na wzór rekordu aktywnego: '$ this-> db-> inset ('some_table', $ data);' znacznie więcej prosto i bardzo łatwo. Upewnij się tylko, że żadne automatyczne pole klucza podstawowego nie czyni go metodą 'insert()', używając 'if (! Isset ($ data ['id'])) wyrzuć nowy {InvalidArgumentException ('dane [id] są niedozwolone dla insertu "); } ' – Roland

7

użyć $ this-> db-> escape(); będzie uciec ciąg automatycznie

Funkcja ta określa rodzaj danych tak, że może uciec tylko ciąg danych. To również automatycznie dodaje pojedyncze cudzysłowy wokół danych więc nie trzeba:

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

Oto odniesienie Click Here

+4

na samym końcu strony, sekcja o wiązanie parametr jest * * wiele lepszym rozwiązaniem;) – d11wtq

+0

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

+0

$ this-> db-> escape() dodaje pojedyncze cudzysłowy, więc nie musimy tego robić, ale w zapytaniu dodałeś je. (Nie wiem, czy jest to różnica wersji czy co Używam wersji 3.1. *) Wcześniej dzisiaj pisałem zapytanie, a następnie stanąłem przed problemem, w którym popełniłem ten błąd. – yaxe