2014-02-16 33 views
0

我有一個會話,它是通過向購物車中的產品添加選項而構建的。 (工作正常的部分未在此處描述)會話中有多個值,但只有第一個會去數據庫

這些選項進入類似如下的會話:$_SESSION['options'.$id]其中$id在調用前面的代碼塊之前被標識。

我想要在下面的代碼插入會話中的每個項目作爲數據庫表中的新行。

foreach($_SESSION['options'.$id] as $option) 
{ 

    echo $option; 
    $statement = "INSERT INTO KC_OrderOptions (orderNumber, optionName, productID) VALUES (:orderNumber, :optionName, :productID)"; 

    $query = $db->prepare($statement); 

    $results = $query->execute(array(
     ":orderNumber"  => $orderNumber, 
     ":optionName"  => $option, 
     ":productID"  => $item 
    )); 
} 

現在與我已經建立了會話,echo $option;顯示以下行:

Swedish Fish AssortedSmooth n Melty Mints LargeNonpareils Milk ChocolateJelly Belly Sour Assorted 

它只能屈居Swedish Fish Assorted到數據庫中。我怎樣才能使這個循環,並將每個項目添加到數據庫?

+2

數據庫表是什麼樣的?是否存在一個可能阻止具有相同'orderNumber'或'productID'的多行的關鍵關係被插入? – futureal

+1

爲什麼在循環中有'$ statement =「INSERT ...'&'$ query = $ db-> prepare($ statement);'將這些移動到foreach()'循環之前的外部/之前 – Sean

+0

@futureal - 沒有沒有! – user3271851

回答

1

該代碼看起來是正確的,因爲它是;最可能的罪魁禍首是數據庫表中的錯誤鍵,它可以防止(例如)存在多個具有相同orderNumber的行。可能是orderNumber是主鍵,這肯定會導致後續插入失敗。

關於準備好的語句,以及@Sean在上面的評論中提到的內容,沒有必要爲循環的每次迭代重新準備相同的語句(雖然您當然可以,但效率較低)。一次準備一個語句,然後用不同的綁定參數反覆執行它的優點是MySQL可以在內部進行優化以獲得更好的性能。

這樣的代碼可能看起來像:

$statement = $db->prepare("INSERT INTO KC_OrderOptions (orderNumber, optionName, productID) VALUES (:orderNumber, :optionName, :productID)"); 

foreach($_SESSION['options'.$id] as $option) 
{ 
    $statement ->execute(array(
     ":orderNumber"  => $orderNumber, 
     ":optionName"  => $option, 
     ":productID"  => $item 
    )); 
} 

。當然,這是一個例子,其中有可能是不被過很多優化,但做這種方式很可能被認爲是最好的做法。

相關問題