我需要弄清楚如何在数据库中查询串行A或序列B,或串行C。
以前的解决方案使用LIKE
(例如SELECT * FROM Table WHERE Serial LIKE
)-这对于搜索所有序列(%
)或特定序列(Serial A
)非常有效。然而,我很快发现IN
和LIKE
不能在MySql中组合,并且LIKE
使用的通配符不够灵活,无法找到串行A或序列B,或串行C。
(注意:实际的序列有很多变化,没有一致的约定-我知道像这些基本示例这样简单的序列可以使用%
通配符找到)
我当时的想法是改用RLIKE
——然而,有些序列的名称是B + 3
,如果不转义就无法找到。在这里,我想用一种方法来转义字符,比如preg_quote()
,但其中存在更多的系统结构问题。。。
选择约束模块
通过查询数据库(例如SELECT DISTINCT Serial FROM Table
)来填充组合框,用户可以从中选择序列号,然后提交表单。所选序列号作为GET
值传递到下一页。
查看结果模块
$serial
变量的内容作为参数传递给SQL查询,以在页面上生成结果。$serial
由查看结果模块所属的页面填充,或由传递给页面的GET
值填充(如果在模块为include
d之前页面尚未填充该值,并且没有GET
值,则会引发错误)。
这个结构让我有点困惑。如果用户传递了RLIKE
和preg_quote()
来搜索序列号,那么这似乎非常简单。preg_quote()
在作为参数传递之前可以在$serial
上使用,并且更新的(WHERE Serial RLIKE
)查询应该按预期工作。然而,我仍然不知道如何搜索多个序列。
如果我将$serial
指定为(Serial A | Serial B | Serial C)
,那么preg_quote()
将转义正则表达式字符而找不到它们。但是,如果我不使用preg_quote()
,那么将找不到像B + 3
这样的序列,因为regex字符将不显示。
我非常感谢任何关于改进这个问题的反馈——我试图尽可能清楚地解释它,但背景和限制的复杂性使它变得困难。非常感谢。
转义子字符串,而不是最终的regexp。
"(" . preg_quote(serialA) . "|" . preg_quote(serialB) . "|" . preg_quote(serialC) . ")"