在Zend Framework 2中访问MySQL存储过程输出

时间:2013-01-19 16:13:05

标签: php mysql stored-procedures zend-framework2

我有一个简单的MySQL存储过程,它接受两个参数并在表中插入一行。我可以从Zend Framework 2中执行它,就像这样:

$result = $this->dbAdapter->query('CALL sp_register_user(?, ?)', array('username', 'password'));

我还可以访问从存储过程返回的任何结果集。

我现在想要的是将存储过程的输出值作为第三个参数,如下所示:

DELIMITER //
CREATE PROCEDURE sp_register_user(IN username VARCHAR(50), IN password VARCHAR(128), OUT code INTEGER)
NOT DETERMINISTIC
COMMENT 'Registers a user'
  BEGIN
    INSERT INTO user VALUES (username, password);
    SET code = 123;
  END //

问题是如何从PHP(ZF2)访问此输出变量。我只能通过我正在使用的PDO找到如何直接进行的示例。 Example 4 on this page显示了如何通过PDO直接执行此操作。我担心的是,如果我直接使用PDO对象,我会丢失一些抽象,因此我假设我将永远使用PDO。

尽管如此,我还是尝试直接使用PDO,就像这样:

$username = 'my_username';
$password = 'my_password';
$code = 0;

$stmt = $this->dbAdapter->createStatement();
$stmt->prepare('CALL sp_register_user(?, ?, ?)');
$stmt->getResource()->bindParam(1, $username);
$stmt->getResource()->bindParam(2, $password);
$stmt->getResource()->bindParam(3, $code, \PDO::PARAM_INT, 3);
$stmt->execute();

但是,我收到一条错误消息,说明该语句无法执行。

理想的解决方案是我可以使用ZF2的抽象层,但是有关如何访问输出参数的任何想法都是受欢迎和赞赏的。

1 个答案:

答案 0 :(得分:-1)

这必须有效,因为我使用它

    $str = "DECLARE @Msgvar   varchar(100);DECLARE @last_id int;

    exec CallEntry_Ins $CallLoginId,".$this->usrId .",@Msg = @Msgvar OUTPUT,@LAST_ID = @last_id OUTPUT;

    SELECT  @Msgvar AS N'@Msg',@last_id AS '@LAST_ID'; ";


    $stmt = $db->prepare($str);
    $stmt->execute();
    $rtStatus = $stmt->fetchAll();



     $rtStatus[0]["@LAST_ID"] //accessing Op para