如何使用 PHP 运行 PostgreSQL LIKE 查询

How to run PostgreSQL LIKE query with PHP

假设我想运行这样查询:

$q = "SELECT * FROM items WHERE name LIKE ";
$r = pg_query_params($dbconn, $q, array("%" .  $ss . "%"));

如果用户为 $ss 提供了带有 %_ 的字符串,则可能会出现此问题。我如何告诉引擎不要将 $ss 中的 %_ 视为特殊符号?


目前我的方法是

$q = "SELECT * FROM items WHERE name LIKE  ESCAPE '\'";
$r = pg_query_params($dbconn, 
         $q, 
         array("%" . str_replace("%", "\%", str_replace("_", "\_", $ss)) . "%"));

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

第一个建议是避开LIKE。只要做:

SELECT * FROM items WHERE position( in name) > 0;

那就不用担心特殊字符了。

您可以使用 ESCAPE 。 . .但是你需要一些不在字符串中的东西,比如 ~.

SELECT * FROM items WHERE name LIKE  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一个特性,让用户输入通配符,这样他们的搜索能力就更强大了。