如何在带有ZendFramework的MySQL数据库中使用存储过程?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (44)

我最近学会了使用ZendFramework。我做了一个简单的CRUD应用程序。但是现在我想使用一个更复杂的应用程序的现有数据库,我想知道如何调用模型中的存储过程,如何发送参数,如何读取结果并将它们存储在PHP中的数组中?

提问于
用户回答回答于

下面是一个MySQL存储过程的示例IN参数,参数OUT参数和结果集:

CREATE PROCEDURE MyProc(IN i INTEGER, OUT o INTEGER)
BEGIN
  SELECT i+10 INTO o;
  SELECT i, o;
END

你可以用query()方法,并传递一个参数:

$stmt = $db->query("CALL MyProc(?, @output)", array(25));
print_r( $stmt->fetchAll() );

诀窍是mysql存储的过程可能返回多个结果集(如果proc有多个结果集)。SELECT例如,查询)。因此,在执行另一个SQL查询之前,API必须先遍历所有结果集。否则你会得到“不同步的命令“”错误。

如果您使用PDO_MySQL适配器:

while ($stmt->nextRowset()) { }

如果使用MySQLi适配器,您会发现Zend_Db_Statement_Mysqli没有实现nextRowset(),所以您必须调用内部mysqli连接对象:

while ($db->getConnection()->next_result()) { }

清除结果集后,可以运行后续SQL查询,例如获取过程的值OUT参数:

$stmt = $db->query("SELECT @output");
print_r( $stmt->fetchAll() );
用户回答回答于

为了完整起见,如果你遇到:

SQLSTATE[HY000]: General error: 2053

我重构了一个方法,并将NULL作为参数传递给该过程,因为我使用的变量超出了作用域。:

SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other 
unbuffered queries are active.  Consider using PDOStatement::fetchAll().

扫码关注云+社区

领取腾讯云代金券