簡體   English   中英

遍歷行並將INSERT多行插入MySQL

[英]Loop through rows and INSERT multiple rows into MySQL

簡而言之,我正在循環並嘗試插入所有行,但它只會將最后一行插入的次數與循環的次數相同。 因此,對於兩個循環,它將循環兩次,並插入最后一行兩次(根本不插入第一行)。

我將其用作行/項目計數器:

$countRecords;

這是一個基本計數器,可以告訴我上一張發票中包含多少行。 這可行。 在我的示例中,它顯示“ 2”,因為前一個發票中有兩個項目(行)。

我在循環外使用MySQL的第一部分:

// the MySQL statement out of the loop
$stmt="INSERT INTO o70vm_invoices_items
    (`id`, `invoice_id`, `name`, `desc`, `value`, `amount`, `discount`, `ordering` ) VALUES ";

然后運行循環:

// loop through the rows
for($rowCounter = 0; $rowCounter < $countRecords; $rowCounter++) 
    {


    // assign variables based on each loop iteration
    $invoiceID = htmlentities($_POST['invoice_id'], ENT_QUOTES);
    $program = htmlentities($_POST['name'], ENT_QUOTES);
    $forWeek = htmlentities($_POST['desc'], ENT_QUOTES);
    $value = htmlentities($_POST['value'], ENT_QUOTES);
    $qty = htmlentities($_POST['amount'], ENT_QUOTES);


    // put the VALUES array string for each row as such
    $ValuesAddToQuery[] ="(NULL, '$invoiceID', '$program', '$forWeek', '$value', '$qty','0.00','1')";

    }

循環之后,我將$ ValuesAddToQuery數組分解為這樣插入:

// add all the values into the statement
$stmt .= implode(',',$ValuesAddToQuery);

echo $stmt;

// execute statement
//mysql_query($stmt) or exit(mysql_error());

就像我說的那樣,此循環僅將最后一行插入與循環遍歷代碼的次數相同。

我的var_dump顯示我在數組的最后一行也添加了兩次。

非常感謝任何幫助。

對於我的循環的完整版本,這里是:

                $stmt="INSERT INTO o70vm_invoices_items 
                (`id`, `invoice_id`, `name`, `desc`, `value`, `amount`,`discount`,`ordering` ) VALUES ";

                // loop through the rows
                for($rowCounter = 0; $rowCounter < $countRecords; $rowCounter++) 
                    {


                    // assign variables based on each loop iteration
                    $invoiceID = htmlentities($_POST['invoice_id'], ENT_QUOTES);
                    $program = htmlentities($_POST['name'], ENT_QUOTES);
                    $forWeek = htmlentities($_POST['desc'], ENT_QUOTES);
                    $value = htmlentities($_POST['value'], ENT_QUOTES);
                    $qty = htmlentities($_POST['amount'], ENT_QUOTES);


                    // put the VALUES array string for each row as such
                    $ValuesAddToQuery[] ="(NULL, '$invoiceID', '$program', '$forWeek', '$value', '$qty','0.00','1')";


                    }

                    // add all the values into the statement
                    $stmt .= implode(',',$ValuesAddToQuery);

                    echo $stmt."<br /><br />";

                    var_dump($ValuesAddToQuery);

                    // execute statement
                    //mysql_query($stmt) or exit(mysql_error());

有關更多細節,我從這里的前一張發票中獲取數據:

    <td>
    <input type="number" title="'.$row->invoice_id_on_items.'" name="invoice_id" size="2" id="invoice_id" value="' . $row->invoice_id_on_items. '" />
</td>

<td>(<a href="getIndItems.php?id=' .$row->item_id. '" target="_blank">EDIT</a>)<br>'.$row->item_id.'</td>';

$_SESSION['itemIDSelected']=$row->item_id;

echo'

<input type="hidden" title="'.$row->item_id.'" name="id" size="13" id="id" value="'.$row->item_id. '" />

<td>
    <input type="text" title="'.$row->forweek.'" name="desc" size="15" id="desc" value="' . $row->forweek. '" />
</td>
<td>
    <input type="text" title="'.$row->program.'" name="name" size="50" id="name" value="' . $row->program. '" />
</td>
<td>
    <input type="number" title="'.$row->fee.'" name="value" size="3" id="value" value="' . $row->fee. '" />
</td>
<td>
    <input type="number" title="'.$row->qty.'" name="amount" size="3" id="amount" value="' . $row->qty. '" />
</td>
';
$Fee = floatval($row->fee);
$Qty = floatval($row->qty);
$ItemFee=$Fee*$Qty;
echo '
<td>
    <input type="text" title="'.$ItemFee.'" name="total_fee" size="3" id="total_fee" value="' . $ItemFee. '" />
</td>

然后,我使用上面已經說明的循環代碼來獲取數據。 我能夠毫無問題地檢索過去的發票數據,但希望將其包括在我的問題中,以便您獲得所有必要的信息以提供指導。

這個:

$invoiceID = htmlentities($_POST['invoice_id'], ENT_QUOTES);
$program = htmlentities($_POST['name'], ENT_QUOTES);
$forWeek = htmlentities($_POST['desc'], ENT_QUOTES);
$value = htmlentities($_POST['value'], ENT_QUOTES);
$qty = htmlentities($_POST['amount'], ENT_QUOTES);

每次通過循環,您都將從$_POST獲得相同的值 (您多次遍歷此代碼,但是每次都獲得“ invoice_id”,“ name”,“ desc”等)

如果要從同一表單中獲取多個值,則每個值必須具有不同的名稱,然后將其通過POST傳遞給腳本。

例如,您可以在每個字段之后添加一個數字,然后使用循環計數器變量。

HTML:

<input name="invoice_id0" ... />
<input name="name0" ... />
<input name="desc0" ... />

<input name="invoice_id1" ... />
<input name="name1" ... />
<input name="desc1" ... />

PHP-在您的循環中:

$invoiceID = htmlentities($_POST['invoice_id' . $rowCounter], ENT_QUOTES);
$program = htmlentities($_POST['name' . $rowCounter], ENT_QUOTES);
$forWeek = htmlentities($_POST['desc' . $rowCounter], ENT_QUOTES);

但實際上,您確實不應該像您所做的那樣將用戶提供的值注入SQL查詢中。 請改用參數。 (盡管仍然適用從上面為每個循環迭代獲取適當值的邏輯。只是不要將其連接到VALUES語句中。)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM