2013-10-03 148 views
0

我有以下查询生成器。有些案例有相同的代码(那些有参数的)。查询生成器改进

我知道它不好重复代码,如果有的话。

你会如何建议我改善这个循环? 谢谢!

for ($i = 0; $i < $len; ++$i) { 
    switch ($conditions[$i]['condition']) { 
     case 'version': 
      $value_counter++; 
      $sql .= ' AND `musers`.`app_version` = :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'except_version': 
      $value_counter++; 
      $sql .= ' AND `musers`.`app_version` != :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'from_credits': 
      $value_counter++; 
      $sql .= ' AND `musers`.`credits` >= :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'to_credits': 
      $value_counter++; 
      $sql .= ' AND `musers`.`credits` <= :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'no_credits': 
      $sql .= ' AND `musers`.`credits` = 0'; 
      break; 
     case 'register_atleast': 
      $value_counter++; 
      $sql .= ' AND DATEDIFF(NOW(), `musers`.`creation_date`) > :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'talked_atleast': 
      $value_counter++; 
      $sql .= " AND `musers`.`total_talktime` >= :value".$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'never_talked': 
      $sql .= " AND `musers`.`total_talktime` = 0"; 
      break; 
     case 'purchase_atleast': 
      $value_counter++; 
      $sql .= " AND `musers`.`purchase_times` >= :value".$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'never_purchase': 
      $sql .= ' AND `musers`.`purchase_times` = 0'; 
      break; 
     case 'from_birthdate': 
      $value_counter++; 
      $sql .= " AND (`musers`.`birthdate` = '0000-00-00' OR `musers`.`birthdate` >= :value".$value_counter.")"; 
      $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value'])); 
      break; 
     case 'to_birthdate': 
      $value_counter++; 
      $sql .= " AND (`musers`.`birthdate` = '0000-00-00' OR `musers`.`birthdate` <= :value".$value_counter.")"; 
      $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value'])); 
      break; 
     case 'from_creation_date': 
      $value_counter++; 
      $sql .= " AND (`musers`.`creation_date` = '0000-00-00' OR `musers`.`creation_date` >= :value".$value_counter.")"; 
      $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value'])); 
      break; 
     case 'to_creation_date': 
      $value_counter++; 
      $sql .= " AND (`musers`.`creation_date` = '0000-00-00' OR `musers`.`creation_date` <= :value".$value_counter.")"; 
      $values[$value_counter] = date('Y-m-d', strtotime($conditions[$i]['value'])); 
      break; 
     case 'user_id': 
      $value_counter++; 
      $sql .= ' AND `musers`.`id` = :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'visit_app_aleast': 
      $value_counter++; 
      $sql .= ' AND `musers`.`visit_app_times` >= :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'visit_app_less': 
      $value_counter++; 
      $sql .= ' AND `musers`.`visit_app_times` < :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'total_calls_atleast': 
      $value_counter++; 
      $sql .= ' AND `musers`.`total_calls` >= :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'total_calls_less': 
      $value_counter++; 
      $sql .= ' AND `musers`.`total_calls` < :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
     case 'hourdiff': 
      $value_counter++; 
      $sql .= ' AND `hourdiff` = :value'.$value_counter; 
      $values[$value_counter] = $conditions[$i]['value']; 
      break; 
    } 
} 
+1

http://codereview.stackexchange.com/ – Mihai

+1

这个问题属于上http://codereview.stackexchange.com/ – SirDarius

+0

- 张贴在那里,谢谢。 – DanR

回答

-1

通常,如果要避免代码重复,请在函数或对象方法中提取重复的代码。即使对于3行代码,如果重复,也值得创建一个函数,并在需要这3行代码的地方调用它。

还有另外一种方法,在您的特定情况下:在您的交换机结构中堆叠案例。

switch($conditions[$i]['condition']) { 
    case 'version': 
    case 'except_version': 
    case 'from_credits': 
     $value_counter++; 
     $sql .= ' AND `musers`.`app_version` = :value'.$value_counter; 
     $values[$value_counter] = $conditions[$i]['value']; 
     break; 
    case 'no_credits': 
     $sql .= ' AND `musers`.`credits` = 0'; 
     break; 
    // etc. 
} 

有更多的解释:)的 “开关” 的文件一看

+0

请注意您对不同的条件使用了相同的sql子查询。 它不会以这种方式解决我的问题。感谢您尝试你:) – DanR

+0

问题是关于代码重复,我回答了这个问题... – Armage

+0

不,你没有。代码重复仅为$ value_counter ++和$ values [$ value_counter]的行。 请注意$ sql。=在每种情况下都在变化! 您的解决方案不能解决问题,只会导致问题发生错误。 (错误的查询) – DanR