2011-11-23 31 views
0

到目前为止我有这两个数组:检测重复数组值的PHP,然后动态地生成的SQL查询

$field_name[] = $selectedArr['field_name']; 
$field_value[] = $selectedArr['field_value']; 

这些阵列中的一个包含字段名称,而另一个包含的字段值。现在,如果两个或多个字段名称数组值相同,那么SQL查询中的运算符应该是这两个或多个字段之间的OR(如果不是相同的),并且其余字段之间的AND是和。

所以,如果说:

$field_name[0]="Type"; 
$field_name[1]="Type"; 
$field_name[2]="Varietal"; 

$field_value[0]="Red"; 
$field_value[1]="White"; 
$field_value[2]="Chardonney"; 

我怎么能检查这与循环或其他任何东西,然后根据结果动态生成某事像这样:

$SQLQuery=("SELECT * FROM wines WHERE $field_name[0]=$field_value[0] 
OR $field_name[1]=$field_value[1] AND $field_name[2]=$field_value[2]"); 

任何人都可以告诉我或指导我如何做到这一点? 预先感谢您。

回答

2
$field_name[0]="Type"; 
$field_name[1]="Type"; 
$field_name[2]="Varietal"; 


$field_value[0]="Red"; 
$field_value[1]="White"; 
$field_value[2]="Chardonney"; 

$result_array = array(); 
foreach ($field_name as $k=>$v) 
{ 
    $result_array[$v][] = $v."='".$field_value[$k]."'"; 
} 

foreach ($result_array as $k=>$v) 
{ 
    $result_array[$k] = "(".implode(" OR ", $result_array[$k]).")"; 
} 

echo implode(" AND ", $result_array); 

UPDATE

顺便说一句,如果你想用的,而不是字段= 'VAL1' OR字段= '值2' FIELD IN( 'VAL1', '值2' 等),以结束您可以使用此:

$result_array = array(); 
foreach ($field_name as $k=>$v) 
{ 
    $result_array[$v][] = "'".$field_value[$k]."'"; 
} 

foreach ($result_array as $k=>$v) 
{ 
    if (count($result_array[$k]) > 1) $result_array[$k] = "$k IN (".implode(" OR ", $result_array[$k]).")"; 
    else $result_array[$k] = "$k = $v[0]"; 
} 

echo implode(" AND ", $result_array); 
+0

非常感谢你,现在工作,再次感谢。 – Shpat

0

假设数组长度是相同的,迭代其中的一个,在兄弟数组上进行比较以查看值是否匹配。使用此逻辑在第三个数组$ field_operator上生成插槽,在每个数组上都设置“AND”或“OR”。

然后for循环在长度上再次并连接所有的数组来构造一个有效的SQL查询,像这样:

$sql .= $field_name . ' = ' . $field_value . ' ' . $field_operator; 
1

您可以使用array_count()获得的各要素的频率显示一个列表阵列。单打将具有1的计数,重复的值将具有计数> 1(例如2,3,4等)。

像这样的东西应该做的伎俩,假设$ selectedArry包含所有的字段/值对:

$data = array(); 
foreach($selectedArr as $sub) { 
    if (!isarray($data[$sub['field_name']])) { 
     $data[$sub['field_name']] = array(); 
    } 
    $data[$sub['field_name']][] = $sub['field_value']; 
} 

$clauses = array() 
foreach ($data as $key => $values) { 
    if (count($sub) == 1) { 
     $clauses[] = "($key = {$values[0]})"; 
    } else { 
     $clauses[] = "($key IN (" . implode(',', $values) . "))"; 
} 


$sql = "SELECT * FROM windows WHERE " . implode(' AND ', $clauses); 
0

首先可言,您查询的逻辑是不正确,
你会最终达到让很多意外的记录

您可以使用在类似

$arr = array(); 
foreach ($field_name as $key=>$name) 
{ 
    if (!isset($arr[$name])) 
    { 
     $arr[$name] = array(); 
    } 
    $arr[$name][] = $field_value[$key]; 
} 

$where = array(); 
foreach ($arr as $column=$val) 
{ 
    $where[] = "{$column} IN('".implode("',", $val).'")"; 
} 

$sql = '.... where '.implode(' AND ', $where); 

// the above example does not take care of sql injection 
0

通过更巧妙地构建数据阵列,您可以使生活变得更加轻松。

$wine_selection['Type'][] = "Red"; 
$wine_selection['Type'][] = "White"; 
$wine_selection['Varietal'][] = "Chardonney"; 

$sql = "SELECT * 
     FROM wines 
     WHERE Type IN (".implode(',', $wine_selection['Type']).") 
     AND Varietal IN (".implode(',' $wine_seelction['Varietal']).")"; 
+1

@Julien,快速更正。我认为你的意思是Implode而不是爆炸,对吧? –

+0

正确!我很抱歉 – Julien