如何使用PHP运行PostgreSQL LIKE查询

时间:2017-02-26 14:35:25

标签: php postgresql escaping sql-like

假设我想运行这样的查询:

$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)) . "%"));

但是,如果转义字符(\)是字符串中的最后一个,那么附加的%也会被转义。

1 个答案:

答案 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 功能,让用户输入通配符,因为它们具有更强大的搜索功能。