我有以下PHP / MySQL代码:
function executeMultirowQuery($query) {
$result = mysql_query($query);
$table = array();
if ($result == false) {
$error = mysql_error();
echo $error;
} else {
while ($row = mysql_fetch_assoc($result)) {
$table[] = $row;
}
mysql_free_result($result);
}
return $table;
}
它基本上执行给定的查询,并将结果作为多维数组返回。 对此函数的第二次调用(以及所有后续调用)会导致“命令不同步;您现在无法运行此命令”错误。
由于我在返回之前调用了mysql_free_result(),我不认为我仍然有一个请求,但我想不出任何其他原因可能会失败。
有什么想法吗?
编辑: 如果它有任何区别,我正在使用此函数来调用这样的存储过程:
function getGroups($groupTypeID) {
echo "getGroups";
$query = sprintf("CALL getGroups('%s');", mysql_real_escape_string($groupTypeID));
return $this->executeMultirowQuery($query);
}
这是使用executeMultirowQuery()函数的典型方式。
编辑: 这是我的连接代码:
$this->link = mysql_connect($host, $user, $password);
$success = mysql_select_db($database);
if (!$this->link) {
die('Could not connect: ' . mysql_error());
}
此外,这是来自存储过程的示例查询:
CREATE DEFINER=`blah`@`blah` PROCEDURE `getGroups`(
IN inGroupTypeID INT )
BEGIN
SELECT * FROM `db`.`Groups`
WHERE GroupTypeID = inGroupTypeID;
END
同样,这是该功能如何使用的典型。没有任何存储过程返回多个结果集(我理解在PHP / MySQL中不起作用)。
答案 0 :(得分:1)
存储过程返回两个结果集 - 您的数据加上获取的行数计数,因此您需要调用
next_result()
每次db调用后。
你最好使用mysqli vs mysql(只有最新的mysql扩展支持sproc调用)然后你可以使用更快的fetch_all方法来填充你的数组。
$table = $result->fetch_all(MYSQLI_ASSOC);
希望这有帮助
答案 1 :(得分:0)
我认为你应该在$result == false
时做一个mysql_free_result()。因此,请将mysql_free_result($result)
移到else {}之外,并在返回之前移动。
以下链接可能有所帮助:
http://dev.mysql.com/doc/refman/5.0/en/commands-out-of-sync.html
http://mike-hostetler.com/blog/2007/04/php-5-and-mysql-5-stored-procedures-error-and-solution-qcodo