これは長い間続いているバグであることが判明しました...2005年以来!
元のバグレポートは次のとおりです。
答えを返すにはさまざまなアプローチがありますが、そのうちの1つを見つけて、それを示します...
「トリック」とは、「mysql」プロシージャから出力を取得することです。これは「2段階」のプロセスです。
-
最初の部分は、入力を使用してプロシージャを実行し、結果を格納するMYSQL変数を指定することです。
-
次に、別のクエリを実行して、これらの「mysql」変数を「選択」します。
ここでは非常に明確に説明されています: php-calling-mysql-stored-procedures
更新(2017年1月):
これは、「IN」、「INOUT」、および「OUT」Mysqlプロシージャパラメータの変数の使用を示す例です。
ここから始める前に、いくつかのヒントを示します。
- 開発時:プロシージャ呼び出しのエラーを判別する際の信頼性が高いため、「エミュレートモード」でPDOを実行します。
- PHP変数をプロシージャの「IN」パラメータにのみバインドします。
変数をINOUTおよびOUTパラメータにバインドしようとすると、非常に奇妙なランタイムエラーが発生します。
いつものように、私は必要以上に多くのコメントを提供する傾向があります;-/
ランタイム環境(XAMPP):
- PHP:5.4.4
- MySQL:5.5.16
ソースコード:
SQLコード:
CREATE PROCEDURE `demoSpInOutSqlVars`(IN pInput_Param INT, /* PHP Variable will bind to this*/
/* --- */
INOUT pInOut_Param INT, /* contains name of the SQL User variable that will be read and set by mysql */
OUT pOut_Param INT) /* contains name of the SQL User variable that will be set by mysql */
BEGIN
/*
* Pass the full names of SQL User Variable for these parameters. e.g. '@varInOutParam'
* These 'SQL user variables names' are the variables that Mysql will use for:
* 1) finding values
* 2) storing results
*
* It is similar to 'variable variables' in PHP.
*/
SET pInOut_Param := ABS(pInput_Param) + ABS(pInOut_Param); /* always positive sum */
SET pOut_Param := ABS(pInput_Param) * -3; /* always negative * 3 */
END$$
PHPコード:
DB接続:
$db = appDIC('getDbConnection', 'default'); // get the default db connection
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true);
$db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
注:出力はEMULATE_PREPARES
と同じです。 =false。
使用するすべてのPHP変数を設定します:
$phpInParam = 5;
$phpInOutParam = 404; /* PHP InOut variable ==> read and should be changed */
$phpOutParam = null; /* PHP Out variable ==> should be changed */
SQLプロシージャ呼び出しの定義と準備:
$sql = "call demoSpInOut(:phpInParam,
@varInOutParam, /* mysql variable name will be read and updated */
@varOutParam)"; /* mysql variable name that will be written to */
$stmt = $db->prepare($sql);
PHP変数をバインドしてSQL変数を設定する:
-
1)PHP変数をバインドする
$ stmt-> bindParam(':phpInParam'、$ phpInParam、PDO ::PARAM_INT);
-
2)SQLユーザーのINOUT変数を設定します
$ db-> exec( "SET @varInOutParam =$ phpInOutParam"); //値をMySql変数に設定するだけなので、これは安全です。
手順を実行します:
$allOk = $stmt->execute();
SQL変数をPHP変数に取得します:
$sql = "SELECT @varInOutParam AS phpInOutParam,
@varOutParam AS phpOutParam
FROM dual";
$results = current($db->query($sql)->fetchAll());
$phpInOutParam = $results['phpInOutParam'];
$phpOutParam = $results['phpOutParam'];
注:おそらく最善の方法ではありません;-/
PHP変数を表示する
"$phpInParam:" => "5"
"$phpInOutParam:" => "409"
"$phpOutParam:" => "-15"