非常感谢您的帮助,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})");
}