gpt4 book ai didi

php - 使用 PDO 从 mysql 中的存储过程中检索输出参数

转载 作者:行者123 更新时间:2023-11-29 03:16:46 26 4
gpt4 key购买 nike

在将其作为重复项关闭之前,让我说一下,在 Stack Overflow 上有几个问题提出这个问题,但没有一个有标记的答案,未标记的答案对我不起作用。

在我的 MySql 数据库中,我有一个简单的程序:

DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
OUT b INT
) BEGIN
SELECT a INTO b;
END //
DELIMITER ;

如果我在 phpMyAdmin 中调用它,我会得到我期望的结果:

SELECT 2 INTO @b;
CALL foo(1, @b);
SELECT @b;
| @b |
+----+
| 1 |

但是,当我尝试从我的 php 代码中调用它时,stmt->execute() 返回 false

$a = 1;
$pdoLink = get_pdo_connection($db);

$stmt = $pdoLink->prepare('CALL `mydb`.`foo`(:a, :b)');

$stmt->bindParam(':a', $a);
$stmt->bindParam(':b', $b, PDO::PARAM_INT, 4);
// I've also tried length values of 1, 2, and 16

$stmt->execute(); // returns false

我认为这可能首先与调用过程有关,所以我将我的过程替换为:

DELIMITER //
CREATE PROCEDURE foo (
IN a INT,
IN b INT
) BEGIN
SELECT a, b;
END //
DELIMITER ;

然而,这确实适用于 php,因此它一定与输出参数有关。我使用的代码仅与 PDO Documentation 稍作改动,所以我真的不知道它有什么问题。


不是在寻找一个使用mysqlimulti_query做类似事情的答案

$sql = "CALL `mydb`.`foo`(1, @b);
SELECT @b;";
$link->multi_query($sql);
// ...

我正在寻找如何使用 PDO 和单个查询来执行此操作。

有人试图将此标记为 Calling stored procedure with Out parameter using PDO 的副本.此问题的标记答案使用多个查询

最佳答案

您说您使用 phpMyAdmin 来测试您的查询是否有效,但是 phpMyAdmin 是用 PHP 构建的,并且使用 mySQL 改进的,所以问题不在 PHP 上。或者更好的是,要与 MySQL 对话,您必须通过一个驱动程序来解释 PHP 和系统库之间的数据;通常是 libmysql,它与 MySQL 服务器接口(interface)。一切都太复杂了!网上很多资料说要设置PDO::ATTR_EMULATE_PREPARES为false,防止PHP模拟传递给查询的参数的准备。其他信息,总是从网上获取,他们说只有当 PHP 是通过 php5-mysqlnd 模块编译时才这样做。在实践中,我注意到对我来说最好的方法是强制转换携带非字符串值的变量。所以你的代码可以变成

...
$stmt->bindParam(':a', (int)$a);
$stmt->bindParam(':b', (int)$b, PDO::PARAM_INT, 4);
...

我的两分钱

关于php - 使用 PDO 从 mysql 中的存储过程中检索输出参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54509680/

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