2009-08-13 14 views
12

Zajmuję się tworzeniem aplikacji w środowisku AIR za pośrednictwem Flex, ale nie widzę, gdzie idę źle z SQLite (jestem przyzwyczajony do MySQL). Parametry działają, ale tylko w niektórych przypadkach. Czy ta część wbudowanego systemu sanitarnego działa przeciwko wtryskowi sql? Dzięki za pomoc!Parametry SQLite - Nie zezwalanie na nazwę tabeli jako parametr

Works:

SQLite

"INSERT: Pola z kategorii", gdzie parametrem jest: Pola = "*"

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM Category"; 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Do esn't pracy (błąd składni SQL w ": Tabela")

SQLite

"WSTAW: pól z: Tabela", gdzie parametry: pola = "*" i: Tabela = „Kategoria”

AS3

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = "INSERT :Fields FROM :Table"; 
statement.parameters[":Fields"] = "*"; 
statement.parameters[":Table"] = "Category"; 
statement.execute; 

Odpowiedz

30

Generalnie nie można używać parametrów SQL/zastępcze dla identyfikatorów baz (tabele, kolumny, widoki, schematów itp.) lub funkcje bazy danych (np. CURRENT_DATE), ale zamiast tego tylko w przypadku wiążących wartości literalnych wartości.

Dzięki obsłudze po stronie serwera dla sparametryzowanych (przygotowanych) instrukcji, silnik DB analizuje zapytanie raz, pamiętając o parametrach dowolnych parametrów - ich typach, maksymalnych długościach, dokładnościach itp. - które zostaną powiązane w kolejnych wykonaniach już przeanalizowanego zapytania. Jednak zapytanie nie może zostać poprawnie przetworzone na elementy syntaktyczne, jeśli bity krytyczne, takie jak obiekty bazy danych, są nieznane.

Tak więc, na ogół trzeba podstawiać nazwy tabel sobie, w procedurze przechowywanej lub w kodzie klienta, który dynamicznie konkluduje/interpoluje/wykaże, że instrukcja SQL zostanie poprawnie wykonana. W każdym razie pamiętaj, aby użyć funkcji SQL API dla , podając identyfikatory bazy danych, ponieważ API tego nie zrobi.

+1

Twój pierwszy akapit mówi wszystko. – Lucky

-1

Nie wiem, czy to jest to samo, ale natknąłem się na coś podobnego w Javie. Zasadniczo nie można dodać tablicę jako parametr, więc trzeba wygenerować oświadczenie tak:

var statement:SQLStatement = new SQLStatement(); 
statement.connection = connection; 
statement.text = stringUtil.substitute("INSERT :Fields FROM {0}", "Category"); 
statement.parameters[":Fields"] = "*"; 
statement.execute; 

Jest to głównie prawdopodobnie nie najbezpieczniejszym rozwiązaniem, więc może chcesz jakiejś niestandardowej walidacji danych przed dodaniem nazwa tabeli .. więc ktoś nie próbuje wysłać mu nazwę tabela „; upuść tableName ...”