【发布时间】:2014-12-15 16:02:51
【问题描述】:
问题背景
我对我所使用的大多数语言都比较陌生,并且我正在逐渐回过头来改进旧代码。我正在重写一些旧的 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
}
问题
用CALLs 将我的第一个查询和第二个查询替换为存储过程后,我收到错误#2014 - Commands out of sync; you can't run this command now。
尝试解决问题的步骤
This poster on Stack Overflow 遇到了类似的问题,接受的答案建议致电
next_result()解决他们的问题。 但是,我想在生成表单之前检查对数据库的两次调用是否成功,我不想按原样生成一半。我看到 another question 提问者遇到了同样的问题,而且似乎
next_result()是不可避免的,因为“这就是 mysqli 的工作方式” - 为什么这适用于“原始”SQL 但不适用于存储过程?有什么不同?在生成我的表单之前,是否有一种有效的方法来检查两个查询是否成功?我想了解发生了什么以及为什么会改变行为。我偶然发现了documentation for
mysqli_store_result(),它看起来可能很有用。我一直在阅读本文档的 cmets,但完全不清楚。好像是the solution is to call
next_result()on the mysqli object between calls,我从this Stack Overflow question.了解到
【问题讨论】:
-
我认为是因为程序可以请求一些时间来运行。第二个过程在逻辑上不能使用相同的数据库连接同时运行。也许如果你启动两个不同的连接,你可以避免这个问题
-
啊,对。那么存储过程可以请求时间运行哪些语句不做呢?打开几个连接似乎相当混乱......(除非我的假设是错误的)有没有更好的方法?
-
可能是在等待第一个程序停止运行?请记住,语句处理由服务器端编程控制,存储过程(我在 java/oracle 中看到)由 db 命令。
标签: php mysql stored-procedures mysqli