2011-12-20 8 views
0

foreachを使用して多重挿入しています(各製品には多くの属性が含まれている可能性があるため、2つのループレベルがあります)。 stmtを使用するように提案しましたが、これを行う方法がわかりません。foreach 2レベル配列ループで複数挿入

私はform.Andからデータを取得する方法を知っていると私はデータベースにデータを入れて助けが必要です。

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] =>))) 

コード:prodcutため

// 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(); 
} 

表:製品属性の

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

表:MySQLで

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

は、あなたが何をしようとしたことがありますか? – Indranil

+0

私はstmtを挿入しようとしていますが、これを行うより良い方法があるのだろうかと疑問に思っています。 –

答えて

2

一度に複数の行を挿入することができます。

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)を使用する方法を覚えておく必要があります。 –

+0

あなたは間違っていました... –

関連する問題