需要对我的SQLite查询进行健全性检查?

时间:2011-05-10 10:10:17

标签: iphone sqlite variables join

简单的iPhone应用程序,根据用户选择的优惠券类别向用户显示优惠券列表。

我还没有对此进行测试,因为即使构建了界面,我还有很长的路要走 - 我只是想在我最终追逐一些疯狂的错误之前在这里检查我的方法。

- (BBSelectedCoupons *)BBSelectedCoupons:(char)SelectedCategory {
   BBCouponDetails *retval = nil;
   NSString *query = [NSString stringWithFormat:@"SELECT id, MerchantName, ShortDeal 
   FROM coupons JOIN SelectedCategory ON coupons.CouponID=SelectedCategory.CouponID 
   ORDER BY id ASC WHERE SelectedCategory=%d", SelectedCategory];

我的问题如下:

1)在第1行,我可以像我一样使用(字符)吗?我见过的例子只使用(int)。

2)在第4行和第5行,我使用术语“SelectedCategory”两次 - 一次在JOIN之后立即引用表,第二次引用第二个表作为测试的一部分。然后,在WHERE之后,我只定义了一次“SelectedCategory” - 是否会起作用?我打算根据用户点击的按钮定义“SelectedCategory”。

3)在第5行,“%d”是否会与“string”变量一起玩得很好?或者应该是“$ d”还是“@d”?

感谢任何可以看一眼并给我一个“看起来不错”或“你很糟糕”的人。

如果我吮吸,我会非常感谢您能阅读的链接!

1 个答案:

答案 0 :(得分:0)

  1. 当然,为什么不呢?
  2. 您可以使用短名称消除歧义。使用较短的示例:select * from table t where t.col1 = 5;
  3. %d实际上是指整数,因此您可能会得到奇怪的结果。我不打算查找char的正确格式,因为我认为这不是一个好方法。你应该真的使用绑定参数。要执行此操作,请使用当前具有%d的问号定义查询。然后,在执行查询之前,您sqlite3_bind_int要“填充”该字段。这样可以避免在使用字符串字段时出现SQL注入漏洞并具有一些性能优势(因为您可以提前做好所有准备工作)。