带问号的Sqlite查询

时间:2013-05-08 12:37:30

标签: ios database sqlite

我对SQLite查询有疑问。我在iOS sqlite数据库的一些示例代码中有一个包含四行三列的表。

我正在使用查询从表中获取数据: -

Select * from table where column_name=? ;

根据示例代码我对column_name=?有疑问。的含义是什么..

用于递增行吗?

3 个答案:

答案 0 :(得分:5)

?是实际值的占位符,必须绑定到已编译语句的值。这个link详细介绍了绑定。

绑定值而不是将它们放在查询字符串中的原因是因为它可以防止sql注入攻击 - 如果您使用的是直接从用户提供的值,则可能会发生这种情况。

答案 1 :(得分:2)

?表示您将与值绑定的占位符(例如,设置文本值,在sqlite3_bind_text语句之后使用sqlite3_prepare_v2,但在执行之前sqlite3_step

请参阅sqlite3_bind文档。

这是一个非常重要的知识和使用构造,因为您永远不想使用stringWithFormat构建SQL。通过使用sqlite3_bind,您可以避免编写代码以逃避输入中可能包含的任何引号,例如你试图插入Joe's Bar and Grill的值(如果你使用单引号,撇号会弄乱你的SQL)或Dwayne "The Rock" Johnson(如果你是的话引号会弄乱你的SQL)使用双引号)。它还可以保护您免受SQL注入攻击。绝对使用sqlite3_bind而不是手动构建SQL语句。

答案 2 :(得分:1)

我希望它可以帮助你......“?”标记用于....

这通常意味着准备好的语句,其中的参数将在以后填写。  (参见例如http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements)。

OR

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

OR

虽然PreparedStatement对象可用于没有参数的SQL语句,但您最常使用它们来获取带参数的SQL语句。使用带参数的SQL语句的优点是,您可以使用相同的语句,并在每次执行时为其提供不同的值。