4

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 の抽象化レイヤーを利用できるソリューションですが、出力パラメーターにアクセスする方法についてのアイデアは大歓迎です。

4

1 に答える 1

-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
于 2013-02-28T12:10:04.200 に答える