PHP/MySQLi 中的多个 SQL 对象


Multiple SQL objects in PHP/MySQLi

一段时间

以来,我一直在php中使用多个SQL连接来避免"您现在无法运行此命令。命令不同步"错误。

似乎我无法弄清楚什么时候我只能用一个连接,什么时候需要多个连接。下面的代码是我如何从彼此相关的不同表中检索内容。

$sql是连接到同一数据库的默认 mysqli 对象。示例是问题的简化版本,如果您想知道,它没有真正的目的。

$stmt1 = $sql1->prepare ('SELECT orderid,date FROM orders');
$stmt2 = $sql2->prepare ('SELECT product,price FROM orderlines WHERE orderid= ?');
$stmt1->execute();
$stmt1->bind_result($orderid,$date);
while ($stmt1->fetch()) {
echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";
$stmt2->bind_param("i",$orderid);
$stmt2->execute();
$stmt2->bind_result($product, $price);
 while ($stmt2->fetch() {
  echo "Product from order is: " . $product . " and costs " . $price . "<br>";
 }
echo "End of order " . $orderid;
}
$stmt1->close();
$stmt2->close();
$sql1->close();
$sql2->close();

这有效,但前提是我不使用相同的 mysqli 对象。如果我尝试只使用一个公共$sql对象来执行这两项操作,则第二个 stmt 的结果将保持为空。

所以问题是:这是否应该发生,上述方法是好的做法还是坏做法?

我对此没有任何问题 - 一切都运行良好,但这样做的方式对我来说似乎很奇怪,我找不到有关此特定问题的任何内容。

编辑:将问题更新为带有订单和订单行的示例,以显示发生这种情况的位置。

编辑2:我发现了两个mysqli查询,一个在while循环中 - 但这发布了我的问题作为解决方案。

在一个MySQL连接中,您一次只能使用一个查询。您可以一次准备更多语句(这些数据仍保存在MySQLi驱动程序中(,但是,一旦使用execute((,语句将被发送到数据库,数据库将期望所有未来的bind_param((和bind_result((请求都是相同的语句,直到您发送新语句。

同时两个语句 => 两个连接到数据库 =>两个 mysqli 对象。


此外,您的问题可以通过单个查询解决,例如:

$stmt1 = $sql1->prepare ('SELECT o.orderid,o.date,b.product,b.price FROM orders o LEFT JOIN orderlines b ON b.orderid=o.orderid ORDER BY o.orderid');
$stmt1->execute();
$stmt1->bind_result($orderid,$date,$product,$price);
$prev_order_id=false;
while ($stmt1->fetch())
{
    if($prev_order_id!=$orderid)
    {
        if($prev_order_id!==false)
            echo "End of order " . $prev_orderid."<br>";
        echo "Order ID: " . $orderid . " from date: " . $date . ":<br>";
    }
    if(is_null($product))
        echo "Product from order is: " . $product . " and costs " . $price . "<br>";
    $prev_order_id=$orderid;
}
if($prev_order_id!==false)
    echo "End of order " . $prev_orderid."<br>";
$stmt1->close();
$sql1->close();