我刚刚将 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 参数调用存储过程: 异常“PDOException”消息“SQLSTATE [42000]:语法错误或访问冲突:例程 phptestdb 的 1414 OUT 或 INOUT 参数 1。TestProcedure 不是 [PATH REMOVED]\Doctrine\中 BEFORE 触发器中的变量或新伪变量” DBAL\Statement.php:138 堆栈跟踪:#0
我到处搜索,找不到任何使用带 INOUT 或 OUT 参数的 bindParam 调用存储过程的示例。 有谁知道 Doctrine 是否支持存储过程,如果支持,你怎么调用它? 在他们的网站上找不到任何示例。
问候,
斯科特。
最佳答案
native SQL 是一个选项,您甚至可以使用存储过程进行数据检索。
http://www.doctrine-project.org/blog/doctrine2-native-queries.html
或者您也可以在 MySQL 中使用触发器。触发器不会涉及 Doctrine、symfony 或 PHP 中的任何编码。只是存储过程。为此,请查看 Doctrine 的记录监听器或记录 Hook 。
http://docs.doctrine-project.org/projects/doctrine1/en/latest/index.html#record-listeners http://docs.doctrine-project.org/projects/doctrine1/en/latest/index.html#record-hooks
希望对你有帮助
关于php - Doctrine DBAL 对存储过程的支持,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15803588/