我有一个简单的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的抽象层,但是有关如何访问输出参数的任何想法都是受欢迎和赞赏的。
答案 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