插入带有一个插入的多行

时间:2017-05-22 19:17:17

标签: php arrays insert prepared-statement

所以我在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();

2 个答案:

答案 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_pa​​cket)然而干净地表达bind_param()调用(以易于调试的方式)将是相当困难的。使用call_user_func_array()调用意味着您只需传递一个数组作为参数,但仍需要将二维数据集映射到一维数组。

以前我使用过程mysql api进行多次插入,从而显着提高了插入速度和更好的平衡索引。