2015-02-09 86 views
0

我試圖將insert多個rows插入到我的數據庫中,依賴於數組返回的迭代次數。SQL插入多行,foreach

插入正在工作,但是插入多於一行,無論數組中有什麼。

function createOrder(){ 

    $CustomerID = $_SESSION['CustomerID']; 
    $BasketID = $_SESSION['BasketID']; 

    // create a new entry with an OrderID 
    $orders = new Basket; 
    $orders->storeFormValues($_POST); 
    // Collect the OrderID returned from insertOrder(); and insert into 'Orders' 
    $OrderID = $orders->insertOrder($CustomerID); 

    // Populate OrderDetails with items in users Basket. 
    $data = Basket::getBasket($BasketID); 
    $results['basket'] = $data['results']; 

    // Insert the order details into the orderDetails DB. 
    $orders->insertOrderDetails($OrderID, $BasketID, $CustomerID, $results); 
}; 

和環路:

public static function insertOrderDetails($OrderID, $BasketID, $CustomerID, $results){ 
    $conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 

    // for each row insert into the DB 
    foreach ($results['basket'] as $row) { 
     $sql = "INSERT INTO OrderProducts (OrderID, ProductName, Price, Quantity) 
       VALUES (:OrderID, :ProductName, :Price, :Quantity)"; 

     $st = $conn->prepare($sql); 
     $st->bindValue(":OrderID", $OrderID, PDO::PARAM_INT); 
     $st->bindValue(":ProductName", $row->ProductName, PDO::PARAM_STR); 
     $st->bindValue(":Price", $row->Price, PDO::PARAM_INT); 
     $st->bindValue(":Quantity", $row->Quantity, PDO::PARAM_STR); 
     $st->execute(); 

    } 
    $conn = null; 
} 

和陣列,$results看起來像;

array(1) { 
    ["basket"]=> 
    array(2) { 
    [0]=> 
    object(Basket)#3 (10) { 
     ["OrderID"]=> 
     NULL 
     ["CustomerID"]=> 
     NULL 
     ["OrderItemID"]=> 
     NULL 
     ["ProductID"]=> 
     string(1) "9" 
     ["Quantity"]=> 
     string(1) "4" 
     ["ProductName"]=> 
     string(12) "Cheese Bagel" 
     ["Price"]=> 
     string(1) "1" 
     ["NameType"]=> 
     string(5) "Bagel" 
     ["BasketProductID"]=> 
     string(2) "25" 
     ["BasketID"]=> 
     string(1) "3" 
    } 
    [1]=> 
    object(Basket)#5 (10) { 
     ["OrderID"]=> 
     NULL 
     ["CustomerID"]=> 
     NULL 
     ["OrderItemID"]=> 
     NULL 
     ["ProductID"]=> 
     string(1) "2" 
     ["Quantity"]=> 
     string(1) "1" 
     ["ProductName"]=> 
     string(15) "The British BLT" 
     ["Price"]=> 
     string(1) "3" 
     ["NameType"]=> 
     string(5) "Bagel" 
     ["BasketProductID"]=> 
     string(2) "26" 
     ["BasketID"]=> 
     string(1) "3" 
    } 
    } 
} 

任何建議大大apprecaited!

+1

什麼是你的主要和唯一的密鑰? – Legionar 2015-02-09 14:42:59

+0

PDO默認使用「返回布爾值false」來表示失敗。你不檢查任何DB代碼中的失敗,這意味着你只是假設什麼都不會失敗。 – 2015-02-09 14:45:53

+0

@Legionar,在'OrderProducts'中,OrderProductID是主要的,唯一的,'Orders',OrderID是主要的。 @MarcB謝謝,我計劃創建一些conidtions來檢查腳本的主要部分是否正常工作。 – atoms 2015-02-09 14:47:56

回答

1

我在數據庫中的主鍵wasnt沒有設置爲Auto Increment。改變這個解決了這個問題。將允許刪除一次。感謝您的幫助

+1

是的,我給你寫了評論問題, \t 你最主要和唯一的鑰匙是什麼? :-) – Legionar 2015-02-18 14:28:33

0

閱讀http://php.net/manual/en/pdostatement.execute.php看來你可能需要關閉遊標才能執行下一條語句。

注: 注: 有些司機需要在執行下一條語句之前關閉遊標。

另一個說明你可能不必在每次迭代中創建語句。

+0

呃,在任何OP的代碼中,mysqli在哪裏?它使用PDO – 2015-02-09 14:45:16

+0

對不起馬克,我錯過了那個細節:) – 2015-02-09 14:49:38

1

可能只是試試這個變種的INSERT查詢:

insert into tablename (id,blabla) values(1,'werwer'),(2,'wqewqe'),(3,'qwewe'); 

例如:

$conn = new PDO(DB_DSN, DB_USERNAME, DB_PASSWORD); 

foreach ($results['basket'] as $key => $row) { 
    $sql = "INSERT INTO OrderProducts (OrderID, ProductName, Price, Quantity) VALUES "; 
    $sql .= "(:OrderID" . $key . ", :ProductName" . $key . ", :Price" . $key . ", :Quantity" . $key . "),"; 
} 

$sql = substr($sql, 0, -1); 
$st = $conn->prepare($sql); 

foreach ($results['basket'] as $key => $row) { 
    $st->bindValue(":OrderID" . $key, $OrderID, PDO::PARAM_INT); 
    $st->bindValue(":ProductName" . $key, $row->ProductName, PDO::PARAM_STR); 
    $st->bindValue(":Price" . $key, $row->Price, PDO::PARAM_INT); 
    $st->bindValue(":Quantity" . $key, $row->Quantity, PDO::PARAM_STR); 
} 
$st->execute(); 

兩個的foreach但一個插入查詢數據庫。

+0

感謝德米特里,我不確定我將如何分別填充每組括號? – atoms 2015-02-09 14:53:29

+0

我沒有測試它,但我認爲那麼應該工作這個變種(編輯我的答案)。 – 2015-02-09 15:11:50

+0

請讓我知道,如果我的解決方案正在工作:)。謝謝。 – 2015-02-09 15:31:32