使用PDO执行多查询语句时为何仅返回第一个查询结果
问题原因
你拿不到全部查询结果的核心原因有两点:
fetchAll()方法只会读取当前处于激活状态的第一个结果集,不会自动遍历多语句返回的后续结果集。- PDO默认出于安全防护,原生预处理模式不支持多语句执行,如果没开模拟预处理,你写的多段SQL本身就不会被完整执行,只会跑第一条。
另外你原代码里的表名tablel是小写字母L,不是数字1,属于笔误,执行前记得修正,否则会报表不存在的错误。
正确调整方式
如果确实需要使用多语句查询,先给PDO实例开启模拟预处理配置,再通过nextRowset()方法循环遍历每一个结果集,把所有查询结果收集起来,参考代码如下:
// 开启模拟预处理以支持多语句执行 $db->setAttribute(PDO::ATTR_EMULATE_PREPARES, true); $sql = 'SELECT * FROM `table1` WHERE `c_id`= 1;SELECT * FROM `table2`'; $query = $db->prepare($sql); $query->execute(); $allResults = []; // 循环读取所有结果集 do { $currentSet = $query->fetchAll(PDO::FETCH_ASSOC); if ($currentSet) { $allResults[] = $currentSet; } } while ($query->nextRowset()); // 切换到下一个结果集,无后续结果时返回false终止循环
执行完成后$allResults数组的第0项是第一条SELECT的返回结果,第1项是第二条SELECT的返回结果,有更多查询语句的话会按顺序往后追加。
安全提示:多语句执行会放大SQL注入风险,如果SQL语句中包含用户可控的参数,严禁直接拼接到SQL字符串中。非必要场景建议把多语句拆成多次独立的prepare+execute调用,安全性更高。
内容的提问来源于stack exchange,提问作者lapomme27
相关产品推荐
相关产品推荐

