假设我想运行这样的查询:
$q = "SELECT * FROM items WHERE name LIKE $1";
$r = pg_query_params($dbconn, $q, array("%" . $ss . "%"));
如果用户为%
提供了_
或$ss
字符串,则可能会出现此问题。如何告诉引擎不要将%
中的_
和$ss
视为特殊符号?
现在我的方法是
$q = "SELECT * FROM items WHERE name LIKE $1 ESCAPE '\'";
$r = pg_query_params($dbconn,
$q,
array("%" . str_replace("%", "\%", str_replace("_", "\_", $ss)) . "%"));
但是,如果转义字符(\
)是字符串中的最后一个,那么附加的%
也会被转义。
答案 0 :(得分:3)
第一个建议是避免LIKE
。只是做:
SELECT * FROM items WHERE position($1 in name) > 0;
然后你不必担心特殊字符。
您可以使用ESCAPE
。 。 。但是你需要一些不在字符串中的东西,比如~
。
SELECT * FROM items WHERE name LIKE $1 ESCAPE '~'
然后绑定参数时:
$r = pg_query_params($dbconn, $q,
array("%" . str_replace(str_replace($ss, "_", "~_"), "%", "~%") . "%"));
你可以通过加倍来逃避逃脱角色。那只是另一个str_replace()
:
$r = pg_query_params($dbconn, $q,
array("%" . str_replace(str_replace(str_replace($ss, "~", "~~"), "_", "~_"), "%", "~%") . "%"));
或者,使用LIKE
功能,让用户输入通配符,因为它们具有更强大的搜索功能。