2012-09-04 2 views
6

Während ich eine Shopping-Site zu kodieren, muss ich Produktbestand aktualisieren. Aber die Sache ist, natürlich Warenkorb kann die gleichen Elemente ein paar Mal haben. Was ist der beste Weg, um es zu aktualisieren?Aktualisierung SQL-Werte mit Array, die ein paar Mal aufgetretene Artikel haben

Ich versuchte IN, aber die folgende SQL-Abfrage gibt 3 Elemente zurück.

SELECT * 
FROM `products` 
WHERE id 
IN (3, 4, 4, 6) 
LIMIT 0 , 30 

Hier ist meine Lösung, aber ich denke nicht, dass dies der beste ist.

$cart = array(1,3,4,4,5,8,22,22); 
$itemlist = array_count_values($cart); 

foreach($itemlist as $itemid=>$ocurrence){ 
    $SQL = "UPDATE products SET stock = stock-".$ocurrence." WHERE id = ".$itemid; 
    mysql_query($SQL); 
} 
+3

Ich denke, diese Methode ist in Ordnung. Sie müssen Aktualisierungen in einer Schleife durchführen, wenn sie unterschiedliche Werte erhalten. –

+0

Vereinbaren Sie mit @MichaelBerkowski. Wenn Sie nicht ein nachweisbares Leistungsproblem haben (z. B. eine große Anzahl von Benutzern oder eine große Anzahl von Produkten/Wagen), würde ich bei Ihrer Methode bleiben. Es kann möglich sein, das Update in einer einzigen Abfrage mit etwas cleverer Codierung auszuführen, aber es wird eine komplexe Lösung sein, die auf lange Sicht schwieriger zu warten ist. – mellamokb

+4

Sie haben es wahrscheinlich schon einmal gehört, aber ziehen Sie in Erwägung, zu einer neueren API zu wechseln, die vorbereitete Anweisungen wie MysQLi oder PDO unterstützt. Das würde die Leistung der Schleife ein wenig verbessern und die Sicherheit bei anderen Abfragen erhöhen. –

Antwort

0

wenn möglich erstellen eine separate item_cart, Tabelle, die haben (cart_id, item_id, product_id) als Primärschlüssel. Von hier aus können Sie eine Gruppe mit Produkt-ID aufrufen, um zu sehen, wie viele Produkte verkauft wurden.

Ihr PHP-Code wird keine der Produkte auf Lager column perfekt aktualisieren.

Wenn möglich, versuchen Sie, Trigger für das Updaten von Bestandsspalten zu setzen, wenn ein Produkt verkauft wird.