MySQL PDO调用存储过程无法获取输出变量问题求助
解决PDO调用存储过程获取输出变量返回空数组的问题
嘿,我来帮你排查下问题所在,你的代码里有几个关键小错误导致返回空数组,咱们一步步来修正:
1. 存储过程里的变量混淆了
你定义的存储过程有个out counted int(11)参数,但在过程体里却给@counted(会话级用户变量)赋值——这俩根本不是同一个东西!存储过程的out参数需要直接赋值,而不是用带@的用户变量。
修正后的存储过程创建语句应该是这样:
// 分开执行DROP和CREATE,避免多语句执行的兼容性问题 $connection->exec('drop procedure if exists relatives;'); $connection->exec('create procedure relatives(in parent int(11),out counted int(11)) begin set counted = 1; end;');
2. 调用存储过程的正确姿势(推荐用绑定参数的方式)
用PDO调用带输出参数的存储过程,最可靠的方式是通过prepare+bindParam来绑定输出参数,不用额外执行select就能直接获取值:
// 准备调用语句 $stmt = $connection->prepare('call relatives(:parent, :counted)'); $parent = 1; $counted = 0; // 初始化变量 // 绑定输入参数 $stmt->bindParam(':parent', $parent, PDO::PARAM_INT); // 绑定输出参数:注意第三个参数要加PDO::PARAM_INPUT_OUTPUT,表示这是输入输出参数 $stmt->bindParam(':counted', $counted, PDO::PARAM_INT | PDO::PARAM_INPUT_OUTPUT, 11); // 执行存储过程 $stmt->execute(); // 现在$counted就是输出值了 var_dump($counted); // 会输出int(1)
3. 如果坚持用用户变量的方式(不推荐,但可以修复)
如果你一定要用@counted用户变量的方式,那需要先处理存储过程执行后产生的空结果集,否则后续的select查询会被阻塞,返回空数组:
// 先执行存储过程 $stmt = $connection->query('call relatives(1,@counted);'); // 必须遍历并丢弃存储过程产生的结果集 while ($connection->nextRowset()) {} // 再查询用户变量 $fetch = $connection->query('select @counted as c;')->fetchAll(); var_dump($fetch); // 现在应该能得到array(1) { [0]=> array(2) { ["c"]=> string(1) "1" [0]=> string(1) "1" } }
为什么之前返回空数组?
- 存储过程里没有给定义的
out参数赋值,而是错误地给用户变量赋值,导致后续查询的@counted逻辑不匹配; - 调用存储过程后,PDO会保留一个空的结果集,不处理掉的话,后续的查询无法正确执行,自然返回空数组。
内容的提问来源于stack exchange,提问作者Maciek
相关产品推荐
相关产品推荐

