java—如何解释“'”符号(分配给变量中的名称),因为它会导致sqlite查询失败

xam8gpfp  于 2021-07-26  发布在  Java
关注(0)|答案(1)|浏览(441)

在我正在构建的应用程序中,我需要访问一个sqlite数据库并运行一个查询,其中我在“where”子句中有一个名称。此名称是随机生成的(来自另一个查询),并分配给一个全局变量。这个变量然后被传递到另一个使用它的查询(在另一个方法中)。有点像这样:

public class DatabaseAccess {

public static String player_name;
Cursor c = null;

public String getPlayerName(String string) {

    c = db.rawQuery("select player_name FROM name_table where level = 1 ORDER BY RANDOM() LIMIT 1", new String[]{});
    StringBuffer buffer = new StringBuffer();
    while (c.moveToNext()) {
        String diff = c.getString(0);
        buffer.append("" + diff);
    }
    player_name = buffer.toString();
    return buffer.toString();
}

public String getClue(String string) {

    c = db.rawQuery("SELECT clue FROM clue_table where player_name = '" + player_name +"'", new String[]{});
    StringBuffer buffer = new StringBuffer();
    while (c.moveToNext()) {
        String diff = c.getString(0);
        buffer.append("" + diff);
    }
    return buffer.toString();
}

问题是数据库中的一些名称具有 ' 其中的符号(例如dara o'briain)。
当出现这样的名称时,我的代码会崩溃并显示错误消息:

Caused by: android.database.sqlite.SQLiteException: near "Briain": syntax error (code 1): , while compiling: select alt_name FROM player_names where player_name = 'Dara O'Briain'

看起来好像是 ' 作为结束字符串的方法,这将导致错误的查询。
如何在代码中解释这些示例?

tjjdgumg

tjjdgumg1#

c = db.rawQuery("SELECT clue FROM clue_table where player_name = '" + 
        player_name +"'", new String[]{});
//               see here ^^^^^^^^^^^^^^

好吧,那是空的 String[] 传递给调用的数组正是参数应该到达的位置。因此,查询应该如下所示:

c = db.rawQuery("SELECT clue FROM clue_table where player_name = ?", new String[]{player_name});

只需在需要插入参数的地方打个问号。它们将按顺序插入,数组中可以有更多这些。
司机会帮你避开任何撇号。如果你不以任何方式逃避用户的输入,你会冒很大的风险。假设玩家的名字来自用户在应用程序中的输入,他们会突发奇想地在搜索框中写道:

' delete from users; --

如果只是将其粘贴到查询中,它现在看起来如下所示:

SELECT clue FROM clue_table where player_name = ''; delete from users; --'

你得到你的数据作为搜索功能的免费奖励。

相关问题