1

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 がストアド プロシージャをサポートしているかどうかを知っている人はいますか? もしそうなら、どのように呼び出しますか? 彼らのサイトで例を見つけることができません。

よろしく、

スコット。

4

2 に答える 2

0

ネイティブ SQL はオプションであり、ストアド プロシージャを使用してデータを取得することもできます。

http://www.doctrine-project.org/blog/doctrine2-native-queries.html

または、MySQL でトリガーを使用することもできます。トリガーには、Doctrine、symfony、PHP のコーディングは含まれません。ただのストアドプロシージャ。そのためには、Doctrine のレコード リスナーまたはレコード フックをチェックしてください。

http://docs.doctrine-project.org/projects/doctrine1/en/latest/index.html#record-listeners http://docs.doctrine-project.org/projects/doctrine1/en/latest/index.html #レコードフック

私はそれが役立つことを願っています..

于 2013-04-04T06:13:56.233 に答える