【问题标题】:Loop through rows and INSERT multiple rows into MySQL循环遍历行并将多行插入 MySQL
【发布时间】:2015-10-30 12:35:53
【问题描述】:

简而言之,我正在循环并尝试插入所有行,但它只插入最后一行的次数与它循环的次数一样多。因此,对于两个循环,它将循环两次,并插入最后一行两次(根本不插入第一行)。

我将其用作行/项目计数器:

$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>

然后,我使用上面已经说明的循环代码来获取数据。我能够毫无问题地检索过去的发票数据,但希望将其包含在我的问题中,以便您获得所有必要的信息来提供指导。

【问题讨论】:

  • // add all the values into the statement $stmt .= implode(',',$ValuesAddToQuery); echo $stmt; // execute statement //mysql_query($stmt) or exit(mysql_error()); 将这些行放入循环中
  • 谢谢。如果我这样做,它似乎将最后一行添加一次,然后再次循环并添加最后一行两次。 . .因此,最后一行添加了三行。奇怪。
  • 您是否从多个输入中获取数据?(表中的多行)

标签: php mysql arrays loops


【解决方案1】:

这个:

$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 语句中。)

【讨论】:

  • 谢谢。这很有意义。我做了改变。它显示插入的第一行的空值和输入的第二行的第一个值。然后我将“1”的值添加到输入计数器,它可以工作。在表单代码上,我在数据之前添加了循环,而不是之后。再次感谢。
猜你喜欢
  • 2015-12-23
  • 1970-01-01
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多