如何在Zend Framework的MySql数据库中使用存储过程?

l2m*_*2mt 18 stored-procedures zend-framework

我最近学会了使用Zend Framework.我做了一个简单的CRUD应用程序.但是现在我想使用现有的数据库来处理更复杂的应用程序,我想知道如何在模型中调用存储过程,如何发送参数,如何读取结果并将它们存储在PHP中的数组中.请.我感谢任何帮助:)

Bil*_*win 24

这不是太难.这是一个带有IN参数,OUT参数和结果集的MySQL存储过程的示例:

CREATE PROCEDURE MyProc(IN i INTEGER, OUT o INTEGER)
BEGIN
  SELECT i+10 INTO o;
  SELECT i, o;
END
Run Code Online (Sandbox Code Playgroud)

您可以使用该query()方法调用它,并传递一个参数:

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

诀窍是MySQL存储过程可能会返回多个结果集(例如,如果proc有多个SELECT查询).因此,API必须先遍历所有结果集,然后才能执行另一个SQL查询.否则,您会收到" 命令不同步 "错误.

如果您使用PDO_MySQL适配器:

while ($stmt->nextRowset()) { }
Run Code Online (Sandbox Code Playgroud)

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

while ($db->getConnection()->next_result()) { }
Run Code Online (Sandbox Code Playgroud)

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

$stmt = $db->query("SELECT @output");
print_r( $stmt->fetchAll() );
Run Code Online (Sandbox Code Playgroud)