2013-05-07 59 views
9

我想使用預準備語句來防止SQL SQLite數據庫上的SQL注入。然而,當查詢包含Like並且與Where name = ? 一起使用時,rawquery會崩潰嗎?有沒有辦法在Android SQLite數據庫中使用like和prepared語句?Android SQLite select * from表名%like key%使用預處理語句

這是查詢:

它給出了一個綁定或列索引超出範圍 謝謝。

+0

您可以檢查這在SQL查詢中使用的「Like」 http://stackoverflow.com/questions/5752575/cant-use-like-clause-in-android-app – 2013-05-07 10:38:54

+1

像將與rawquery工作,能你發佈你的代碼和日誌,以便我們可以看到你得到什麼錯誤... – Vamshi 2013-05-07 10:41:26

回答

21
if (name.length() != 0) { 

     name = "%" + name + "%"; 
    } 
    if (email.length() != 0) { 
     email = "%" + email + "%"; 
    } 
    if (Phone.length() != 0) { 
     Phone = "%" + Phone + "%"; 
    } 
    String selectQuery = " select * from tbl_Customer where Customer_Name like '" 
      + name 
      + "' or Customer_Email like '" 
      + email 
      + "' or Customer_Phone like '" 
      + Phone 
      + "' ORDER BY Customer_Id DESC"; 

    Cursor cursor = mDb.rawQuery(selectQuery, null);` 
+0

謝謝,訣竅是通過檢查空字符串。拯救了我的一天。在普通查詢中,空字符串不會導致問題,但是具有準備好的語句,IT部門。 – 2013-05-08 07:29:04

1

嘗試像..

String[] a = new String[5]; 
a[0]  = '%' + criterion + '%'; 
a[1]  = '%' + criterion + '%'; 
a[2]  = '%' + criterion + '%'; 
a[3]  = '%' + criterion + '%'; 
a[4]  = '%' + criterion + '%'; 
Cursor cursor = database.rawQuery(sqlQuery,a); 
+0

我已經嘗試過,仍然是同樣的問題。 android.database.sqlite.SQLiteBindOrColumnIndexOutOfRangeException:綁定或列索引超出範圍:句柄0x1001a58 – 2013-05-07 10:54:07

7

嘗試

Cursor cursor = database.rawQuery(sqlQuery, new String[]{"'%" + criterion + "%'", 
    "'%" + criterion + "%'", 
    "'%" + criterion + "%'", 
    "'%" + criterion + "%'", 
    "'%" + criterion + "%'"}); 

你缺少了 「'」 前後。