
PDO 使用 fetchAll(PDO::FETCH_ASSOC) 返回的是二维数组,外层数组每个元素本身仍是关联数组;直接 echo $value 会导致“Array to string conversion”错误,必须逐层解构——先遍历记录,再遍历每条记录的键值对。
pdo 使用 `fetchall(pdo::fetch_assoc)` 返回的是二维数组,外层数组每个元素本身仍是关联数组;直接 `echo $value` 会导致“array to string conversion”错误,必须逐层解构——先遍历记录,再遍历每条记录的键值对。
在使用 PHP PDO 查询配置数据(如 SELECT setting, setting_value FROM app_config)时,调用 fetchAll(PDO::FETCH_ASSOC) 会返回一个索引数组,其每个元素均为一个关联数组(例如 [0] => ['setting' => 'site_title', 'setting_value' => 'My Website'])。此时若直接用 foreach ($stmt as $key => $value) 并 echo "$key = $value",PHP 会尝试将内层关联数组 $value 转为字符串,从而触发「Array to string conversion」警告。
✅ 正确做法是采用两层循环结构:
- 外层遍历每一条查询结果记录(即每个关联子数组);
- 内层遍历该记录的键(如 'setting')与值(如 'site_title')。
以下是完整、安全的示例代码:
<?php // 假设 $pdo 已正确初始化
$stmt = $pdo->query("SELECT setting, setting_value FROM app_config")->fetchAll(PDO::FETCH_ASSOC);
// ✅ 正确遍历:外层取记录,内层取字段键值
foreach ($stmt as $record) {
foreach ($record as $field => $val) {
echo "<p><strong>{$field}:</strong> " . htmlspecialchars($val) . "</p>";
}
}
? 关键说明与最佳实践:
- ❌ 错误写法:echo "$key = $value" —— $value 是数组,不可直接字符串拼接;
- ❌ 错误嵌套:foreach ($key as $result) —— $key 是整数索引(如 0, 1),不是数组,无法遍历;
- ✅ 推荐变量命名:用 $record / $row 表示单条结果,用 $field / $column 表示字段名,语义清晰;
- ? 安全提示:输出用户数据(如 setting_value)前务必使用 htmlspecialchars() 防止 XSS;
- ⚡ 性能提示:若仅需构建配置映射(如 ['site_title' => 'My Website']),可一步转换:
$config = []; foreach ($stmt as $row) { $config[$row['setting']] = $row['setting_value']; } // 后续直接 $config['site_title']
掌握这种二维关联数组的迭代逻辑,不仅适用于配置表读取,也广泛用于任何 PDO::FETCH_ASSOC 场景(如用户列表、文章元数据等),是 PHP 数据库开发中的基础且必备技能。










