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。存储过程如下:

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 是否支持存储过程,如果有,你怎么称呼它?在他们的网站上找不到任何示例。

问候,

斯科特。

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 回答
0

好的,发现导致错误的根本问题是由 MySQL 中的错误引起的。

请参阅此处:存储过程、MySQL 和 PHP

这里有一个链接:http: //bugs.mysql.com/bug.php ?id=11638

据我所知,它是在 2005 年确定的,并且从未修复到 MySQL 5.6.10,因为这是我测试的最后一个版本。

希望这对其他人有帮助;-)

于 2013-08-30T07:11:39.007 回答