检测重复的数组值php,然后动态生成SQL查询

时间:2011-11-23 15:17:47

标签: php sql

到目前为止,我有这两个数组:

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

其中一个数组包含字段名,而另一个包含字段值。现在,如果两个或多个字段名称数组值相同,那么SQL查询中的运算符应该是这两个或多个字段之间的OR(如果不是相同的AND)和其余字段之间的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]");

任何人都可以告诉我或指导我如何做到这一点? 提前谢谢你。

5 个答案:

答案 0 :(得分: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);

<强>更新

顺便说一下,如果你想结束FIELD IN('val1','val2'等)而不是FIELD ='Val1'OR FIELD ='Val2'你可以使用它:

$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);

答案 1 :(得分: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);

答案 2 :(得分:0)

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

然后再次循环遍历长度并连接数组以构造有效的SQL查询,如下所示:

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

答案 3 :(得分: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

答案 4 :(得分: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']).")";