2013-10-03 96 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