Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 对sqlite数据库进行游标查询时出错_Android_Sqlite - Fatal编程技术网

Android 对sqlite数据库进行游标查询时出错

Android 对sqlite数据库进行游标查询时出错,android,sqlite,Android,Sqlite,我试图从游标中获取列信息,但遇到了一个令人沮丧的错误。我想选择包含$SEARCH的所有列。代码如下: Bundle b = getIntent().getExtras(); SEARCH = b.getString("searchtext"); Cursor c = mDBHelper.getReadableDatabase().query("table", null, "name="+ SEARCH, null, null, null, null); 出于某种

我试图从游标中获取列信息,但遇到了一个令人沮丧的错误。我想选择包含$SEARCH的所有列。代码如下:

Bundle b = getIntent().getExtras();
        SEARCH = b.getString("searchtext");
        Cursor c = mDBHelper.getReadableDatabase().query("table", null, "name="+ SEARCH, null, null, null, null);
出于某种原因,游标正在引发运行时异常。以下是错误:

12-30 03:55:00.357: E/AndroidRuntime(1302): Caused by: android.database.sqlite.SQLiteException: near "CAP": syntax error: , while compiling: SELECT * FROM kroger WHERE name=john
不确定为什么会发生这种情况,我的代码中可能有一个非常简单的错误,但我不确定它是什么。谢谢你的帮助

“name=“+SEARCH
将变成
name=CAP
,这不是有效的SQL表达式。天真的解决方案是将该术语用单引号括起来:

"name='" + SEARCH + "'"
但这会受到SQL注入攻击。使用参数传递工具以无注入方式传递搜索项:

query("table", null, "name=?", new String[] {SEARCH}, null, null, null);
“name=“+SEARCH
将变为
name=CAP
,这不是有效的SQL表达式。天真的解决方案是将该术语用单引号括起来:

"name='" + SEARCH + "'"
但这会受到SQL注入攻击。使用参数传递工具以无注入方式传递搜索项:

query("table", null, "name=?", new String[] {SEARCH}, null, null, null);

为什么第一个建议会受到攻击,而第二个建议不会受到攻击?@barry:假设用户搜索
CAP';升降台--。对于第一个解决方案,这将成为以下SQL:
SELECT*fromtable where name='CAP';放下桌子;——'。对于第二种解决方案,SQL仍然是
SELECT*FROM table WHERE name=?
,而
作为字符串值绑定到伪搜索词,语义上而不是语法上,因此搜索将以良性方式失败。@Marcelocontos感谢这一点,非常有趣。但是第二个版本不会最终产生与第一个版本相同的sql吗?@barry:不会。变量绑定是在sql被解析后应用的。
是一个值的占位符,而不是SQL的块。@barry:它是一个内部表示形式,每个引擎都不同。一些系统(例如SQL Server)转换为AST,其他系统(我认为是Oracle)直接转换为执行树。我不知道SQLite是做什么的,但我怀疑它采用了一条相对直接的路径来生成适合其内部VM的p代码。关键是,当绑定应用时,原始的SQL语法早已消失,因此谈论绑定变量后查询结果是什么毫无意义。为什么第一个建议会受到攻击而第二个建议不会受到攻击?@barry:假设用户搜索
CAP';升降台--。对于第一个解决方案,这将成为以下SQL:
SELECT*fromtable where name='CAP';放下桌子;——'。对于第二种解决方案,SQL仍然是
SELECT*FROM table WHERE name=?
,而
作为字符串值绑定到伪搜索词,语义上而不是语法上,因此搜索将以良性方式失败。@Marcelocontos感谢这一点,非常有趣。但是第二个版本不会最终产生与第一个版本相同的sql吗?@barry:不会。变量绑定是在sql被解析后应用的。
是一个值的占位符,而不是SQL的块。@barry:它是一个内部表示形式,每个引擎都不同。一些系统(例如SQL Server)转换为AST,其他系统(我认为是Oracle)直接转换为执行树。我不知道SQLite是做什么的,但我怀疑它采用了一条相对直接的路径来生成适合其内部VM的p代码。关键是,当绑定被应用时,原始的SQL语法早已消失,因此讨论绑定变量后查询的最终外观是什么毫无意义的。