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

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而非对象,可能原因:

  1. $dims数组中存在无效的id_dim值(对应dimension表中无匹配记录)
  2. 数据库查询出现竞态:查询时该ID对应的记录被删除,或权限问题导致无结果返回
  3. 代码中多次重复调用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 23:15:52