PDO 使用 fetchAll(PDO::FETCH_ASSOC) 返回的是二维数组,外层数组每个元素本身仍是关联数组;直接 echo $value 会导致“Array to string conversion”错误,必须逐层解构——先遍历记录,再遍历每条记录的键值对。

不少开发者第一次接触 PDO 取值时,可能都遇到过这个情况:从数据库里拉了配置数据,明明看着数据拿到了,结果 echo 出来却报了个“Array to string conversion”的警告。问题是,这个警告到底在说什么?

关键在于,fetchAll(PDO::FETCH_ASSOC) 返回的结构,并不是一个一维的键值对映射,而是一个索引数组,里面的每个元素都是一个关联数组。举个例子,你执行 SELECT setting, setting_value FROM app_config,拿到的结果可能是这样的:[0] => ['setting' => 'site_title', 'setting_value' => 'My Website']。如果你直接用 foreach ($stmt as $key => $value) 然后 echo "$key = $value",PHP 自然会尝试把内层那个关联数组($value)转成字符串——结果就是报错。

所以,正确的做法其实很简单:用两层循环来结构。

下面是完整、安全的示例代码:

query("SELECT setting, setting_value FROM app_config")->fetchAll(PDO::FETCH_ASSOC);

// ✅ 正确遍历:外层取记录,内层取字段键值
foreach ($stmt as $record) {
    foreach ($record as $field => $val) {
        echo "

{$field}: " . htmlspecialchars($val) . "

"; } }

这里有几个关键点需要留意:

$config = [];
foreach ($stmt as $row) {
    $config[$row['setting']] = $row['setting_value'];
}
// 后续直接 $config['site_title'] 就完事了

说白了,这种二维关联数组的迭代逻辑,不只是配置表读取时能用,凡是涉及 PDO::FETCH_ASSOC 的场景——不管是用户列表、文章元数据,还是其他什么数据——都适用。这是 PHP 数据库开发里一个基础但非常实用的技能,掌握它,能帮你避免很多不必要的调试烦恼。

本文转载于:https://www.php.cn/faq/2334520.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。