PHP报错:Trying to get property 'message' of non-object 如何修复?
解决PDO获取数据时的"non-object"错误
嘿,这个错误我太熟了!咱们来快速定位问题并修复它:
错误原因
你在第11行用$r->message访问数据,但$query->fetch()默认返回的是混合数组(关联数组+索引数组),不是对象。所以当你尝试用对象的属性访问语法->去操作数组时,就会抛出"Trying to get property 'message' of non-object"的错误。另外,你的代码里还有个小笔误:<br少了闭合的>,也顺手改了吧。
两种修复方案
方案1:改用对象模式获取数据
把fetch()改成fetch(PDO::FETCH_OBJ),这样返回的就是对象,就能用->message访问了:
<?php try { $handler = new PDO('mysql:host=127.0.0.1;dbname=group_projectdb','root',''); } catch (Exception $e) { echo $e->getMessage(); die(); } $query = $handler->query('SELECT * FROM security'); while ($r = $query->fetch(PDO::FETCH_OBJ)) { // 修改fetch模式为对象模式 echo $r->message,'<br>'; // 补全<br>的闭合标签 } ?>
方案2:用数组索引访问数据
保持默认的fetch模式,把$r->message改成数组形式$r['message']:
<?php try { $handler = new PDO('mysql:host=127.0.0.1;dbname=group_projectdb','root',''); } catch (Exception $e) { echo $e->getMessage(); die(); } $query = $handler->query('SELECT * FROM security'); while ($r = $query->fetch()) { echo $r['message'],'<br>'; // 改用数组索引访问字段 } ?>
额外小技巧
如果希望所有PDO查询默认都返回对象,可以在初始化PDO的时候设置全局属性:
$handler = new PDO('mysql:host=127.0.0.1;dbname=group_projectdb','root',''); $handler->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_OBJ);
这样后续所有的fetch()都会默认返回对象,不用每次都手动指定模式啦。
内容的提问来源于stack exchange,提问作者Lesther Bualan
相关产品推荐
相关产品推荐

