Multi-вставка с 2-уровневым циклом массива foreach - PullRequest
0 голосов
/ 20 декабря 2011

Я делаю многократную вставку, используя foreach (есть два уровня зацикливания, потому что у каждого товара может быть много атрибутов). Предложили использовать stmt, но не уверены, как это сделать.

Я знаю способ извлечения данных из формы. И мне нужна помощь по переносу данных в базу данных.

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

Ответы [ 2 ]

2 голосов
/ 20 декабря 2011

В MySQL вы можете вставить несколько строк одновременно:

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

Недостатком этого метода является то, что вы не можете использовать подготовленные заявления и, таким образом, получаете дополнительную выгоду от встроенной защиты от инъекций.

Кроме того, вы можете создать подготовленный оператор и затем выполнить его с параметрами в цикле. Это будет более медленный путь, но вам не нужно вручную обрабатывать данные перед их вставкой.

1 голос
/ 20 декабря 2011

Если ваш массив $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
        )

)

Тогда вы можете читать так:

<?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(....,....,....,...,...)');
}
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...