如何使用 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
一个特性,让用户输入通配符,这样他们的搜索能力就更强大了。
假设我想运行这样查询:
$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
一个特性,让用户输入通配符,这样他们的搜索能力就更强大了。