web-dev-qa-db-ja.com

PDOを使用してOutパラメータを使用してストアドプロシージャを呼び出す

私はしばらくの間PDOを使用していて、インラインSQLの代わりにストアドプロシージャを使用するようにプロジェクトをリファクタリングしています。説明できないエラーが発生します。PHPバージョン5.3.5およびMySQLバージョン5.0.7を使用しています。

出力を含む基本的なストアドプロシージャを機能させようとしています。ストアドプロシージャは次のとおりです。

DELIMITER //  
CREATE PROCEDURE `proc_OUT` (OUT var1 VARCHAR(100))  
BEGIN  
    SET var1 = 'This is a test';  
END //  

これが私がprocを呼び出すために使用しているコードです。$ dbはPDOのインスタンスです。

$stmt = $db->prepare("CALL proc_OUT(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000); 

    // call the stored procedure
    $stmt->execute();
    echo $returnvalue;

簡単ですよね?ただし、次のエラーが発生します。

exception 'PDOException' with message 'SQLSTATE[42000]: Syntax error or access violation: 1414 OUT or INOUT argument 1 for routine mydb.proc_OUT is not a variable or NEW pseudo-variable in BEFORE trigger

私がそのように直接procを呼び出す場合:

CALL proc_OUT(@res);
SELECT @res;

期待どおりに動作するため、PHPでの呼び出し方法に問題があると思われますが、問題が何であるかがわかりません。 マニュアル の指示に従っていますが、それでもこのエラーが発生します。誰かが私が間違っている可能性があることを提案できますか?アドバイスをいただければ幸いです。どうもありがとう!

12
TheMethod

ここではバグが発生しているようですが、私が見つけた最善の解決策は次のとおりです。

http://www.php.net/manual/en/pdo.prepared-statements.php#10199

上記のリンクのコメントから:

$dbh->query("CALL SomeStoredProcedure($someInParameter1, $someInParameter2, @someOutParameter)"); 
$dbh->query("SELECT @someOutParameter");

// OR, if you want very much to use PDO.Prepare(),
// insert "SELECT @someOutParameter" in your stored procedure and then use:

$stmt = $dbh->prepare("CALL SomeStoredProcedure(?, ?)"); 
$stmt ->execute(array($someInParameter1, $someInParameter2));

これも参照してください: https://stackoverflow.com/a/4502524/815386

10

パラメータがPHP Webサイトの例:

http://php.net/manual/en/pdo.prepared-statements.php 例#5

<?php

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000); 

// call the stored procedure
$stmt->execute();

print "procedure returned $value\n";
5
sdespont

とった!追加するだけです

SELECT @outputparam;

ストアドプロシージャの最後。@ outputparamは、ストアドプロシージャ定義のパラメータに使用される名前です。ストアドプロシージャを編集できない場合は、PHP PDOを使用してSELECT @ outputparamに対して2番目のクエリを実行し、出力パラメータ値を取得する必要があります。

ヒント:非推奨のDBLibを使用してSQL Serverに接続し、提案されているようにストアドプロシージャを変更した場合は、呼び出し元のPHPスクリプトで出力パラメータ値を取得するように構文を微調整する必要もあります。

$out = 0;
$sth = $db->prepare("DECLARE @myout INT; EXECUTE mysp :firstparam, :secondparam, @myout OUTPUT;"); // the DECLARE trick is needed with DBLib
$sth->bindParam(':firstparam', $firstparam, PDO::PARAM_INT);
$sth->execute();
$sth->bindColumn(1, $out, PDO::PARAM_INT);
$sth->fetch(PDO::FETCH_BOUND);

var_dump($out); // works
4
Marco Marsala