【问题标题】:sql query with WHERE带有 WHERE 的 sql 查询
【发布时间】:2011-01-16 22:29:40
【问题描述】:

我正在尝试使用 WHERE 实现一个 detabase 查询,并且真的只是想知道如何实现它?我这里的代码给了我一个错误;/谢谢!

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

【问题讨论】:

  • FFS:为什么人们从不在他们的问题中包含错误?
  • 并展示最终的SQL语句在执行前的样子
  • 我没有,因为我从未使用过 where-cluase,所以我认为这只是我在编写它时完全错误。我现在将发布 logcat

标签: android sql database where


【解决方案1】:

请提供您的错误。您可以尝试切换到:

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

我认为这更简洁一些,尽管您可以在 IDE 中更好地对其进行格式化。

【讨论】:

    【解决方案2】:

    如果 sign 是与 TEXTual(例如 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 的注释后更新

    如果类别符号来自世界各地的用户,那么这段代码将对 SQL 注入开放,在这种情况下,您需要使用 .Replace 来保护“符号”变量,如代码所示。

    【讨论】:

    • 是的,只有您可能也想在查询中转义引号。搜索Don't 的人会中断查询。搜索screwed'; drop database; -- 的人会破坏更多。 :)
    • @GolezTrol - 好点。我期待它来自某些类别标志的系统列表,但更好地保护。
    猜你喜欢
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    • 2012-01-28
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多