2011-12-30 5 views
0

Я пытаюсь получить информацию о столбце с помощью курсора и получить разочаровывающую ошибку. Я хочу выделить все столбцы, содержащие $ SEARCH. Вот код:Ошибка в запросе курсора в базе данных sqlite

Bundle b = getIntent().getExtras(); 
     SEARCH = b.getString("searchtext"); 
     Cursor c = mDBHelper.getReadableDatabase().query("table", null, "name="+ SEARCH, null, null, null, null); 

По какой-то причине курсор бросает исключение во время выполнения. здесь ошибка:

12-30 03:55:00.357: E/AndroidRuntime(1302): Caused by: android.database.sqlite.SQLiteException: near "CAP": syntax error: , while compiling: SELECT * FROM kroger WHERE name=john 

Не знаю, почему это происходит, то, вероятно, очень простая ошибка в моем коде, но я не уверен, что это такое. Спасибо за вашу помощь!

ответ

3

"name="+SEARCH будет name=CAP, что не является допустимым выражением SQL. Наивное решение, чтобы обернуть этот термин в одинарных кавычках:

"name='" + SEARCH + "'" 

Но это подвергается атакам SQL-инъекции. Используйте средства для передачи аргументов для прохождения поискового термина без инъекций:

query("table", null, "name=?", new String[] {SEARCH}, null, null, null); 
+0

отличное объяснение, спасибо! – benbeel

+0

Почему первое предложение подвержено атаке, а не второе? – barry

+1

@barry: скажите, что пользователь ищет 'CAP '; Таблица DROP TABLE; --'. С первым решением это станет следующим SQL: 'SELECT * FROM table, где name = 'CAP'; Таблица DROP TABLE; - ''. Во втором решении SQL остается 'SELECT * FROM table WHERE name =?', А '?' Привязан к фиктивному поисковому термину как строковое значение, семантически, а не синтаксически, поэтому поиск будет неудачным. –

Смежные вопросы