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

标签 php mysql stored-procedures doctrine

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

相关文章:

PHP 数据库中没有任何内容

多次在同一列上使用 MySQL AND 子句

oracle - PLSQL-删除用户的所有数据库对象

PostgreSQL:在插入时创建访问 token

php - 使用 href 从数据库中删除数据行

php - 如何在 get 语句上添加 order by 选项

javascript - 浏览器如何处理跨选项卡的AJAX请求

php - 如何在php中ping ip地址并给出结果

sql - 当前和较旧版本的SQL Server存储过程中的错误处理

php - 无法将 sp 的结果放入数组中