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

使用php从html表单多次插入Mysql,php,mysql,html,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_i

非常感谢您的帮助,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>
日期:


产品: 项目1 项目2 项目3 项目4 项目5 数量:
这个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/>";
$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());   }
$product=$\u POST['product\u id']$股票加成=$_POST[‘股票加成’];
$Date=$\u POST['trans\u Date']$限额=计数($stock\u plus);
对于($i=0;$i)
产品:
项目1
项目2
项目3
项目4
项目5
数量:

div重复了10次,因此我应该在我的DB表中显示10行(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/>";
}
$product=$\u POST['product\u id'];
$stock\u plus=$\u POST['stock\u plus'];
$Date=mysql\u real\u escape\u字符串($\u POST['trans\u Date']);
$limit=计数($stock\u plus);

对于($i=0;$i您正在循环外执行查询,因此只执行一次插入。请将查询移动到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/>";
}
$product=$\u POST['product\u id'];
$stock\u plus=$\u POST['stock\u plus'];
$Date=mysql\u real\u escape\u字符串($\u POST['trans\u Date']);
$limit=计数($stock\u plus);

对于($i=0;$i首先,最重要的是,在您采取任何行动之前,请修复这两种方法中的巨大安全漏洞。您允许未初始化的用户输入直接插入到允许SQL注入的SQL查询中。您必须毫无例外地始终清理来自用户的输入。为此,请通过mysql\u real传递所有变量_在将其放入查询之前,请先对字符串进行转义。您已清理了一些输入,但没有清理$date。我假设这是因为它来自日期选择器,您没有看到风险。您永远不应该依赖客户端的任何安全性,因为它总是可以更改的-始终包括服务器端验证和清理例如,恶意用户可以在将日期发布到服务器之前通过自己的javascript修改日期

但是,如果您多次执行相同的查询,我强烈建议您开始使用MySQLi或PDO和prepared语句。当您使用prepared语句时,它是预编译的,这意味着您在重新运行相同的查询但仅使用不同的数据时,会获得很大的性能提升。我强烈建议您查看这一点

获取未定义偏移量的原因是数组中不存在数组索引2。我觉得您的代码有点混乱-for循环排除了mysql\u查询。您需要在for循环中执行mysql\u查询。您最好对产品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})");
}

首先,也是最重要的一点,在您采取任何行动之前,请修复这两种方法中的巨大安全漏洞。您允许未初始化的用户输入直接插入到允许SQL注入的SQL查询中。您必须毫无例外地始终清理用户输入。为此,请通过mysql\u real\u escape\s传递所有变量在将它们放入查询之前尝试。您已经清理了一些输入,但没有清理$date。我假设这是因为它来自日期选择器,并且您没有看到风险。您永远不应该依赖任何客户端的安全性,因为它总是可以更改的-始终包括服务器端验证和清理。a例如,恶意用户可以在将日期发布到服务器之前通过自己的javascript修改日期

但是,如果您多次执行相同的查询,我强烈建议您开始使用MySQLi或PDO和prepared语句。当您使用prepared语句时,它是预编译的,这意味着您在重新运行相同的查询但仅使用不同的数据时,会获得很大的性能提升。我强烈建议您查看这一点

获取未定义偏移量的原因是数组中不存在数组索引2。我觉得您的代码有点混乱-for循环排除了mysql\u查询。您需要在for循环中执行mysql\u查询。您最好对产品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})");
}

灾难性的-请确保这是不可访问的互联网…灾难性的-请确保这是不可访问的互联网…哈哈,你仍然没有逃脱
$date
$product\u id
。我正忙于我的答案,以至于我忘了再次检查代码!失败!谢谢你的建议,没有错误,但只得到了一个row插入最后一个产品id和另一个股票id的组合。您仍然没有逃过
$date
$product\u id
。我正忙于我的答案,以至于忘了再次检查代码!失败!感谢您的建议,使用该选项时没有错误,但只插入了最后一个产品id和另一个股票id的组合行感谢您的回答,但不幸的是,我得到了相同的答案:0已成功插入。注意:第17行C:\xampp\htdocs\doua\inserts\stock\u insert.php中的未定义偏移量:1遇到错误。@JesseJames:这表明在HTML表单中,对于每个
stock\u plus
,您不一定有相应的
产品id
。您可以必须收到
未定义偏移量
消息,因为
$product[1]
不存在(但
$stock\u plus[1]
确实存在)。您可以发布更多的HTML表单吗?不确定您的
mysql\u查询
失败的原因…尝试在
else
语句中回显
mysql\u error()
。@JesseJames