2011-01-16 13 views
0

Ich versuche, eine Datenbankabfrage mit WHERE zu implementieren, und frage mich wirklich, wie man es implementieren? der Code, den ich hier habe, gibt mir einen Fehler;/thnánk du!SQL-Abfrage mit WHERE

 public Cursor fetchAllCatagoryForSign(String sign) { 
     String signSelect=""; 
     if(sign!=null){ 
      signSelect=" WHERE " + CATAGORY_SIGN + "=" + sign; 
     } 
     return mDb.rawQuery("SELECT " + CATAGORY_ID + "," + 
       " " + CATAGORY_NAME + "," + 
       " " + CATAGORY_SIGN + " FROM " 
       + CATAGORY_TABLE + signSelect + 
       " ORDER BY " + CATAGORY_NAME + " DESC", null); 
    } 
+8

FFS: Warum fügen Leute den Fehler nie in ihre Fragen ein? –

+0

Und zeigen Sie, wie die endgültige SQL-Anweisung aussieht, bevor Sie – James

+0

ausgeführt haben. Ich habe das nicht getan, weil ich nie eine Wo-Schlupfstelle verwendet habe. Ich werde jetzt logcat – Emil

Antwort

0

Wenn Zeichen eine Zeichenfolge in einem textuellen (z varchar) Spalte verwendet ist, Sie würden in den meisten DBMS um es Anführungszeichen müssen.

public Cursor fetchAllCatagoryForSign(String sign) { 
    String signSelect=""; 
    if(sign!=null){ 
     signSelect=" WHERE " + CATAGORY_SIGN + "='" + sign.Replace("'","''") + "'"; 
    } 
    return mDb.rawQuery("SELECT " + CATAGORY_ID + "," + 
      " " + CATAGORY_NAME + "," + 
      " " + CATAGORY_SIGN + " FROM " 
      + CATAGORY_TABLE + signSelect + 
      " ORDER BY " + CATAGORY_NAME + " DESC", null); 
} 

@updated folgende GolezTrol Anmerkung

Wenn Kategorie Zeichen von einem Benutzer aus der Welt im Allgemeinen kommen, würden diese Teile des Codes zu SQL-Injection offen sein, in welchem ​​Fall würden Sie die schützen wollen "sign" Variable mit .Replace wie im Code gezeigt.

+0

Ja, nur Sie werden wahrscheinlich auch Zitate in der Abfrage zu entkommen. Jemand, der nach "Don't" sucht, wird die Abfrage unterbrechen. Jemand sucht nach "verschraubt"; Drop-Datenbank; - "wird viel mehr brechen. :) – GolezTrol

+0

@GolezTrol - guter Punkt. Ich hatte erwartet, dass es aus einer Systemliste von Kategorienzeichen stammt, aber trotzdem besser zu schützen ist. – RichardTheKiwi

0

Bitte geben Sie Ihren Fehler an. Sie könnten versuchen, wechseln:

String.format(" WHERE %s = '%s'", CATEGORY_SIGN, sign); 

String.format("SELECT %s, %s, %s, %s FROM %s %s ORDER BY %s DESC, null, CATEGORY_ID, CATEGORY_NAME, CATEGORY_SIGN, CATEGORY_TABLE, signSelect, CATEGORY_NAME); 

Ich denke, das ist ein bisschen sauberer ist, auch wenn Sie es besser in der IDE-Format könnte.