【问题标题】:Use REGEX in user input variable in SQL Query.在 SQL Query 的用户输入变量中使用 REGEX。
【发布时间】:2014-05-06 10:24:19
【问题描述】:

我必须编写一个带有 where 子句的 sql 查询,该子句在数据库表中查找用户输入值。

假设用户输入了一个职位“科学和数学主管”

查询应该单独查找职位中的所有单词,并相应地返回部门列表。

$keyword =  mysql_real_escape_string($keyword);

SELECT distinct departments.name FROM departments, jobtitle_keywords 
WHERE jobtitle_keywords.keywords REGEXP   '$keyword' 
AND departments.id = jobtitle_keywords.dept_id;

此查询在理想情况下(没有特殊字符、空格等)完美运行,否则会失败

谁能指导我以正确的方式转义用户可以输入的各种特殊字符和异常,这样我的查询就不会失败。

非常感谢任何帮助。

谢谢

【问题讨论】:

  • 你知道REGEX 是干什么用的吗?您应该阅读相关文档:dev.mysql.com/doc/refman/5.1/en/regexp.html
  • 是的,我知道 REGEX 的用法,我认为它很适合我的要求。有没有其他方法可以编写智能搜索查询,可以很好地处理用户输入?
  • 如果您知道 REGEX 的用法,为什么要这样输入关键字而不是 keywords LIKE '%$keyword%'dev.mysql.com/doc/refman/5.1/en/pattern-matching.html
  • 让我重新表述我的问题,用户可以输入这些职位,如科学和数学主管 *科学和数学主管 *科学/数学主管 *科学/数学主管 *科学、数学主管等。 . SQL 查询应该类似于 SELECT distinct department.name FROM department, jobtitle_keywords WHERE jobtitle_keywords.keywords like 'head' or like 'maths' or like 'science' AND department.id = jobtitle_keywords.dept_id;I want to search complete单词不匹配,这就是为什么我在喜欢中省略 % .. 请提出建议。
  • 任何帮助将不胜感激。我被困在这里,必须对其进行排序.. 提前致谢#

标签: php sql regex


【解决方案1】:

所以拿了你的 cmets 我假设你想从你的用户搜索输入中获取单个单词(即“科学/数学负责人”)并且只使用单词(head, of 、科学和数学)并使用它们在您的jobtitle_keywords.keywords 字段中进行搜索。

假设这是您想要/需要的:

使用simple regex 确保从查询中得到所有单词,如下所示:

$re = '/(\w+)/i'; 
$str = 'head of science / math'; 

preg_match_all($re, $str, $matches);

现在在 $matches[0] 你有你的结果:array( "head", "of", "science", "math")Awfully simple.

现在使用它来创建一个使用ANDOR 的SQL 语句。您可以使用implode 轻松做到这一点。

$queryAddon = "jobtitle_keywords.keywords LIKE '%" 
   . implode ("%' AND jobtitle_keywords.keywords LIKE '%", $matches[0])
   . "%'";

给你jobtitle_keywords.keywords LIKE '%head%' AND jobtitle_keywords.keywords LIKE '%of%' AND jobtitle_keywords.keywords LIKE '%science%' AND jobtitle_keywords.keywords LIKE '%math%'

Like stealing a Childs Candy right?

所以现在只需将其放入您的查询中并启动它。

$query = "SELECT distinct departments.name FROM departments, jobtitle_keywords "   ."WHERE departments.id = jobtitle_keywords.dept_id "   ." AND (" . $queryAddon . ")";

这应该对你有用 - 如果我没听错的话。

【讨论】:

  • 这正是我一直在寻找的......感谢您提供非常详细的解释以及解决方案。谢谢一声。会试一试,让你知道。
  • @user3607604 不客气。可以通过支持答案来表示赞赏。此外,如果它确实解决了您的问题,请将其标记为 已接受(在 voring 面板下方的绿色箭头),这样这个问题就不会得到更多不必要的关注。
  • 嗨 Andresch,使用 $re = '/(\w+)/i';我的查询返回以下结果, jobtitle_keywords.keywords LIKE '%head%' OR jobtitle_keywords.keywords LIKE '%20of%' OR jobtitle_keywords.keywords LIKE '%20science% 我怎样才能摆脱空格?尝试做 $matches = array_filter(array_map('trim',$matches));但它给出的错误..提前感谢
  • 我看不到任何空格 :-/ 你的意思是什么空格?你介意问一个新问题吗?
  • 我的意思是添加到每个数组值的“20”,即搜索字符串中的每个空格都替换为 20。我会问另一个问题。只是一个想法。任何查看您早期真正有用的解决方案的人都可能会遇到处理空间的相同问题。谢谢
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多