问题背景
我对我工作的大多数语言都比较新,而且我逐渐回过头来改进旧代码。我正在重写一些旧的PHP并用调用存储过程替换硬编码的SQL查询(我知道)。
我页面中的代码按以下顺序组织 -
$RESULT_one = $connection->query( ... my first query ... );
$RESULT_two = $connection->query( ... my second query ... );
if(isset($RESULT_one) & isset($RESULT_two))
{
// Generate a form using the results from the queries
// Loop through $RESULT_one to populate a combo box
$RESULT_one->free();
// Loop through $RESULT_two to populate a combo box
$RESULT_two->free();
}
else
{
// Display an error to the user rather than displaying the form
}
问题
将我的第一个查询和第二个查询用CALL
替换为存储过程后,收到错误#2014 - Commands out of sync; you can't run this command now
。
尝试解决问题的步骤
This poster on Stack Overflow遇到了类似的问题,接受的答案建议调用next_result()
解决问题。 然而,我想在生成表单之前检查对数据库的两次调用是否成功,我不想半生成它,就像它一样。
我看到another question提问者遇到了同样的问题,似乎next_result()
是不可避免的,因为"这就是mysqli的工作原理" - 为什么这适用于' raw' SQL而不是存储过程?有什么不同?在生成表单之前,是否有一种有效的方法可以检查两个查询是否成功?我想了解发生了什么以及行为改变的原因。
我偶然发现documentation for mysqli_store_result()
这似乎是可能有用的东西。我一直在阅读本文档的评论,但它一点也不清楚。
似乎是the solution is to call next_result()
on the mysqli object between calls,正如我从this Stack Overflow question.了解到的
答案 0 :(得分:1)
调用多个存储过程时,除非采取措施防止错误,否则可能会发生错误Commands out of sync; you can't run this command now
。
一种方法是在每次存储过程调用as described here后调用mysqli对象上的next_result()
。
答案 1 :(得分:0)
我在phpmyadmin和在php中运行查询时都遇到了这个错误,只是按建议的方式调用next_result()对我不起作用。从MS-SQL到MariaDB,我需要更改存储过程,以避免使用直接的“ SELECT”查询来填充变量,而是使用“ SELECT ... INTO”查询。普通的SELECT语句在单独的结果集中将所选数据回显给调用方。我相信您随后需要为在存储过程中执行的每个 SELECT语句调用一次“ next_result”,然后才能调用新过程。 “ SELECT ... INTO”不回显任何可大大提高速度并避免此错误的数据。