在php> mysql搜索的数组值之前和之后添加字符串

时间:2013-07-03 05:51:28

标签: php mysql regex

我有一个带有多个复选框的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语句之前。

3 个答案:

答案 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'