循环遍历数组以创建SQL查询

时间:2014-02-26 21:19:28

标签: php mysql sql arrays

我有一个如下数组:

tod_house
tod_bung
tod_flat
tod_barnc
tod_farm
tod_small
tod_build
tod_devland
tod_farmland

如果其中任何一个都有值,我想将它添加到SQL查询中,如果没有,我会忽略它。 此外,如果一个人有一个值,则需要将其添加为AND,之后的任何一个都需要为OR(但是无法确定哪个是第一个拥有值!)

我已经使用以下代码片段来检查第一个值并根据需要附加查询,但我不想复制并粘贴这9次;一个用于数组中的每个项目。

$i = 0;
if (isset($_GET['tod_house'])){
    if ($i == 0){
        $i=1;
        $query .= " AND ";
    } else {
        $query .= " OR ";
    }
    $query .= "tod_house = 1";
}

有没有办法循环更改名称的数组,所以我只需要使用一次代码(请注意第一行的$ _GET ['tod_house']和最后一行的tod_house不是一回事! - 第一个是传递值的复选框的名称,第二个是要添加到查询中的字符串)


解决方案

答案很大程度上取决于接受的答案,但我会准确地说明在其他人遇到这个问题的情况下有什么用处......

我不希望答案如同建议:

tod_bung = 1 AND (tod_barnc = 1 OR tod_small = 1)

而我想要它:

AND (tod_bung = 1 OR tod_barnc = 1 OR tod_small = 1)

因此可以将其附加到现有查询中。因此,他的回答已经改为:

$qOR = array();
foreach ($list as $var) {
    if (isset($_GET[$var])) {
            $qOR[] = "$var = 1";
    }
}
$qOR = implode(' OR ', $qOR);
$query .= " AND (" .$qOR . ")";

IE不需要两个不同的数组 - 只需按照他的建议进行循环,如果设置了值,则将其添加到新的qOR数组,然后使用OR语句进行内爆,用括号括起来,并附加到原始查询。

唯一的问题是,如果只设置了一个项目,则查询如下:

AND (tod_bung = 1)

有括号但内部没有OR语句。严格来说,他们并不需要,但我确信它不会改变它的运作,所以不用担心!!

4 个答案:

答案 0 :(得分:2)

$list = array('tod_house', 'tod_bung', 'tod_flat', 'tod_barnc', 'tod_farm', 'tod_small', 'tod_build', 'tod_devland', 'tod_farmland');
$qOR = array();
$qAND = array();

foreach ($list as $var) {
    if (isset($_GET[$var])) {
        if (!empty($qAND)) {
            $qOR[] = "$var = 1";
        } else {
            $qAND[] = "$var = 1";
        }
        $values[] = $_GET[$var];
    }
}



$qOR = implode(' OR ', $qOR);
if ($qOR != '') {
    $qOR = '(' . $qOR . ')';
}

$qAND[] = $qOR;
$qAND = implode(' AND ', $qAND);


echo $qAND;

这将输出类似tod_bung = 1 AND (tod_barnc = 1 OR tod_small = 1)

的内容

答案 1 :(得分:0)

由于传递给$_GET的参数是一个字符串,您应该构建一个包含上述所有键的字符串数组,迭代它并传递像if (isset($_GET[$key])) { ...

这样的值

然后,您甚至可以使用密钥来附加到SQL字符串。

答案 2 :(得分:0)

如果在同一列上测试数组元素,则应使用IN (...)而不是:

AND ( ... OR ... OR ... )

如果值为10,则应执行此操作:

// If you need to get the values.
$values = $_GET;
$tod = array();

foreach($values as $key => $value) {
    // if you only want the ones with a key like 'tod_' 
    // otherwise remove if statement
    if(strpos($key, 'tod_') !== FALSE) {
        $tod[$key] = $value;
    }
}

// If you already have the values.
$tod = array(
    'tod_house' => 1, 
    'tod_bung' => 0, 
    'tod_flat' => 1, 
    'tod_barnc' => 0
);

// remove all array elements with a value of 0.
if(($key = array_search(0, $tod)) !== FALSE) {
    unset($tod[$key]);
}
// discard values (only keep keys).
$tod = array_keys($tod);

// build query which returns : AND column IN ('tod_house','tod_flat')
$query = "AND column IN ('" . implode("','", $tod) . "')";

答案 3 :(得分:0)

他们有很多出路

    $list = array('tod_house', 'tod_bung', 'tod_flat', 'tod_barnc', 'tod_farm', 'tod_small', 'tod_build', 'tod_devland', 'tod_farmland');
    if($_GET){
     $query = "";
    foreach ($_GET as $key=>$value){
         $query .= (! $query) ?  " AND ":" OR ";
         if(in_array($key,$list) && $value){
          $query .= $key." = '".$value."'";
         }
    }
}

当然你必须注意XSS和SQL注入