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

PHP中通过ID获取项目名称始终返回null问题求助

嘿,我帮你找出问题所在啦,咱们一步步来解决:

问题根源分析

你遇到的两个核心问题导致方法始终返回null:

  1. 项目对象存储的引用错误
    在首页的while循环里,你一直复用同一个$ObjProjet对象。PHP里对象是按引用传递的,所以$arrObjProject数组里的所有元素其实都是指向同一个对象的引用——循环结束后,数组里的所有"项目"都会是最后一次循环的项目数据,根本没有保存所有项目的信息。

  2. 方法逻辑的设计错误
    你的Projects类里的$project_id是单个私有属性,不是数组!所以foreach($this->project_id as $idproj)这行代码根本无法执行循环(单个值不能被遍历),直接跳过循环返回null。而且从设计角度来说,单个Projects对象应该代表一个项目,而不是所有项目的集合。


修复方案与代码示例

第一步:调整单个项目的类(更名为Project更符合语义)

让类只负责单个项目的属性存储和基础访问方法:

class Project { 
    private $project_id; 
    private $project_name; 
    private $project_state; 

    public function setAllProject($id_project, $name_project, $state_project) { 
        $this->project_id = $id_project; 
        $this->project_name = $name_project; 
        $this->project_state = $state_project; 
    } 

    // 新增获取ID和名称的方法,供外部访问
    public function getProjectId() {
        return $this->project_id;
    }

    public function getProjectName() {
        return $this->project_name;
    }
}

第二步:修复首页存储项目的循环

每次循环都创建新的Project对象,确保每个项目都是独立实例:

$arrObjProject = [];
$i = 0;
while($dataProjet = mysqli_fetch_array($rs)){ 
    // 每次循环新建一个项目对象
    $objProject = new Project(); 
    $objProject->setAllProject($dataProjet["project_id"], $dataProjet["project_name"], $dataProjet["project_state"]); 
    $arrObjProject[$i] = $objProject; 
    $i++; 
}

第三步:实现根据ID获取项目名称的逻辑

在项目集合(数组)上进行遍历,而不是单个项目对象里:

function getProjectNameByID($p_id, $projects) { 
    foreach($projects as $project) { 
        if($project->getProjectId() == $p_id){ 
            return $project->getProjectName(); 
        } 
    }
    // 找不到对应ID时返回null
    return null; 
}

// 使用示例:传入目标ID和项目数组
$targetProjectName = getProjectNameByID(1001, $arrObjProject);

如果想更贴合面向对象设计,可以封装一个项目集合类:

class ProjectCollection {
    private $projects = [];

    public function addProject(Project $project) {
        $this->projects[] = $project;
    }

    public function getProjectNameByID($p_id) {
        foreach($this->projects as $project) {
            if($project->getProjectId() == $p_id) {
                return $project->getProjectName();
            }
        }
        return null;
    }
}

// 使用方式
$projectCollection = new ProjectCollection();
while($dataProjet = mysqli_fetch_array($rs)){ 
    $objProject = new Project(); 
    $objProject->setAllProject($dataProjet["project_id"], $dataProjet["project_name"], $dataProjet["project_state"]); 
    $projectCollection->addProject($objProject); 
}

// 获取目标名称
$targetName = $projectCollection->getProjectNameByID(1001);

为什么这样改?

  • 单个Project对象职责单一,只管理自己的属性,符合面向对象设计原则;
  • 每次循环新建对象,避免了引用覆盖问题,确保数组里每个元素都是独立的项目实例;
  • 把"根据ID找名称"的逻辑放在项目集合上,遍历所有项目实例对比ID,逻辑更合理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:18:11