当前位置: 首页 > 面试题库 >

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

姜正初
2023-03-14
问题内容

我有一个具有多个结果集的存储过程。我如何前进到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一起使用,但是由于某种原因,所有int均以空字符串形式返回。

还有其他人遇到这个问题并有解决方案吗?


问题答案:

我认为您在这里缺少什么(以下内容尚未经过测试):

$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']);
}

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

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

因此,根据您的PHP版本,您必须坚持使用mysqli-solution。顺便说一句:您是否故意使用程序样式?使用面向对象的样式mysqli将使您的代码看起来更具吸引力(我个人认为)。



 类似资料:
  • 问题内容: 我有一个MYSQL存储过程SP1(),它返回一个结果集。 我想在SP2()内部调用SP1()并遍历SP1()的结果集以执行一些其他工作。 我不想从SP1()中包含我的逻辑,因为这会使SP2()过于复杂。 有什么建议么? 谢谢。 问题答案: 您想做的事情听起来并不是特别好,也许您应该考虑重新设计这两个过程。但是,您可以执行以下操作来快速解决此问题: 使您的sp2 sproc将其中间结果写

  • 问题内容: 我需要一个SP来返回多组结果。第二组结果将基于第一组结果的一列。 所以: 如何用我的SP返回@ myTable1和@ myTable2?这种语法完全正确吗? 抱歉,我仍然是SQL的新手… 编辑: 因此,我在下面的代码的最后一行看到错误:“必须声明标量变量“ @ myTable1”” 如果我突出显示并运行代码直到第二个代码,它就可以正常工作。 EDIT2: 解决了该问题。谢谢你们。 问题

  • 问题内容: 我已经看到了这个问题问的时候负荷,但他们都真的很长了,我自己在做什么......所以,就不能回避我的头,可能有人告诉我怎么走,从这个使用PDO将过程转换为php: 程序: 我尝试过的PHP代码: 但是,对于一个比我脑细胞更多的人来说,这可能不明显。任何帮助表示赞赏。 关于为什么我相信这应该起作用的参考: http://www.php.net/pdo.prepared-statement

  • 问题内容: 我已经查看了与该问题相关的Stack Overflow上的其他问题,但是似乎没有一个问题能清楚地回答这个问题。 我们有一个名为sp_who2的系统存储过程,该过程为服务器上所有正在运行的进程返回信息的结果集。我想过滤存储过程返回的数据;从概念上讲,我可能会这样做: 但是,该方法不起作用。有什么好的做法可以实现查询存储过程的返回数据的目标,最好无需查看原始存储过程的代码并对其进行修改。

  • 问题内容: 我有一个存储过程,返回一个。如何在语句中使用此存储过程的结果? 我需要这样的东西 我正在使用SQL Server 2005 问题答案: 而是创建一个表值的用户定义函数。

  • 问题内容: 我试图通过存储过程获取一个字段,我使用以下查询。我的目的是获取多行,但是只有在存在单行时,它才能成功执行结果。否则它将返回错误,如下所述。 MYSQL查询 错误信息 注意 问题答案: 该错误不在您的过程中。错误出现在您的查询中-返回的行多于一行,但是您无法将多个结果设置为标量值’emp1’。 您应该限制查询,使其返回一行。 如何从mysql中的存储过程检索多行? 计划A:填写另一个表,