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
相关产品推荐
相关产品推荐

