使用php从html表单多次插入Mysql


Multiple insert into Mysql from an html form using php

非常感谢您的帮助,Mysql-DB可以工作,现在我遇到了一个小问题,希望我能尽快解决,当然还有一点帮助,所以这里是我的Html表单:

<div>Date: 
    <input onclick="ds_sh(this);" name="trans_date" readonly="readonly" style="cursor: text" /><br/><br/>
    Product:
    <select name="product_id []">
        <option value="1">Item1</option>
        <option value="2">Item2</option>
        <option value="3">Item3</option>
        <option value="4">Item4</option>
        <option value="5">Item5</option>
    </select>
    Quantity:
    <input type="text" name="stock_plus []" /><br/>
</div>

这个div重复10次或更多次,我使用该表单让用户添加所选产品的库存计数

现在,当我尝试使用PHP在表上插入行时:

1-方法1:

PHP代码:

$product = $_POST['product_id']; $stock_plus = $_POST['stock_plus'];
$Date = $_POST['trans_date']; $limit = count($stock_plus);
for($i=0;$i<$limit;$i++) {
    $product[$i] = mysql_real_escape_string($product[$i]);
    $stock_plus[$i] = mysql_real_escape_string($stock_plus[$i]);
}
$query = "INSERT INTO table (trans_date, product_id, stock_plus)
VALUES ('".$Date."','".$product[$i]."','".$stock_plus[$i]."')";
if(mysql_query($query))
    echo "$i successfully inserted.<br/>";
else
    echo "$i encountered an error.<br/>";

我得到:注意:未定义的偏移:2。。。并且不是所有的行都被插入。

方法2:

PHP代码:

$trans_date=$_POST['trans_date']; $sql = 'INSERT INTO table
(trans_date, product_id, stock_plus) VALUES ';
for($i = 0;$i < count($_POST['product_id']);$i++) {
    $sql .= "('$trans_date','".$_POST['product_id'][$i]."','".$_POST['stock_plus']i]."')";
    if($i != count($_POST['product_id']) - 1)
    {
        $sql .= ',';  
    } 
}
if (!mysql_query($sql))   {   die('Error: ' . mysql_error());   }

这里没有错误,但并不是所有的行都被插入。关于,你能帮我更清楚地看看我错过了什么吗

附加:

谢谢Travesty3,我也查看了我的HTML中的错误,我的HTML正文看起来完全像:

<body>
<form action="../inserts/stock_insert.php" method="post">
<div>
<!-- JS Datepicker -->
Date: <input onclick="ds_sh(this);" name="trans_date" readonly="readonly" style="cursor: text" />
<br/>
<!-- User should select product -->
Product:<select name="product_id []">
<option value="1">Item1</option>
<option value="2">Item2</option>
<option value="3">Item3</option>
<option value="4">Item4</option>
<option value="5">Item5</option>
</select>
<!-- User must enter the quantity -->
Quantity: <input type="text" name="stock_plus []" /><br/>
</div> 
<input type="submit" name="Submit" value="Submit" />
</form>
</body>

div重复了10次,所以我的DB表中应该有10行insterted(trans_date,product_id(FK),stock_plus)。当回显Mysql错误时,没有任何错误。

您在循环之外执行查询,因此只执行一次插入。在for循环中移动查询。

试试这个:

$product = $_POST['product_id'];
$stock_plus = $_POST['stock_plus'];
$Date = mysql_real_escape_string($_POST['trans_date']);
$limit = count($stock_plus);
for ($i=0; $i<$limit; $i++)
{
    $product[$i] = mysql_real_escape_string($product[$i]);
    $stock_plus[$i] = mysql_real_escape_string($stock_plus[$i]);
    if(mysql_query("INSERT INTO table (trans_date, product_id, stock_plus) VALUES ('{$Date}', '{$product[$i]}', '{$stock_plus[$i]}')"))
        echo "$i successfully inserted.<br/>";
    else
        echo "$i encountered an error.<br/>";
}

首先,也是最重要的一点,在您做任何事情之前,修复这两种方法中的巨大安全漏洞。您允许将未初始化的用户输入直接插入到允许SQL注入的SQL查询中。毫无例外,您必须始终对用户的输入进行消毒。为此,在将所有变量放入查询之前,先通过mysql_real_eescape_string传递它们。您已经对一些输入进行了消毒,但没有对$date进行消毒。我想这是因为它来自一个日期选择器,你看不到风险。您永远不应该依赖任何客户端的安全性,因为它总是可以更改的——始终包括服务器端验证和消毒。例如,恶意用户可以在将日期发布到服务器之前,通过自己的javascript修改日期。

但是,如果您多次执行相同的查询,我强烈建议您开始使用MySQLi或PDO和准备好的语句。当您使用准备好的语句时,它是预编译的,这意味着当您重新运行相同的查询但只使用不同的数据时,性能会大大提高。我强烈建议你查一下。

得到未定义偏移量的原因是数组中不存在数组索引2。您的代码看起来有点让我困惑——您的for循环排除了您的mysql_query。您需要在for循环中执行mysql_query。你最好在产品ID上做一个foreach,例如

$i = -1;
$product_ids = $_POST['product_id'];
$stock_plus = $_POST['stock_plus'];
$date = mysql_real_escape_string($_POST['trans_date']);
foreach($product_ids as $product_id) {
    $product_id = mysql_real_escape_string($product_id);
    $stock = mysql_real_escape_string($stock_plus[++$i]);
    mysql_query("INSERT INTO table (trans_date, product_id, stock_plus) VALUES ({$date}, {$product_id}, {$stock})");
}