2013-05-08 8 views
6

Mam wątpliwości w zapytaniu SQLite. Mam tabelę z czterema wierszami i trzema kolumnami w jakimś przykładowym kodzie bazy danych sqlite systemu iOS.Zapytanie sqlite ze znakiem zapytania

i jestem pobierania danych z tabeli z zapytaniem: -

Select * from table where column_name=? ; 

Mam problem z column_name=? według przykładowego kodu ..what Czy ? oznacza ..

służy do zwiększania liczby wierszy?

+0

wpisz tutaj swoją nazwę kolumny –

+0

? - symbol zastępczy dla rzeczywistej wartości – Eugene

+0

, ale gdzie uzyska prawdziwą wartość? bcz nie używamy jak "% @" w ciągu, aby przekazać prawdziwą wartość – user2353519

Odpowiedz

5

? jest symbolem zastępczym dla wartości rzeczywistej, wartości, którą musisz powiązać ze skompilowanym wyciągiem. Ten link idzie w szczegóły dotyczące wiązania.

Powodem wiązania wartości, a nie umieszczania ich w łańcuchu zapytań, jest to, że chroni przed atakami typu sql injection - co może się zdarzyć, jeśli używasz wartości podanych bezpośrednio od użytkownika.

1

Mam nadzieję, że może ci pomóc ... "?" znak używany dla ....

Zwykle oznacza to przygotowane oświadczenie, w którym parametry są wypełniane później. (patrz np. http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements).

LUB

W niektórych stwierdzeń, parametry nie są znane, gdy oświadczenie jest przygotowany, ponieważ inna wartość może być włożona każdym razem, gdy oświadczenie jest wykonywany. W instrukcjach tych można użyć znaku zastępczego znaku zapytania (?), W którym należy podać parametr podczas wykonywania instrukcji.

LUB

Chociaż obiektów PreparedStatement może być stosowany do SQL bez parametrów, prawdopodobnie wykorzystać je najczęściej do SQL, które mają parametry. Zaletą korzystania z instrukcji SQL, które pobierają parametry, jest to, że można użyć tej samej instrukcji i podać jej różne wartości przy każdym jej uruchomieniu.

2

? reprezentuje zastępczy że będziesz wiązania o wartości (na przykład ustawić wartość tekstową, należy sqlite3_bind_text po ciebie sqlite3_prepare_v2 z oświadczeniem, ale przed wykonaniem go sqlite3_step.

Zobacz sqlite3_bind dokumentacji.

Jest to bardzo ważna konstrukcja do poznania i użycia, ponieważ nigdy nie chcesz budować swojego SQL za pomocą stringWithFormat. Używając sqlite3_bind, nie musisz pisać kodu, który ucieka od jakichkolwiek cudzysłowów, które możesz mieć na wejściu, np. próbujesz wstawić wartości o f Joe's Bar and Grill (gdzie apostrof zepsuje twój SQL, jeśli używasz pojedynczych cudzysłowów) lub Dwayne "The Rock" Johnson (gdzie cytaty zepsują twój SQL, jeśli używasz podwójnego cudzysłowu). Chroni także przed atakami typu SQL injection. Zdecydowanie użyj sqlite3_bind zamiast ręcznie budować instrukcje SQL.

+1

hej dziękuję, mam to :) – user2353519