你能解释一下为什么这段代码不插入数据库吗?
//INSERT VALUES IN ORDERS
$sqlInsert = "";
for($i = 0; $i < count($_SESSION['cart']); $i++)
{
$resSelect = mysqli_fetch_assoc($sqlContent);
$prodID = $resSelect['ProdID'];
$price = $resSelect['Price'];
$quantity = $_SESSION['cart'][$resSelect['ProdID']];
$sum = ($_SESSION['cart'][$resSelect['ProdID']] *
$resSelect['Price']);
$sqlInsert .= "INSERT into Order (ProdID,
Quantity, Price, Sum, OrderID)
VALUES ($prodID, $quantity, $price, $sum, $userID);";
}
mysqli_query($dbLink, $sqlInsert);
这是var_dump($sqlInsert)
的输出:
INSERT INTO Order (ProdID, quantity,
Price, Sum, OrderID) VALUES (1, 4, 200, 800, 10);
INSERT INTO Order (ProdID, quantity,
Price, Sum, OrderID) VALUES (7, 3, 200, 600, 10);
INSERT INTO Order (ProdID, quantity,
Price, Sum, OrderID) VALUES (9, 3, 200, 600, 10);
这适用于数据库。
并且var_dump(mysqli_query($dbLink, $sqlInsert))
的输出始终为false。
非常感谢提前
答案 0 :(得分:2)
正如上面提到的其他评论所述,您应该始终检查mysqli_query()
返回的错误。请参阅示例代码:http://php.net/manual/en/mysqli.error.php
mysqli_query()
函数不支持执行多个语句。
我不建议使用mysqli_multi_query()
。使用它几乎没有任何好处,它引入了新的潜在SQL注入漏洞(如着名的Little Bobby Tables cartoon)。我与前任MySQL工程总监进行了交谈,他说(释义):“没有理由存在多查询,它只能造成伤害。”
您应该一次执行一个INSERT语句。没有理由将多个语句附加在一起。
如果您担心多个语句的性能开销,可以将多行附加到单个INSERT语句中。或者,您可以在事务中包装一系列单独的INSERT语句。
您可能希望阅读我的演示文稿Load Data Fast!,其中我会比较插入多行数据的各种策略的效果。
答案 1 :(得分:2)
这正是预备陈述的用途:
// Note that ORDER is a MySQL reserved keyword and needs special escaping
$stmt = $dbLink->prepare("INSERT into `Order` (ProdID,
Quantity, Price, Sum, OrderID) VALUES (?,?,?,?,?)");
$stmt->bind_param('iiddi', $ProdID, $Quantity, $Price, $Sum, $OrderID);
for($i = 0; $i < count($_SESSION['cart']); $i++)
{
$resSelect = $sqlContent->fetch_assoc();
$ProdID = $resSelect['ProdID'];
$Quantity = $_SESSION['cart'][$resSelect['ProdID']];
$Price = $resSelect['Price'];
$Sum = $_SESSION['cart'][$resSelect['ProdID']] * $resSelect['Price'];
$OrderID = $userID;
$stmt->execute();
}
原始代码中存在大量错误,导致其无法正常工作,因此您需要在未来更加小心,并更有条理地针对解决方案。逐步建立,随时测试,以确保您不会深入了解您不完全理解的解决方案。