2011-01-16 23 views
0

WHEREを使用してデタベースクエリを実装しようとしていますが、実際にそれを実装する方法が不思議です。私がここにあるコードは私にエラーを与える; /thnánkあなた!WHEREを使用したsqlクエリ

 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:なぜ人々は質問にエラーを含まないのですか? –

+0

最後のSQL文が実行前にどのように見えるかを表示 – James

+0

私はwhere-cluaseを一度も使ったことがないので、それは書いたときに完全に間違っていると思ったからです。私は今すぐlogcatを投稿します – Emil

答えて

0

記号がテキストに関連した文字列(例えばVARCHAR)列がある場合は、あなたが最もDBMSで、それを囲む引用符が必要になります。

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); 
} 

GolezTrol者注次@updated

カテゴリ記号が大きいの世界から、ユーザから来た場合は、コードのこの部分は、SQLインジェクションにオープンになり、その場合には、あなたが保護したいと思いますコードに示されているように.Replaceを使って "sign"変数。

+0

はい、あなただけがおそらくクエリの引用符をエスケープしたいでしょう。 'Don't 'を検索している人は、クエリを壊すでしょう。誰かが「ねじれ」を探している。ドロップデータベース。 - はもっと壊れてしまう。 :) – GolezTrol

+0

@GolezTrol - 良い点。私はそれがカテゴリーの兆候のいくつかのシステムリストから来ると予想していましたが、それにもかかわらず保護することをお勧めします。 – RichardTheKiwi

0

エラーをご提供ください。私はあなたがあなたのIDEで、より良い、それをフォーマットすることができていても、これは少しクリーナーだと思う

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); 

:あなたはに切り替えることを試みることができます。

関連する問題