2011-12-20 63 views
0

正在使用foreach(有兩個級別的循環,因爲每個產品可能有很多屬性)進行多重插入。建議使用stmt,但不知道如何做到這一點。使用foreach 2級數組循環多重插入

我知道從表單中檢索數據的方式,而且我需要將數據放入數據庫。

Array ([1] => Array ( 
[category] => 1 
[code] => NFK50889922 
[price] => 15.00 [name] => Pendants 
[description] => Gold pendants covered with 400k diamond 
[thumbnail] => 131120091585.jpg 

//second level array for attribute 
[attcode] => Array ([0] => [1] => [2] =>) 
[color] => Array ([0] => [1] => [2] =>) 
[size] => Array ([0] => [1] => [2] =>) 
[stock] => Array ([0] => [1] => [2] =>))) 

代碼:

// Check for a form submiss 
    if ($_SERVER['REQUEST_METHOD'] == 'POST') { 

    $product=$_POST['product']; 


    foreach($product as $productcount){ 

    $q = 'INSERT INTO product(id,code,name,description,category_id,price,icon) VALUES (NULL,'.$productcount['code'].',"'.$productcount['name'].'",'.$productcount['description'].',"'.$productcount['category'].',"'.$productcount['price'].',"'.$productcount['thumbnail'].')'; 

    mysqli_query($dbc, $q);//insertion of general information of current product 


    //insertion of many attribute of current product 
    $sql = 'INSERT INTO product_attribute (product_id,code,c_value,s_value,stock) VALUES (LAST_INSERT_ID(), ?, ?, ?, ?)'; 

      // Prepare the statement: 
      $stmt = mysqli_prepare($dbc, $sql); 



    // For debugging purposes: 
     // if (!$stmt) echo mysqli_stmt_error($stmt); 

     mysqli_stmt_bind_param($stmt,'sssi',$attribute_code,$color_value,$size_value,$stock_unit); 

     foreach($productcount['code'] as $attcode){ 
      $attribute_code=$attcode; 
      } 

     foreach($productcount['color'] as $attcolor){ 
      $color_value=$attcolor; 
      } 

     foreach($productcount['size'] as $attsize){ 
      $size_value=$attsize; 
      } 

     foreach($productcount['stock'] as $attstock){ 
      $stock_unit=$attstock; 
      } 

     foreach($productcount['attcode'] as $attcode){ 
      $attcode; 
      } 

     // Execute the query: 
     mysqli_stmt_execute($stmt); 
     $stmt->close(); 
} 

表prodcut:

id---code---name---description---categori_id---price 

表產品屬性:

id---product_id---code---color---size---stock 
+0

你嘗試過什麼? – Indranil 2011-12-20 06:25:03

+0

我試圖插入stmt,但我想知道是否有更好的方法來做到這一點 – 2011-12-20 06:38:39

回答

2

在MySQL中,你可以同時插入多行:

INSERT INTO TableName( 
    foo_field, 
    bar_field 
) 
VALUES 
    (foo1, bar1), 
    (foo2, bar2), 
    (foo3, bar3), 
    (foo4, bar4) 

該方法的缺點是您無法使用準備好的語句,從而獲得內置保護防止注入的額外好處。

或者,您可以創建一個預準備語句,然後使用循環中的參數執行它。這將是一種較慢的方式,但在插入數據之前,您不需要手動清理數據。

1

如果您$product陣列是這樣的:

Array 
(
    [0] => Array 
     (
      [name] => thename1 
      [color] => thecolor1 
      [size] => thesize1 
      [stock] => thestock1 
      [attcode] => theattcode1 
     ) 

    [1] => Array 
     (
      [name] => thename2 
      [color] => thecolor2 
      [size] => thesize2 
      [stock] => thestock2 
      [attcode] => theattcode2 
     ) 

) 

然後你可以的foreach這樣的:

<?php 

foreach($product as $k=>$v) 
{ 
    $name = $product[$k]['name']; 
    $color = $product[$k]['color']; 
    $size = $product[$k]['size']; 
    $stock = $product[$k]['stock']; 
    $attcode = $product[$k]['attcode']; 

    $mysqli->query('INSERT INTO table(product_id,code,color,size,stock) VALUES(....,....,....,...,...)'); 
} 
?> 
+2

請停止提升古老的'mysql_ *'功能。他們正在被棄用的過程中,你不應該寫任何包含它們的新代碼。相反,你應該學習如何在準備好的語句中使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/mysqli)。 – 2011-12-20 06:55:27

+0

,你做錯了... – 2011-12-20 07:33:41