【问题标题】:How to run PostgreSQL LIKE query with PHP如何使用 PHP 运行 PostgreSQL LIKE 查询
【发布时间】:2017-02-26 14:35:25
【问题描述】:

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

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

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

【问题讨论】:

    标签: php postgresql escaping sql-like


    【解决方案1】:

    第一个建议是避开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一个功能,让用户输入通配符,因为这样他们就有了更强大的搜索能力。

    【讨论】:

    • 任何字符都可以在字符串中的任何位置,这是我关心的问题之一
    • @Yola 。 . .我修改了答案。但是再三考虑,请参阅第一个解决方案。 LIKE 不是您想要执行的操作的正确运算符。
    • 太棒了!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-21
    • 2021-02-20
    • 2014-10-02
    • 2012-11-19
    • 1970-01-01
    • 1970-01-01
    • 2016-10-30
    相关资源
    最近更新 更多