当前位置: 首页 > 知识库问答 >
问题:

PHP/MySQLi中的多个SQL对象

易京
2023-03-14

一段时间以来,我一直在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循环中,但这将我的问题作为解决方案发布。

共有1个答案

曹钊
2023-03-14

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

同时两个语句=

另外,您的问题可以在单个查询中解决,如:

$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();
 类似资料:
  • 主要内容:PHP MySQLi 简介,安装 / Runtime 配置,PHP 5 MySQLi 函数PHP MySQLi 简介 PHP MySQLi = PHP MySQL Improved! MySQLi 函数允许您访问 MySQL 数据库服务器。 注释:MySQLi 扩展被设计用于 MySQL 4.1.13 版本或更新的版本。 安装 / Runtime 配置 为了能够顺利使用 MySQLi 函数,您必须在编译 PHP 时添加对 MySQLi 扩展的支持。 MySQLi 扩展是在 PHP 5.

  • 我真的希望有人能帮我弄清楚我到底错过了什么。我已经将我的安装从PHP5.6升级到7.0,这迫使我从Mysql更新到Mysqli。由于某种原因,我的安装被破坏了。 我研究并遵循了“在其他类使用MySQLi”指南:在其他类使用MySQLi 我写作为最后的手段,也看了其他网站,但似乎问题来自其他地方。 首先,我有一个数据库类: 然后我有一个API类,我想在其中访问这个连接,它看起来像 最后我试着从一个函

  • 问题内容: 这个问题已经在这里有了答案 : 如何防止PHP中进行SQL注入? (28个答案) 7年前关闭。 我已经建立了一个网站,该网站即将上线,并且有几个关于防止SQL注入的问题,我知道如何使用,但是我只是想知道是否必须在要获取的所有变量上使用它SQL语句,是否在执行select语句时还是在插入更新和删除时必须使用它?另外,在我将网站投入使用之前,您还建议我实施哪些其他安全措施,在此先感谢您的帮

  • 问题内容: 我有一个具有多个结果集的存储过程。我如何前进到mysqli中的第二个结果集以获得那些结果? 假设它是一个存储过程,例如: PHP是这样的: 这就是我无法工作的部分。我尝试使用mysqli_next_result移至下一个结果集,但无法使其正常工作。我们确实使它可以与mysqli_store_result和mysqli_fetch_assoc / array / row一起使用,但是由于

  • PHP MySQLi Database Class 是个一个 PHP 封装的 MySQL 类,使用 MySQLi 。 插入查询 $data = array(    'login' => 'admin',    'firstName' => 'John',    'lastName' => 'Doe',);$id = $db->insert('users', $data)if($id)    ech

  • 问题内容: 我有一个很大的函数,它可以获取很多不同的数据并将其插入到多个表中。.并非所有数据都始终可用,因此并非所有的SQL INSERT查询都成功。我需要检查哪个SQL INSERT查询完全成功,而哪个则不能对这些数据执行某些操作(例如插入到日志表或类似表中)。 只是给你一个我认为可以做到的例子: 我不完全确定这是最好的方法,如果它总是真正显示出是否已将数据插入表中…有什么建议吗? 问题答案: