9

在 iOS sqlite 数据库的一些示例代码中,我有一个四行三列的表。

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

Select * from table where column_name=? ;

column_name=?根据示例代码,我有问题:这是什么?意思?

它用于增加行数吗?

4

3 回答 3

7

这 ?是一个真实值的占位符,一个你必须绑定到编译语句的值。此链接详细介绍了绑定。

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

于 2013-05-08T13:00:46.173 回答
3

?代表一个占位符,您将绑定一个值(例如,设置文本值,在语句之后使用,sqlite3_bind_textsqlite3_prepare_v2在使用sqlite3_step.

请参阅sqlite3_bind文档。

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

于 2013-05-08T12:59:42.137 回答
1

“?” 是用来...

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

或者

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

或者

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

于 2013-05-08T12:56:26.170 回答