2010-03-31 55 views
3

下面是我寫的一些有效的代碼,但是會產生太多的數據庫查詢。有沒有一種方法可以優化和減少查詢次數,但是條件語句仍然與下面一樣有效?有沒有更好的循環可以編寫來減少數據庫查詢?

爲了好的測量,我粘貼了幾次重複的代碼。

echo "<h3>Pool Packages</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

      if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Pool Packages") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
      } 
      else { 
       $newprice = $query->price;     
       $totals[] = $newprice; 
      } 

      if ($query->category == "Pool Packages") {       
       echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>";   
      } 

      else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Water Features</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

      if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Water Features") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
      } 
      else { 
       $newprice = $query->price;     
       $totals[] = $newprice; 
      } 

      if ($query->category == "Water Features") {   
       echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
      } 
      else { } 



    endforeach; 

    echo "</ul>"; 

    echo "<h3>Waterfall Rock Work</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

      if ($item['quantity'] > 1 && $item['quantity'] == TRUE) { 
        $newprice = $item['quantity'] * $query->price;         
        $totals[] = $newprice; 
      } 
      else { 
       $newprice = $query->price;     
       $totals[] = $newprice; 
      } 

      if ($query->category == "Waterfall Rock Work") {    

       echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
      } 

      else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Sheer Descents</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

     if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Sheer Descents") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
     } 
     else { 
      $newprice = $query->price;     
      $totals[] = $newprice; 
     } 

     if ($query->category == "Sheer Descents") {   

      echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
     } 

     else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Booster Pump</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

     if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Booster Pump") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
     } 
     else { 
      $newprice = $query->price;     
      $totals[] = $newprice; 
     }  

     if ($query->category == "Booster Pump") { 

      echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
     } 

     else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Pool Concrete Decking</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

     if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Pool Concrete Decking") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
     } 
     else { 
      $newprice = $query->price;     
      $totals[] = $newprice; 
     }   

     if ($query->category == "Pool Concrete Decking") { 

      echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
     } 

     else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Solar Heating</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

     if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Solar Heating") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
     } 
     else { 
      $newprice = $query->price;     
      $totals[] = $newprice; 
     } 

     if ($query->category == "Solar Heating") { 

      echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
     } 

     else { } 

    endforeach; 

    echo "</ul>"; 

    echo "<h3>Raised Bond Beam</h3>"; 

    echo "<ul>"; 

    foreach ($items as $item): 

     $this->db->where('id', $item['id']); 
     $query = $this->db->get('items')->row(); 

     if ($item['quantity'] > 1 && $item['quantity'] == TRUE && $query->category == "Raised Bond Beam") { 
       $newprice = $item['quantity'] * $query->price;         
       $totals[] = $newprice; 
     } 
     else { 
      $newprice = $query->price;     
      $totals[] = $newprice; 
     } 

     if ($query->category == "Raised Bond Beam") { 
      echo "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>"; 
     } 

     else { echo "<li>None</li>"; } 

    endforeach; 

    echo "</ul>"; 

它超越了這個更多的類別,但我不知道如何處理循環通過這個最好的。謝謝!

+0

這些重複的代碼塊是可怕的。想想先消除它 – 2010-03-31 18:42:20

回答

1

您可以在變量中構建html,以便只循環一次。下面是一個快速和骯髒的例子,只是爲了告訴你我在說什麼:

$html = ''; 
$oldCat = ''; 
foreach ($items as $item) { 

    $this->db->where('id', $item['id']); 
    $query = $this->db->get('items')->row(); 

    if ($oldCat != $query->category) { 
     $html .= "</ul>\n"; 
     $html .= "<h3>".$query->category."</h3>\n<ul>\n"; 
     $oldCat = $query->category; 
    } 

    if ($item['quantity'] > 0) { 
     $newprice = $item['quantity'] * $query->price;         
     $totals[] = $newprice; 
    } 

    $html .= "<li>" . $query->name . " (QTY: " . $item['quantity'] . " x = " . str_ireplace(" ", "", money_format('%(#10n', $newprice)) . ")</li>\n";   

} 
// strip leading /ul, append a /ul, echo html 
0

您可以在第一個循環期間將所有行存儲到單獨的數組中,然後在所有其他循環中引用該數組,而不是一遍又一遍地獲取相同的信息,假設您選擇*您可能是。

或者,如果沒有多個項目比您要提取的項目多,則可以使用單個查詢一次獲取所有行(您只使用一個查詢)並循環來存儲數組$array[$row['id']] = $row(或類似的東西)中的所有值,然後只需在每個循環中引用數組中的所有行。

+0

如何從數組中選擇數據庫調用? – dmanexe 2010-03-31 18:42:01

+0

簡單地將整行存儲到數組'$ array [$ item ['id']]'或任何可以在那裏訪問所有信息的地方。 – animuson 2010-03-31 18:44:01

+0

注意事項 - 你有沒有AIM,我只是檢查了你的網站,我很樂意與你聯繫工作 – dmanexe 2010-03-31 18:46:10

0

您應該使用從項目到類別的連接並獲取所有項目,然後您可以將它們整理到多維數組中,然後循環輸出。

林不知道什麼youre類數據庫連接是做但卻讓我們假設我們希望與thier類別中的所有項目:

$sql = "SELECT item.*, category.name as category from item, category WHERE item.category_id = category.item_id"; 

// ill use PDO for db access here... 
$db = new PDO($connString, $username, $password); 
$items = array(); // our array indexed by category. 

foreach($db->query($sql) as $item) { 
    if(!array_key_exists($items, $item['category']) { 
    $items[$item['category']] = array(); 
    } 

    $items[$item['category']][] = $item; 
} 

// now loop through $items using the similar stuff you did for output previously. 
// note instead of doing the conditionals for pricing and stuff here you may want to 
// do that in the loop above and put it in the array before hand... it will keep the 
// output loop cleaner. 
0

您需要啓動以成套的,而不是循環思維。編寫一個將數組作爲varchar存儲的存儲過程(或者在SQL Server 2008中,您可以使用表值的輸入參數,不知道其他dbs)。

然後將該字符串拆分爲一個臨時表,並返回一個選擇連接到臨時表中的所有記錄。即使你需要返回單獨的記錄集,在存儲過程中執行它也會減少網絡流量。

相關問題