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
控制字符。
- postgresql,奇怪的OFFSET / LIMIT行为(记录顺序)
- 如何将数据从ASCII(ISO / IEC 8859-1)导入到我的Rails / PGSQL数据库?
- Ruby on Rails / PostgreSQL – 启动server-libq.5.dylib时出现Library not Loaded错误
- 如何将PostgreSQL / bin目录放在Windows的路径中?
- 存储星期几和时间?
- 正确的全文索引Rails / PostgreSQL / pg_search
- 时间戳无法保存 – postgresql
- Rails:rake db:create:all(无法连接到服务器)
- 具有正确的Rails命名和约定的“PG :: UndefinedTable:ERROR:relation不存在”