Postgres查询ILIKE和“%#{}%”

我可以向我解释一下“?” 防止SQL注入?

Candy.where("taste ILIKE ?", "%#{term}%") 

另外,为什么使用“%{term}%”而不是#{term}? 百分比代表什么?

百分比是外卡字符,匹配值的任何部分中的字符串

你实际上已经问了两个不同的问题。

它们都没有与Rails特别相关,所以我将一般地回答它们(也因为我不熟悉Ruby!)。

怎么用’?’ 防止SQL注入

当您使用程序外部提供的值(用户提供的值)直接在SQL语句中进行SQL注入时。 例如,假设您有这个伪代码:

 sql="SELECT foo FROM bar WHERE name='"+name+"'" 

其中, name可能是包含用户输入数据的变量。 但是,如果name包含单引号(’),则SQL引擎会认为单引号是值的结尾,并继续将变量的其余部分解析为SQL文本。

使用占位符(例如’?’)可以避免这种情况,因为占位符内的值不需要引用 – 占位符的所有内容都被视为值的一部分,它们都不会被解析为SQL,无论它是什么任何嵌入式报价。

顺便提一下,所使用的占位符的实际forms在某种程度上取决于所使用的实际DB引擎和/或客户端框架。 本地, Postgresql使用$1$2等占位符 。 许多框架将此扩展为允许’?’ 和其他占位符语法。

为什么使用“%#{term}%”而不是#{term}

SQL ILIKE运算符使用’%’符号作为通配符。 表达式如:

 taste ILIKE '%apple%' 

将使用不区分大小写的匹配匹配’apple’,’rottenApple’,’applesauce’或包含’apple’的任何其他字符串。

请注意,’%’符号是引号内ILIKE右手操作数的一部分,因此您不能使用如下占位符:

 Candy.where("taste ILIKE %?%", "#{term}") 

另一种选择是:

 Candy.where("taste ILIKE '%' || ? || '%'", "#{term}") 

这是因为|| 是连接运算符,因此它将字面值%与占位符的值连接,然后连接尾随的字面值%

你用的时候? Rails将自行转义SQL控制字符。