PHP报错:Trying to get property 'id_dimensiona' of non-object求助
问题分析:
Trying to get property 'id_dimensiona' of non-object 报错排查 环境与报错信息
- 运行环境:PHP 7.4、MariaDB 10.4.22
- 报错位置:
C:\xampp\htdocs\admin\includes\forms\machinedecoupe.php第198行和204行 - 报错内容:
Trying to get property 'id_dimensiona' of non-object
相关代码片段
查询方法 find_by_id
public static function find_by_id($id){ global $database; $array_result=static::exec_query("SELECT * FROM ".static::$db_table." WHERE id=$id LIMIT 1"); //Example : SELECT * FROM dimension WHERE id=669 LIMIT 1 return !empty($array_result) ? array_shift($array_result) : false; }
报错触发的循环代码
foreach ($dims as $dim) { if(Lignedecoupe::find_by_dim_count($dim->id_dim,$dim->id_decoupe)!=0) { $obj = Dimension::find_by_id($dim->id_dim); echo print_r($obj->id_dimensiona); //error here showing data and error echo ' <tr > <td class="col-md-6">'.Dimensiona::find_by_id(Dimension::find_by_id($dim->id_dim)->id_dimensiona)->ValeurA.'*'.Dimensionb::find_by_id(Dimension::find_by_id($dim->id_dim)->id_dimensionb)->ValeurB.'*'.Dimensionc::find_by_id(Dimension::find_by_id($dim->id_dim)->id_dimensionc)->ValeurC.'</td> <td class="col-md-8">'.Decoupe::find_by_id($dim->id_decoupe)->type_decoupe.'</td> <td class="col-md-12"><input class="col-md-14" type="number" min="0" name='.$k.' id='.$k.' value='.Lignedecoupe::find_by_dim_count($dim->id_dim,$dim->id_decoupe).'></input> </td> '.$message3[$k].' </tr> '; }
执行 print_r 输出的对象数据
Dimension Object ( [id] => 669 [id_dimensiona] => 2 [id_dimensionb] => 2 [id_dimensionc] => 4 ) 1 Dimension Object ( [id] => 624 [id_dimensiona] => 2 [id_dimensionb] => 2 [id_dimensionc] => 1 ) 1 Dimension Object ( [id] => 1 [id_dimensiona] => 1 [id_dimensionb] => 1 [id_dimensionc] => 1 ) 1 Dimension Object ( [id] => 768 [id_dimensiona] => 2 [id_dimensionb] => 5 [id_dimensionc] => 10 ) 1 Dimension Object ( [id] => 661 [id_dimensiona] => 3 [id_dimensionb] => 4 [id_dimensionc] => 3 ) 1 1
问题原因
从输出看多数Dimension对象正常,但报错说明存在某次循环中Dimension::find_by_id($dim->id_dim)返回了false而非对象,可能原因:
$dims数组中存在无效的id_dim值(对应dimension表中无匹配记录)- 数据库查询出现竞态:查询时该ID对应的记录被删除,或权限问题导致无结果返回
- 代码中多次重复调用
Dimension::find_by_id($dim->id_dim),某次调用失败触发报错,而print_r仅输出了成功的对象实例
解决方法
1. 增加空值判断与对象复用
修改循环内代码,先校验查询结果,同时复用对象避免重复查询:
foreach ($dims as $dim) { $count = Lignedecoupe::find_by_dim_count($dim->id_dim, $dim->id_decoupe); if($count != 0) { $dimensionObj = Dimension::find_by_id($dim->id_dim); // 跳过无效维度 if(!$dimensionObj) continue; // 复用查询结果,避免重复调用find_by_id $valeurA = Dimensiona::find_by_id($dimensionObj->id_dimensiona)->ValeurA ?? ''; $valeurB = Dimensionb::find_by_id($dimensionObj->id_dimensionb)->ValeurB ?? ''; $valeurC = Dimensionc::find_by_id($dimensionObj->id_dimensionc)->ValeurC ?? ''; $decoupeType = Decoupe::find_by_id($dim->id_decoupe)->type_decoupe ?? ''; echo ' <tr > <td class="col-md-6">'.$valeurA.'*'.$valeurB.'*'.$valeurC.'</td> <td class="col-md-8">'.$decoupeType.'</td> <td class="col-md-12"><input class="col-md-14" type="number" min="0" name="'.$k.'" id="'.$k.'" value="'.$count.'"></input></td> '.$message3[$k].' </tr> '; } }
2. 修复find_by_id方法
增加SQL注入防护,同时统一返回格式为对象或null:
public static function find_by_id($id){ global $database; // 参数绑定防止SQL注入 $stmt = $database->prepare("SELECT * FROM ".static::$db_table." WHERE id=? LIMIT 1"); $stmt->bind_param("i", $id); $stmt->execute(); $result = $stmt->get_result(); $array_result = $result->fetch_all(MYSQLI_ASSOC); $stmt->close(); return !empty($array_result) ? array_shift($array_result) : null; }
3. 校验数据源
检查$dims数组中的id_dim值,确保所有ID都存在于dimension表中,避免无效数据进入循环
内容的提问来源于stack exchange,提问作者NAwfal Nieme
相关产品推荐
相关产品推荐

