2 つのパラメーターを取り、テーブルに行を挿入する単純な MySQL ストアド プロシージャがあります。次のように Zend Framework 2 から問題なく実行できます。
$result = $this->dbAdapter->query('CALL sp_register_user(?, ?)', array('username', 'password'));
ストアド プロシージャから返された結果セットにもアクセスできます。
私が今欲しいのは、ストアドプロシージャからの出力値を3番目のパラメーターとして持つことです。つまり、次のようになります。
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 の抽象化レイヤーを利用できるソリューションですが、出力パラメーターにアクセスする方法についてのアイデアは大歓迎です。