我对SQLite
查询有疑问。我在iOS sqlite数据库的一些示例代码中有一个包含四行三列的表。
我正在使用查询从表中获取数据: -
Select * from table where column_name=? ;
根据示例代码我对column_name=?
有疑问。?的含义是什么..
用于递增行吗?
答案 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语句的优点是,您可以使用相同的语句,并在每次执行时为其提供不同的值。