【问题标题】:Mysqli returning error "Commands out of sync" when trying to do multiple prepared statements尝试执行多个准备好的语句时,Mysqli 返回错误“命令不同步”
【发布时间】:2015-01-03 16:19:18
【问题描述】:

我在 $noofspellschamps->bind_param('ss', $Patch_No, $champion); 上收到错误“调用成员函数 bind_param()”;我已经测试了一些东西,这不是 Prepare 的问题,因为它在 phpmyadmin 上运行良好,我认为问题出在执行上,或者我可能需要先关闭来自 $champions 的流,但我需要它们,正如你在循环我不太确定该怎么做。

EDIT2 有没有人知道问题所在并可以提供帮助?

 $i=1;
                $champion = array();
                $noofspellschamp = array();

                $Patch_No = trim($_GET['Patch_No']);

                $champions = $conn->prepare("SELECT champion FROM champions where Patch_No = ?");
                $champions->bind_param('s', $Patch_No);
                $champions->execute();
                //$champions->close();

                $champions->bind_result($champ);



                    while($champions->fetch()){

                        $champion[$i]=$champ;    

                        $noofspellschamps =$conn->prepare(
                        "SELECT Passive, Q, W, E, R,
                                ((Passive != '') + (Q != '') + (W != '') + (E != '') + (R != '')
                                ) as NumNotNull
                        FROM champions
                        WHERE Patch_No = ? AND Champion = ?");
                        $noofspellschamps->bind_param('ss', $Patch_No, $champion);
                        $noofspellschamps->execute();
                        $noofspellschamps->bind_result($noofspellsch);



                        while($noofspellschamps->fetch()){
                            $noofspellschamp[$i] = $noofspellsch['NumNotNull'];
                            echo $noofspellschamp[$i];
                        }
                        $i+=1;
                    }

【问题讨论】:

  • 有帮助的:$result = $noofspellschamps->bind_param('ss, $Patch_No, $champion); if($result === false) echo $conn->error; 检查您的退货false 并使用 mysqli 错误函数来帮助确定问题。
  • 类似地检查每个准备和绑定调用的错误。那里有一条错误消息告诉你这是一个 sql 语法问题,你的参数有问题,等等。
  • 试过了,没有任何运气
  • 请按原样发布整个错误消息。您在调用bind_param 之前检查了$noofspellchamps 的值吗?
  • 致命错误:在第 54 行的 C:\wamp\www\leaguenotes2.0\index.php 中的非对象上调用成员函数 bind_param() 还尝试回显 $noofspellschamps 并执行$result = ... 然后 $conn->error;

标签: php sql arrays mysqli prepared-statement


【解决方案1】:

编辑 2

您收到“命令不同步错误”的原因是,当仍有从先前正在进行的查询中获取的行时,mysql 客户端不允许您执行新的查询/子查询。 Commands out of sync

使用提供的示例。 (可能需要根据自己的喜好进行更改)

$i=1;
$champion = array();
$noofspellschamp = array();

$Patch_No = trim($_GET['Patch_No']);

// query 1
$champions = $conn->prepare("SELECT champion FROM champions where Patch_No = ?");
$champions->bind_param('s', $Patch_No);
$champions->execute();
$result = $champions->get_result();


while($data = $result->fetch_assoc()){

    // use data variable as an associative array

    //query 2
    $noofspellschamps = $conn->prepare(
    "SELECT Passive, Q, W, E, R,
            ((Passive != '') + (Q != '') + (W != '') + (E != '') + (R != '')
            ) as NumNotNull
    FROM champions
    WHERE Patch_No = ? AND Champion = ?");

    $noofspellschamps->bind_param('ss', $Patch_No, $data["champion"]);
    $noofspellschamps->execute();
    $result2 = $champions->get_result();



    while($data2 = $result2->fetch_assoc()){
        // other stuff with data2 variable
    }

    $i++;
}

从 PHP 5.3 开始,mysqli_stmt::get_result 返回一个结果集对象。您可以使用mysqli_result::fetch_array()mysqli_result::fetch_assoc()。但是,请注意,这仅适用于本机 MySQL 驱动程序。

本质上:

$stmt = $con->prepare("SELECT id FROM table1"); // first prepared statement
$stmt->execute(); 
$result = $stmt->get_result(); // Gets a result set from a prepared statement
while($data = $result->fetch_assoc()) {  
    // do stuff with first set of data

    $stmt2 = $con->prepare("SELECT * from table2 WHERE id = ?"); // second prepared statement
    $stmt2->bind_param('s', $data["id"]);
    $stmt2->execute(); // execute second statement
    $result2 = $stmt2->get_result();
    while($data2 = $result2->fetch_assoc()) { 

        // do stuff with second set of data
    }

}

【讨论】:

  • 忘记编辑实际上和半小时前一样,同样的错误让我很生气
  • 尝试在你的对象上做一个 var_dump / print_r 看看它会给你什么。
  • 你的 $noofspellschamps 变量怎么样。你应该得到一个类型对象。
  • 从 var_dump($noofspellschamps) 我得到布尔值 false
  • 如果你的prepared statement返回一个false值boolean,这意味着发生了错误。否则它应该返回一个语句对象。尝试输出错误$conn->error
猜你喜欢
  • 2011-04-15
  • 1970-01-01
  • 1970-01-01
  • 2012-01-31
  • 2014-06-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多