【问题标题】:php mysqli_multi_query() stops inserting after first queryphp mysqli_multi_query() 在第一次查询后停止插入
【发布时间】:2016-11-26 17:08:06
【问题描述】:

我正在尝试使用mysqli_multi_query 函数将多行插入到同一个表中,但它只执行第一个查询。我也尝试将值添加到第一个查询的末尾,用逗号分隔,但似乎没有任何效果。有什么建议吗?

我已切换到准备好的语句,但仍然只插入第一个结果。我错过了什么吗?

$DBConnect = mysqli_connect("localhost", "root", "", "getpressed");

if ($DBConnect->connect_error) {
die("Connection failed: " . $DBConnect->connect_error);

}

$stmt = $DBConnect->prepare("INSERT INTO orderdetails (orderID, productID, quantity) VALUES (?, ?, ?)");
$stmt->bind_param("iii", $orderID, $productID, $quantity);

$orderID = $orderID;
$productID = 1;
$quantity = $sportShirtQuantity;
$stmt->execute();

$orderID = $orderID;
$productID = 2;
$quantity = $sportCoatQuantity;
$stmt->execute();

echo "New records created successfully";

$stmt->close();
$DBConnect->close();

【问题讨论】:

  • 不要使用此功能。它本质上是危险的。将prepared statements 与占位符值一起使用,并使用bind_param 将用户数据添加到您的查询中。您可以将其作为具有两组值的单数 INSERT 执行此操作,或者使用不同绑定执行两次的准备好的 INSERT。无论哪种方式都比您在这里的方式要好得多。
  • 到目前为止提供的所有愚蠢答案中,唯一的,我的意思是唯一正确的方法是@tadman 写的。它更快,它微不足道,它可以抵抗max_allowed_packet,它是安全的。与准备好的陈述相比,任何其他解决方案,无论有人会告诉你什么,都是马粪。

标签: php mysql mysqli-multi-query


【解决方案1】:

我在 orderID 上有一个主键索引,它不允许我插入具有相同 orderID 的多行。我是个白痴。感谢大家的帮助。按照 tadman 的建议,使用准备好的语句确实可以更好地工作。

【讨论】:

    【解决方案2】:

    我稍微修改了你的代码

    $mysqli = new mysqli("localhost", "root", "", "getpressed");
    
    if ($mysqli->connect_errno) {
        die("Connection failed: " . $mysqli->connect_error);
    }
    
    $sql = "INSERT INTO orderdetails (orderID, productID, quantity) VALUES ('".$orderID."', 1, '".$sportShirtQuantity."');";
    $sql .= "INSERT INTO orderdetails (orderID, productID, quantity) VALUES ('".$orderID."', 2, '".$sportCoatQuantity."');";
    
    if ($mysqli->multi_query($sql))) {
        echo "New records created successfully";
    } else {
        echo "Error: " . $sql . "<br>" . mysqli_error($mysqli);
    }
    do {
        if ($res = $mysqli->store_result()) {
            var_dump($res->fetch_all(MYSQLI_ASSOC));
            $res->free();
        }
    } while ($mysqli->more_results() && $mysqli->next_result());
    

    我也强烈建议您以后使用 PDO 准备语句。

    【讨论】:

    • 为什么 OP 应该“试试这个”? 好的答案将始终解释所做的事情以及为什么以这种方式完成,不仅是为了 OP,也是为了 SO 的未来访问者。跨度>
    【解决方案3】:

    删除最后一条语句的分号。文档指出,此方法的分号用于连接语句,而不是结束它们。

    在此处阅读文档:Link

    $sql = "INSERT INTO orderdetails (orderID, productID, quantity) VALUES ('".$orderID."', 1, '".$sportShirtQuantity."');";
    $sql .= "INSERT INTO orderdetails (orderID, productID, quantity) VALUES ('".$orderID."', 2, '".$sportCoatQuantity."')";
    

    【讨论】:

    • 试过了,还是没有骰子。只插入第一行。
    • 另外,看看你的代码,你将程序 PHP 与 O-O PHP 混合在一起,尝试只坚持一种约定,因为它们不兼容。
    猜你喜欢
    • 1970-01-01
    • 2018-07-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-15
    • 1970-01-01
    相关资源
    最近更新 更多