You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP新手遇数据库查询报错:Trying to get property 'id' of non-object

解决PDO获取数据时“Trying to get property 'id' of non-object”的问题

嘿,我来帮你搞定这个报错!你遇到的问题其实是PDO默认的获取模式导致的,我一步步给你解释和解决:

问题原因

PDO的query()方法返回的是PDOStatement对象,但当你直接用foreach遍历它时,默认返回的是关联数组,不是对象。所以你用$ret1->id去访问属性就会报错——因为$ret1是数组,不是对象,自然没有->id这种属性访问方式。

解决方法

这里有三种常用的解决方式,你可以选适合自己的:

1. 改用数组下标访问

直接用数组的键名来获取数据,把print $ret1->id;改成:

print $ret1['id'];

2. 设置PDO默认获取模式为对象

在数据库连接成功后,添加一行代码设置默认返回对象,这样所有查询的结果都会以对象形式返回:

try{
    $conn=new PDO("mysql:host=localhost:3306;dbname=try", "root", "abcdef12");
    $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    // 添加这行,设置默认获取模式为对象
    $conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
} catch(PDOException $ex){
    // 这里建议输出具体错误信息,方便调试
    echo "连接错误: " . $ex->getMessage();
}

之后你的$ret1->id就能正常工作了。

3. 手动指定fetch模式

在查询时,用fetchAll()指定返回对象数组,这样更灵活,只针对当前查询生效:

$mysqlcode="SELECT * FROM users";
$ret = $conn->query($mysqlcode)->fetchAll(PDO::FETCH_OBJ);
foreach($ret as $ret1){
    print $ret1->id;
}

调试技巧

以后遇到类似对象/数组混淆的问题,你可以用这些方法排查:

  • 用var_dump($ret1)打印遍历的每一项,看看它到底是数组还是对象,以及包含哪些数据
  • 用var_dump($ret)查看PDOStatement对象的状态,确认是否有返回结果
  • 完善异常处理,把echo "error";改成echo $ex->getMessage();,这样如果连接或查询出错,能看到具体的错误信息,比如表名写错、字段不存在等

内容的提问来源于stack exchange,提问作者Dip Chakraborty

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 19:22:55