SQLite参数 - 不允许tablename作为参数

use*_*046 12 apache-flex air sqlite

我正在通过Flex在AIR中开发一个应用程序,但我没有看到我在哪里遇到SQLite(我已经习惯了MySQL).参数有效,但仅限于某些情况.这部分是针对sql注入的内置卫生系统吗?谢谢你的帮助!

作品:

源码

"INSERT:Fields FROM Category",其中参数为:Fields ="*"

AS3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM Category";
statement.parameters[":Fields"] = "*";
statement.execute;
Run Code Online (Sandbox Code Playgroud)

不起作用(":"表中的SQL语法错误):

源码

"INSERT:Fields FROM:Table",其中参数为:Fields ="*"和:Table ="Category"

AS3

var statement:SQLStatement = new SQLStatement();
statement.connection = connection;
statement.text = "INSERT :Fields FROM :Table";
statement.parameters[":Fields"] = "*";
statement.parameters[":Table"] = "Category";
statement.execute;
Run Code Online (Sandbox Code Playgroud)

pil*_*row 33

通常,不能将SQL参数/占位符用于数据库标识符(表,列,视图,模式等)或数据库函数(例如CURRENT_DATE),而是仅用于绑定文字.

通过服务器端支持参数化(又称准备)语句,数据库引擎会解析您的查询一次,记住任何参数的特征 - 它们的类型,最大长度,精度等 - 您将在后续执行中绑定已解析的查询.但是,如果关键位(如数据库对象)未知,则无法将查询正确地解析为其语法元素.

因此,通常必须在存储过程或客户端代码中自己替换表名,动态地连接/插入/淡化要正确执行的SQL语句.在任何情况下,请记住使用SQL API的函数来引用数据库标识符,因为API不会为您执行此操作.