带问号的Sqlite查询

mzsu5hc0  于 2023-04-30  发布在  SQLite
关注(0)|答案(3)|浏览(162)

我在iOS sqlite数据库的一些示例代码中有一个四行三列的表。
我正在使用查询从表中获取数据

Select * from table where column_name=? ;

根据示例代码,我对column_name=?有问题:?是什么意思
是否用于递增行?

5kgi1eie

5kgi1eie1#

?是真实的值的占位符,该值必须绑定到编译语句。The SQLite doc on Binding Values详细介绍了绑定。
之所以要绑定值而不是将它们放入查询字符串中,是因为它可以防止sql注入攻击如果您使用的是用户直接提供的值,则可能发生这种攻击。

zour9fqk

zour9fqk2#

?表示一个占位符,您将用一个值(例如:例如,要设置文本值,请在sqlite3_prepare_v2语句之后,但在使用sqlite3_step执行之前使用sqlite3_bind_text
参见sqlite3_bind文档。
这是一个非常重要的结构,需要了解和使用,因为你永远不想使用stringWithFormat构建SQL。通过使用sqlite3_bind,您保存编写代码来转义输入中可能包含的任何引号e。例如,你试图插入Joe's Bar and Grill(如果你使用单引号,撇号会弄乱你的SQL)或Dwayne "The Rock" Johnson(如果你使用双引号,引号会弄乱你的SQL)的值。它还可以保护您免受SQL注入攻击。一定要使用sqlite3_bind,而不是手动构建SQL语句。

c9x0cxw0

c9x0cxw03#

“?”用于。..
这通常意味着一个准备好的语句,其中的参数是以后填写的。(参见例如http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements).

在某些语句中,参数在准备语句时是未知的,因为每次执行语句时都可以插入不同的值。在这些陈述句中,你可以使用问号(?)占位符,其中执行语句时必须提供参数。

尽管PreparedStatement对象可用于不带参数的SQL语句,但您可能最常将它们用于带参数的SQL语句。使用带参数的SQL语句的优点是,您可以使用相同的语句,并在每次执行时为其提供不同的值。

相关问题