У меня есть простая 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, который я использую. Пример 4 на этой странице показывает, как это сделать через 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, но любые идеи о том, как получить доступ к выходному параметру, приветствуются и оцениваются.
это должно работать, потому что я использую его :
$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