如何将变量传递给sqlstatement?

use*_*795 1 iphone cocoa objective-c

const char *sqlStatement = "select rowid from mytable where name = 'mac'";
Run Code Online (Sandbox Code Playgroud)

然后我得到了正确的结果.但如果我这样做: -

NSString *str=@"mac";

const char *sqlStatement = "select rowid from mytable where name = str";
Run Code Online (Sandbox Code Playgroud)

我收到了错误no such column : str.如何将变量传递给sqlstatements?

Pet*_*sey 5

正如您所发现的,仅使用相同的文本作为变量名称和字符串文字的子字符串不会导致变量的内容拼接到字符串中.从理论上讲,编译器可以为你设置它,但它没有这样做,没有明确的格式化字符,这不是我听过的任何语言的特征.即使支持它,您仍然无法将NSString对象拼接成C字符串.

所以,问题是如何将字符串拼接str到查询字符串中.
答案不是 stringWithFormat:!

这使您可以进行SQL注入,在用户从其所在的同一台计算机访问的数据库环境中,这意味着用户可能通过输入错误的内容来破坏其数据.试图通过逃避事情来解决这个问题是一个无休止的游戏,即打击鼹鼠和自我怀疑("我希望这是最后一个错误").

正确的解决方案是让SQLite将参数拼接到查询中,因为它只知道如何.您可以通过在需要拼接值的每个点处准备带有问号的语句,然后将值绑定到语句中来实现.对其中一个绑定函数的每次调用都将以一种安全的方式替换一个未绑定的占位符,即传入的值,即不会创建无效或破坏性的查询语句.