我有一个如下数组:
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语句。严格来说,他们并不需要,但我确信它不会改变它的运作,所以不用担心!!
答案 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 ... )
如果值为1
或0
,则应执行此操作:
// 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注入