15

私はしばらくの間 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 での呼び出し方法に問題があると思われますが、問題が何であるかを見つけることができないようです。マニュアルの指示に従っていますが、まだこのエラーが発生します。誰かが私が間違っている可能性があることを提案できますか? アドバイスをいただければ幸いです。どうもありがとう!

4

3 に答える 3

13

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

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

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

$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

于 2012-11-17T16:47:08.973 に答える
6

とった!追加するだけ

SELECT @outputparam;

@outputparam は、ストアド プロシージャ定義で param に使用される名前です。ストアド プロシージャを編集できない場合は、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
于 2015-08-26T10:34:55.877 に答える
5

PHP Web サイトの例のように、パラメーターが IN/OUT スタイルであることを指定する必要があります。

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";
于 2012-11-17T16:48:11.390 に答える