我有一个带有多个复选框的html表单。我将这些传递给php ...
值将以“G,BW”为例(“BW,G”也需要匹配) 在check.php中,我需要从$ _GET中获取值并修改它们以进行SQL查询...
<?php
if(!empty($_GET['wireColor'])) {
foreach($_GET['wireColor'] as $colors) {
echo $colors; //make sure it's right, then comment out
}
}
$colors = rtrim($colors, ','); //Get rid of trailing , - not working right
$wireSearch = '\'REGEXP \'.*(^|,).$wireColor.(,|$)\''; //Trying to add the sql bits to pass to the query.
理想情况下要通过:
$colors_lookup_sql = "SELECT * FROM parts WHERE ( wire_colors REGEXP '.*(^|,)$wireSearch(,|$)' and wire_colors REGEXP '.*(^|,)$wireSearch(,|$)' );";
以下是查询最终的结果:
SELECT * FROM parts WHERE ( wire_colors REGEXP '.*(^|,)G(,|$)' and wire_colors REGEXP '.*(^|,)BW(,|$)' );
我很难将正则表达式比特放入查询中。
更新
这就是我现在所拥有的:
<?php
if(!empty($_GET['wireColor'])) {
foreach($_GET['wireColor'] as $colors) {
$wireSearch = ' REGEXP \'.*(^|,)' .$colors.'(,|$)\' AND ';
}
}
$Search = rtrim($wireSearch, 'AND'); //Trying to trim the last "AND"
$colors_lookup_sql = "SELECT * FROM parts WHERE ( wire_colors $wireSearch% );";
这主要是我所需要的,但打印/回显结果,我得到:
$ wireSearch结束为:REGEXP '.*(^|,)G(,|$)' AND REGEXP '.*(^|,)BW(,|$)' AND
这很棒 - 我只需要核对最后一个“AND”。但是,上面的修剪将替换为第二个值。怪异。
和$ colors_lookup_sql最终为:SELECT * FROM parts WHERE ( wire_colors REGEXP '.*(^|,)BW(,|$)' AND % );
BUt由于某种原因,数组中的第一个值消失,我不明白,因为它出现在sql语句之前。
答案 0 :(得分:1)
我不确定查询中的REGEX,因为我没有使用它,但是:
$wireSearch = '\'REGEXP \'.*(^|,).$wireColor.(,|$)\'';
这里有一个问题,变量$wireColor
在一个字符串中,并且你正在使用'
所以内部的任何内容都不会被读作变量,它应该是这样的:
$wireSearch = '\'REGEXP \'.*(^|,)'.$wireColor.'(,|$)\'';
答案 1 :(得分:0)
我不能说我完全理解你的数据是如何存储的,而且我自己也没有和REGEX合作过,但也许这样的事情会更容易使用:
$wireSearch = explode(",", $_GET['wireColor']);
$query = "SELECT * FROM parts WHERE wire_colors LIKE '%$wireSearch[0]%'
AND wire_colors LIKE '%$wireSearch[1]%'";
不确定这是否有帮助,但我认为id会引发这个想法。
答案 2 :(得分:0)
我猜mysql正则表达式支持单词边界,如何:
wire_colors REGEX '\bBW\b' and wire_colors regex '\bW\b'