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

时间:2012-03-05 17:53:19

标签: php mysql html

非常感谢你的帮助,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,我看了myhtml的错误,我的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行(trans_date,product_id(FK),stock_plus)当回显Mysql错误时,没有。

2 个答案:

答案 0 :(得分:3)

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

试试这个:

$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/>";
}

答案 1 :(得分:1)

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

但是,鉴于您多次执行相同的查询,我强烈建议您开始使用MySQLi或PDO和预处理语句。当您使用预准备语句时,它是预编译的,这意味着当您重新运行相同的查询但仅使用不同的数据时,您将获得巨大的性能提升。我强烈建议你仔细看看。

获得未定义偏移量的原因是因为数组中不存在数组索引2。你的代码对我来说有点混乱 - 你的for循环排除了你的mysql_query。您需要在for循环中执行mysql_query。你最好围绕product_ids做一个例子。

$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})");
}