2009-08-20 81 views
17

我最近已经学会了使用Zend Framework。我做了一个简单的CRUD应用程序。但是现在我想为现有的数据库使用更复杂的应用程序,我想知道如何在模型中调用存储过程,如何发送参数,如何读取结果并将它们存储在PHP中的数组中。请。我赞赏任何形式的帮助:)如何使用Zend Framework在MySql数据库中使用存储过程?

+0

如果你想GoDaddy的托管MySQL数据库中使用存储过程,检查是否您可以与数据库备份一起备份。根据我的经验,他们不允许备份存储过程。我不能接受使用它们。 – 2014-12-23 03:05:42

回答

23

这不是太难。这里有一个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存储过程可能会返回多个结果集(如果该过程有多个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()); 
+0

我还没有测试除MySQL以外的其他品牌的数据库调用存储过程。 – 2009-08-20 06:54:17

+0

谢谢比尔..我会尽快尝试:) – l2mt 2009-08-21 04:18:07

1

来自比尔的很好回答。只是为了完整性,如果遇到:

SQLSTATE[HY000]: General error: 2053 

当使用这种方法来得到你的程序的结果集,请检查你的论点。我重构了一个方法,并将NULL作为参数传递给过程,因为我使用的变量超出了范围。有一次,我解决了这个愚蠢的错误问题走了(被另一个所取代):

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

我使用$stmt->fetchAll()虽然。我改用prepare()和​​代替query()。在我的Zend_Db配置文件中从pdo_mysql切换到mysqli终于为我工作了。我发现从以下SO问题这样的信息:

Call Multiple Stored Procedures with the Zend Framework

0
$db = Zend_Db_Table::getDefaultAdapter();  
    $stmt = $db->query("CALL procedure()"); 
    $data = $stmt->fetchAll(); 
+0

欢迎来到StackOverflow。为了提供一个很好的答案,你应该用你提供的代码写一个解释。 – filipst 2017-05-18 13:48:16

相关问题