2012-09-21 25 views
0

我有一個購物車類,我在那裏存儲產品ID。用戶可以通過在彈出窗口中打開購物車的按鈕打開購物車,因此必須在每個頁面中加載購物車內容。php sql多個查詢。這是一件大事嗎?

由於大小限制,我只能存儲產品的ID,但我想向最終用戶顯示產品名稱,因此對於每個元素,我需要進行查詢並從數據庫獲取產品數據。

這樣做有什麼主要缺點嗎?還是有更好的解決方案? PS:我可以得到購物車中所有產品的ID,然後做一個單一的查詢來獲取所需產品的數據。我寧願避免這種情況,因爲我需要重寫類的一部分,所以與以前的解決方案有什麼實際區別?

PPS:在任何情況下,SQL查詢的總數不應該太高。當然,我不介意,但我堅信任何用戶都會一次購買數百種不同的產品。

+0

與您一樣的聲音應該運行一個查詢,以便在開始時獲取所有相關產品的數據,並根據該單個查詢創建產品記錄。除非您有與產品相關的多維數據,否則每種產品的一個查詢當然不應該是必需的,即使如此,也有辦法在一個查詢中獲得全部數據。 – DaveRandom

+0

你真的認爲在會話中存儲產品名稱是一個內存問題嗎?我懷疑......你測試過了嗎? – knittl

+0

如果你有內存問題,你在哪裏存儲ID?有1或2個查詢的解決方案是好的,1 + n不是。有很多方法可以解決這個問題,但我們沒有足夠的信息,因爲很難理解你。 –

回答

2

我只喜歡從你的問題突出了一句:

所以對於每一個元素,我需要進行查詢,並從數據庫中獲取產品數據。

這就是你的問題。你不需要那樣做。您可以使用單個查詢查詢數據庫,並要求所有位於ID列表中的產品。

SQL語言的有用部分是IN(....)子句。

$ids = [123, 884, 7848, 2882, 3232]; // let's say that is your input 
$idList = implode(',', array_map('intval', $ids)); 
$sql = sprintf(
    "SELECT field1, field2, field3 FROM products WHERE products.ID IN(%s)", 
    $idList 
); 

這是產品ID列表的單個查詢。當您從數據庫中讀取數據,您即時創建一個內存數據庫(又名Hashtable的),使基於ID,你可以「獲取」的數據:

foreach($ids as $id) 
{ 
    $concreteProduct = $rows[$id]; 
    ... 
} 

你也知道它作爲array,只需鍵入從數據庫返回的ID值。由於身份證是唯一的,這只是工作tm

希望這是有幫助的。有些人可能會稱之爲過早優化,但是,您應該意識到這個概念,因爲這可以在很多情況下使用。