我刚刚将 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。存储过程如下:
delimiter //
DROP PROCEDURE IF EXISTS TestProcedure//
CREATE PROCEDURE TestProcedure(INOUT TestParam VARCHAR(50))
BEGIN
SELECT CONCAT('Hi ', TestParam, '!!') INTO TestParam;
END//
我已经在 MySQL 中使用以下 SQL 代码对此进行了测试:
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 调用存储过程:带有消息“SQLSTATE [42000] 的异常“PDOException”:语法错误或访问冲突:例程 phptestdb.TestProcedure 的 1414 OUT 或 INOUT 参数 1 不是 BEFORE 触发器中的变量或新伪变量” [路径已删除]\Doctrine\DBAL\Statement.php:138 堆栈跟踪:#0
我到处搜索,找不到任何使用带有 INOUT 或 OUT 参数的 bindParam 调用存储过程的示例。有谁知道 Doctrine 是否支持存储过程,如果有,你怎么称呼它?在他们的网站上找不到任何示例。
问候,
斯科特。