2011-11-23 32 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