所以我在MySQL数据库中有三个表:
order(id, etc..),
product(id, title, etc..)
orderproduct(productFK, orderFK)
现在我希望能够为包含多个产品的订单插入一个订单ID和(在某些情况下)多个产品ID的订单:
order 1: orderid = 1, productids = 1
order 2: orderid = 2, productids = 2, 3
这一点使用预备语句,如:
$stmt = $mysqli->prepare("INSERT INTO orderproduct (orderFK, productFK)
VALUES (?, ?)");
$result = $stmt->bind_param('ss', $orderid, $productid);
if($stmt->execute() == false) {
$flag = false;
}
$stmt->close();
一个显而易见的解决方案是循环插入查询,但还有另一种方法可以执行此操作而无需多次调用数据库吗?
这是有效的(硬编码),但我仍然无法弄清楚如何动态填充bind_param ..
$strings = "";
$values = "";
foreach ($params['products'] as $product) {
$strings .= 'ss';
$values .= "(?, ?),";
}
$values = substr($values, 0, -1);
$productid = array(1, 2);
$stmt = $mysqli->prepare("INSERT INTO orderproduct (orderFK, productFK)
VALUES " . $values);
$result = $stmt->bind_param($strings, $orderid, $productid[0], $orderid, $productid[1]);
if($stmt->execute() == false) {
$flag = false;
}
$stmt->close();
答案 0 :(得分:2)
如果您使用的是php 5.6+,则可以使用argument unpacking ...
来绑定变量:
$args = [
$arg1,
$arg2,
$arg3,
$arg4,
];
$result = $stmt->bind_param($strings, ...$args);
另一种方法是使用PDO,您可以在其中发送一组参数以绑定到execute()
方法。
答案 1 :(得分:0)
Mysql很乐意处理类似的事情:
boost::for_each(
boost::combined(myVector, myOtherVector) | strided(2), doSomethingElse)
(直到max_allowed_packet)然而干净地表达bind_param()调用(以易于调试的方式)将是相当困难的。使用call_user_func_array()调用意味着您只需传递一个数组作为参数,但仍需要将二维数据集映射到一维数组。
以前我使用过程mysql api进行多次插入,从而显着提高了插入速度和更好的平衡索引。