?表示一个占位符,您将用一个值(例如:例如,要设置文本值,请在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语句。
3条答案
按热度按时间5kgi1eie1#
?是真实的值的占位符,该值必须绑定到编译语句。The SQLite doc on Binding Values详细介绍了绑定。
之所以要绑定值而不是将它们放入查询字符串中,是因为它可以防止sql注入攻击如果您使用的是用户直接提供的值,则可能发生这种攻击。
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语句。c9x0cxw03#
“?”用于。..
这通常意味着一个准备好的语句,其中的参数是以后填写的。(参见例如http://en.wikipedia.org/wiki/Prepared_statements#Parameterized_statements).
或
在某些语句中,参数在准备语句时是未知的,因为每次执行语句时都可以插入不同的值。在这些陈述句中,你可以使用问号(?)占位符,其中执行语句时必须提供参数。
或
尽管PreparedStatement对象可用于不带参数的SQL语句,但您可能最常将它们用于带参数的SQL语句。使用带参数的SQL语句的优点是,您可以使用相同的语句,并在每次执行时为其提供不同的值。