PHP连接MSSQL时出现Undefined array key 'user_id'报错求助
问题解决:PHP PDO fetchAll访问数组键报错
问题描述
在Laragon环境下使用PHP连接Microsoft SQL Server 2019时,运行details.php出现警告:Warning: Undefined array key "user_id" in C:\laragon\www\auth\public\details.php on line 23。通过PDO的fetchAll(PDO::FETCH_ASSOC)获取到包含user_id和email的二维数组(var_dump结果显示数组结构正常),但尝试访问$row['user_id'](含各种引号方式)均报错。
相关代码
<?php $pdo = require __DIR__ . '/../src/bootstrap.php'; $user_id=$_GET['user_id']; if(!is_numeric($user_id)) { echo "Data Error"; exit; } $sql = 'SELECT user_id,email from users WHERE user_id = :user_id'; $statement = db()->prepare($sql); $statement->bindParam(':user_id', $user_id, PDO::PARAM_STR); $statement->execute(); $row= $statement->fetchAll(PDO::FETCH_ASSOC); var_dump($row); // die(); echo " ID: $row[user_id],";
运行输出
array(1) { [0]=> array(2) { ["user_id"]=> string(2) "27" ["email"]=> string(15) "billy@gmail.com" } } Warning: Undefined array key "user_id" in C:\laragon\www\auth\public\details.php on line 23 ID: ,
问题原因
fetchAll(PDO::FETCH_ASSOC)返回的是二维数组,即使只有一条数据,它也会把这条数据放在索引为0的子数组里。直接访问$row['user_id'],相当于在顶层数组里找user_id键,而顶层数组的键是0,自然找不到,因此触发报错。
解决方案
有两种处理方式:
方式一:改用fetch(PDO::FETCH_ASSOC)获取单条数据
因为SQL是根据user_id查询,结果只会有一条数据,用fetch直接获取一维数组更高效:
// 替换fetchAll为fetch $row= $statement->fetch(PDO::FETCH_ASSOC); // 直接访问数组键 echo " ID: {$row['user_id']}, Email: {$row['email']}";
方式二:保留fetchAll,访问子数组的键
如果坚持使用fetchAll,需要先取索引0的子数组再访问键,同时建议增加空结果判断:
$rows= $statement->fetchAll(PDO::FETCH_ASSOC); // 判断是否存在数据 if (!empty($rows)) { $row = $rows[0]; echo " ID: {$row['user_id']}, Email: {$row['email']}"; } else { echo "未找到对应用户"; }
注意事项
- 访问数组键时,建议用单引号包裹(如
$row['user_id']),字符串插值时最好用大括号包裹(如{$row['user_id']}),避免PHP解析歧义 - 必须处理查询结果为空的情况,防止出现
Undefined array key 0的新警告
内容的提问来源于stack exchange,提问作者pnr8uk
相关产品推荐
相关产品推荐

