使用php从html表单多次插入Mysql
非常感谢您的帮助,Mysql DB正常工作,现在我遇到了一个小问题,希望我能尽快解决,当然还有一点帮助,下面是我的Html表单:使用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
<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