Doctrine DBAL を単純なテスト PHP プロジェクトにインストールし、テスト データベースを作成して、いくつかのクエリが正常に実行されるようにしました。位置パラメータと名前付きパラメータの両方を使用するクエリを含める:
echo '<br/>';
echo 'Simple SELECT WHERE Query using prepaired statements with positional paramaters:<br/>';
$Users_FirstName = 'Bill';
$sql = "SELECT * FROM users WHERE Users_FirstName = ?";
$stmt = $conn->prepare($sql);
$stmt->bindValue(1, $Users_FirstName);
$stmt->execute();
while ($row = $stmt->fetch()) {
echo $row['Users_FirstName'].'<br/>';
}
echo '<br/>';
echo 'Simple SELECT WHERE Query using prepaired statements with named paramaters:<br/>';
$Users_FirstName = 'Bill';
$sql = "SELECT * FROM users WHERE Users_FirstName = :Users_FirstName";
$stmt = $conn->prepare($sql);
$stmt->bindValue('Users_FirstName', $Users_FirstName);
$stmt->execute();
while ($row = $stmt->fetch()) {
echo $row['Users_FirstName'].'<br/>';
}
上記はすべて問題なく動作します。今、単純なストアド プロシージャを実行しようとしています。
ターゲット データベースは MySQL 5.1.37 です。Stored Proc は次のとおりです。
delimiter //
DROP PROCEDURE IF EXISTS TestProcedure//
CREATE PROCEDURE TestProcedure(INOUT TestParam VARCHAR(50))
BEGIN
SELECT CONCAT('Hi ', TestParam, '!!') INTO TestParam;
END//
次の SQL コードを使用して、MySQL でこれをテストしました。
delimiter ;
SET @testParam = 'Bill';
CALL `TestProcedure`(@testParam);
SELECT @testParam;
そして、それは正しく結果を返します
'Hi Bill!!'
今、次のコードで Doctrine DBAL を使用して、同じストアド プロシージャ フォーム PHP を実行しようとしています。
echo '<br/>';
echo 'Call Stored Procedure with INOUT Parm:<br/>';
$INOUTParam = 'Bill';
$sql = "CALL TestProcedure(?)";
$stmt = $conn->prepare($sql);
$stmt->bindParam(1, $INOUTParam);
$stmt->execute();
echo $INOUTParam;
ただし、これは次のエラーを返します。
INOUT Parm でストアド プロシージャを呼び出す: 例外 'PDOException' とメッセージ 'SQLSTATE[42000]: 構文エラーまたはアクセス違反: 1414 OUT or INOUT argument 1 for routine phptestdb.TestProcedure is not a variable or NEW pseudo-variable in BEFORE trigger' で[削除されたパス]\Doctrine\DBAL\Statement.php:138 スタック トレース: #0
私はあらゆる場所を検索しましたが、INOUT または OUT パラメータで bindParam を使用してストアド プロシージャを呼び出す例を見つけることができません。Doctrine がストアド プロシージャをサポートしているかどうかを知っている人はいますか? もしそうなら、どのように呼び出しますか? 彼らのサイトで例を見つけることができません。
よろしく、
スコット。