PDO查询结果重复输出原因及字段单独访问方法咨询
问题解答
1. 为什么结果会重复输出?
你遇到的重复输出问题,核心原因是PDO默认的结果获取模式。当你调用fetchAll()却没有指定模式时,PDO会使用PDO::FETCH_BOTH模式——这个模式会把每一行数据同时以两种格式返回:
- 关联数组:以数据库字段名(比如
firstName、surname)作为键 - 索引数组:以数字下标(0、1、2...)作为键
举个实际的例子,你的$_SESSION['foundPupils'][0]数组结构大概是这样的:
[ 0 => '123', // STUDENTID的索引版 'STUDENTID' => '123',// STUDENTID的关联版 1 => 'John', 'firstName' => 'John', // ... 其他字段也都是重复的键值对 ]
所以当你直接遍历这个数组时,每个字段值会被输出两次,就出现了重复的无格式长字符串。
2. 如何单独访问数组中的字段?
要实现$_SESSION['foundPupils'][0]['firstName']这种直接访问方式,你需要让PDO只返回关联数组,有两种简单的实现方式:
方式一:在fetchAll()时指定获取模式
修改你的结果获取代码,给fetchAll()传入PDO::FETCH_ASSOC参数:
$_SESSION['foundPupils'] = $query->fetchAll(PDO::FETCH_ASSOC);
这样返回的数组就只有字段名作为键的关联结构,没有数字索引,你可以直接通过字段名访问对应的值:
// 访问第一个匹配学生的名字 echo $_SESSION['foundPupils'][0]['firstName']; // 访问姓氏 echo $_SESSION['foundPupils'][0]['surname'];
方式二:全局设置PDO默认获取模式
如果你希望所有PDO查询都默认返回关联数组,可以在初始化PDO连接时配置默认属性:
$pdo = new PDO($dsn, $dbUser, $dbPass, [ PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC ]);
这样后续所有的fetch()、fetchAll()调用都会自动返回关联数组,不用每次手动传参数。
临时补救方案(不推荐)
如果已经获取了重复结构的数据,也可以在遍历时过滤掉数字索引的键:
foreach($_SESSION['foundPupils'][0] as $key => $value){ if(is_string($key)){ // 只处理关联键 echo "{$key}: {$value}<br>"; } }
不过更推荐从源头解决问题,使用前两种方式设置关联数组模式。
内容的提问来源于stack exchange,提问作者user1480135
相关产品推荐
相关产品推荐

