8

MySQL データベースに単純なストアド プロシージャがあります。

DELIMITER $$
CREATE DEFINER=`vidhu`@`%` PROCEDURE `test`(var_datain TEXT)
BEGIN
    SELECT var_datain;
END

mysql-workbench でこのプロシージャを呼び出すと、入力したデータが返されます。

mysql ワークベンチのスクリーンショット

pdoを使用して PHP から呼び出すと、エラーが発生します。

Fatal error: Cannot pass parameter 2 by reference in C:/apache......(3rd line)

これが私のphpコードです:

$db = new PDO(DSN, DBUSER, DBPASS);
$stmt = $db->prepare("CALL test(?)");
$stmt->bindParam(1, 'hai!', PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result[0];
4

3 に答える 3

24

bindParamの代わりにbindValueを使用する必要があります。

bindParamを使用すると、変数の値ではなく、パラメーターに指定された変数がバインドされます。

だから、あなたがそうするなら:

$x = 5;
$stmt->bindParam(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 6 instead of 5

実際には、5ではなく6で実行されます。これを行うには、メソッドに変数への参照が必要です。リテラルへの参照を持つことはできないため、これは、bindParamをリテラル(または参照できないもの)で使用できないことを意味します。

$x = 5;
$stmt->bindValue(1, $x, PDO::PARAM_INT);
$x = 6;
$stmt->execute(); //executes with 5 instead of 6

それで:

$stmt->bindParam(1, 1, PDO::PARAM_INT); 
//invalid because there's no way to pass a literal 1 by reference
$stmt->bindValue(1, 1, PDO::PARAM_INT);
//valid
于 2012-08-07T00:52:14.237 に答える
-1

このbindParam関数は値変数のみを受け入れます。そのhaiため、変数ではないパラメーター 2 が使用されますcannot be passed。したがって、bindValue は必要ありませんが、bindParam を正しく使用してください。例: bindParam を使用する場合: スニペットから。

$a = "hai";
$db = new PDO(DSN, DBUSER, DBPASS);
$stmt = $db->prepare("CALL test(?)");
$stmt->bindParam(s, $a, PDO::PARAM_STR);
$rs = $stmt->execute();
$result = $stmt->fetchAll(PDO::FETCH_ASSOC);
echo $result[0];

これはあなたの問題を解決するはずであり、上記の答えではありません。

于 2020-12-22T06:32:57.733 に答える