使用php / mysqli中的存储过程检索多个结果集

我有一个有多个结果集的存储过程。 如何提前到mysqli中的第二个结果集来获得这些结果?

假设这是一个存储过程,如下所示:

create procedure multiples( param1 INT, param2 INT ) BEGIN SELECT * FROM table1 WHERE id = param1; SELECT * FROM table2 WHERE id = param2; END $$ 

PHP是这样的:

 $stmt = mysqli_prepare($db, 'CALL multiples(?, ?)'); mysqli_stmt_bind_param( $stmt, 'ii', $param1, $param2 ); mysqli_stmt_execute( $stmt ); mysqli_stmt_bind_result( $stmt, $id ); 

那么这是我无法工作的部分。 我已经尝试使用mysqli_next_result移动到下一个结果集,但不能得到它的工作。 我们确实让它与mysqli_store_result和mysqli_fetch_assoc / array / row一起工作,但由于某些原因,所有的ints都以空string的forms返回。

任何人遇到这个问题,并有一个解决scheme?

我想你在这里错过了一些东西(下面还没有经过testing):

 $stmt = mysqli_prepare($db, 'CALL multiples(?, ?)'); mysqli_stmt_bind_param($stmt, 'ii', $param1, $param2); mysqli_stmt_execute($stmt); // fetch the first result set $result1 = mysqli_use_result($db); // you have to read the result set here while ($row = $result1->fetch_assoc()) { printf("%d\n", $row['id']); } // now we're at the end of our first result set. mysqli_free_result($result1); //move to next result set mysqli_next_result($db); $result2 = mysqli_use_result($db); // you have to read the result set here while ($row = $result2->fetch_assoc()) { printf("%d\n", $row['id']); } // now we're at the end of our second result set. mysqli_free_result($result2); // close statement mysqli_stmt_close($stmt); 

使用PDO你的代码如下所示:

 $stmt = $db->prepare('CALL multiples(:param1, :param2)'); $stmt->execute(array(':param1' => $param1, ':param2' => $param2)); // read first result set while ($row = $stmt->fetch()) { printf("%d\n", $row['id']); } $stmt->nextRowset(); // read second result set while ($row = $stmt->fetch()) { printf("%d\n", $row['id']); } 

但是我听说PDOStatement::nextRowset()没有使用MySQL PDO驱动程序实现,因此无法检索多个结果集:

  • PDO的nextRowset不能在MySQL上工作
  • pdo_mysql:存储过程调用返回单个行集阻止未来的查询
  • 无法在Windows上使用PDO中的存储过程

所以,根据你的PHP版本,你必须坚持你的mysqli解决scheme。 顺便说一下:你故意使用程序风格吗? 使用面向对象的风格与mysqli会使你的代码看起来更吸引人(我个人的意见)。

看起来MySQLi只可能通过mysqli_multi_query()支持多个结果集,因为MySQLi_STMT对象与MySQLi_STMT对象的工作方式不同。

PDO似乎有些更抽象, PDOStatement对象能够处理常规查询( PDO::query )和预处理语句( PDO:prepare )的多个结果集。