gpt4 book ai didi

php - Doctrine DBAL 对存储过程的支持

转载 作者:行者123 更新时间:2023-11-30 23:20:21 27 4
gpt4 key购买 nike

我刚刚将 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com