【问题标题】:What is the function of this ~* syntax in a sql query?这个 ~* 语法在 sql 查询中的作用是什么?
【发布时间】:2018-12-12 15:21:03
【问题描述】:

我正在尝试了解实现新功能和选项的脚本。 为了在 sql 表中搜索,他们使用了以下语法

$sqlquery = "SELECT DISTINCT \"Name\", \"FileName\", \"Status\", lower(\"Name\") FROM \"" . $SearchedTable . "\" WHERE ";

$sqlquery=$sqlquery." (\"Name\" ~* '".$text[$i]."' OR \"DNA\" ~* '".$text[$i]."')";
  • 我想知道的是他们为什么使用“名称”(我在某处读到它与 sql 注入有关)。
  • 我也找不到使用这种语法 ~* 代替 = 的原因。还是有别的意思?

【问题讨论】:

  • 您确定这是mysql 而不是postgres~ 在 mysql 中用作位运算符以及全文搜索中的否定运算符。这些似乎都没有在这里发挥作用。在 postgresql 中,~ 是一个正则表达式运算符,在这种情况下更有意义。
  • 谢谢,我改编了。我不想给出完整的查询。我不会很清楚。
  • 这是 Postgresql 而不是 mysql。搜索模式匹配运算符。
  • 如果您想避免 sql 注入,请阅读有关PDO的教程

标签: php sql postgresql


【解决方案1】:

一般说明:您当前的查询使用字符串连接,因此容易发生 SQL 注入。 PHP 方面的最佳解决方法是使用准备好的语句。

话虽如此,您的 SQL 语法似乎是 Postgres,而不是 MySQL。这是粗略的查询:

SELECT DISTINCT Name, FileName, Status, lower(Name)
FROM yourTable
WHERE Name ~* ? OR DNA ~* ?;

Postgres 中的~* 运算符执行不区分大小写的正则表达式匹配。因此,例如,要匹配任何以mi 开头的Name,您可以使用:

WHERE Name ~* '^mi'

因此,您应该绑定到这两个占位符的是正则表达式。

【讨论】:

  • 我的专栏包含完整的句子。因此,例如,我发现包含我的表的行包含完整的句子"。当我的 sqlquery 包含例如 "WHERE Name ~* full" 时,此运算符将找到此行?
  • 您需要在full 周围加上单引号,但是可以。您可能还想用单词边界包围full,以仅匹配完整单词而不是子字符串。所以也许使用WHERE Name ~* '\yfull\y'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-22
  • 2013-10-23
  • 1970-01-01
  • 2011-03-12
相关资源
最近更新 更多