【问题标题】:Search entries containing particular text using prepared statement使用准备好的语句搜索包含特定文本的条目
【发布时间】:2016-05-20 15:43:08
【问题描述】:

如果我有一个包含文本的表格

create table my_table(
    id integer primary key,
    para text
);

我想选择包含特定字段的所有条目

SELECT * FROM my_table WHERE text LIKE '%searchtext%';

所以它会给我所有包含“searchtext”的字段。 postgresql 中是否有类似 contain(...) 的聚合函数/过程来做同样的事情。

SELECT * FROM my_table WHERE contains(text, 'searchtext');

我想要上述行为,因为我使用准备好的语句在 where 字符串中提供参数,例如WHERE text = ? 然后我提供参数代替?

【问题讨论】:

  • where para like concat('%', ?, '%') 应该可以工作
  • @a_horse_with_no_name 对不起。我应该提到这一点。出于安全原因,我正在使用准备好的语句。如果我会使用你的方法,即使这样,也有人可以传递类似abc%' OR '%def(sql 注入)的东西。
  • ? PreparedStatement 的参数。它不会受到 SQL 注入的攻击

标签: postgresql


【解决方案1】:

要将通配符与 PreparedStatement 中的参数一起使用,您需要将该参数值与通配符连接:

SELECT * 
FROM my_table 
WHERE para LIKE concat('%', ?, '%');

以上内容不易易受 SQL 注入攻击。即使您确实将abc%' OR '%def 作为参数传递,使用的条件也将是LIKE '%abc%'' OR ''%def'

另一种可能性是使用strpos()

SELECT * 
FROM my_table 
WHERE strpos(para, ?) > 0;

【讨论】:

    猜你喜欢
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-06
    • 2021-11-07
    • 1970-01-01
    • 1970-01-01
    • 2020-02-29
    相关资源
    最近更新 更多