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

PHP Category类仅能获取ID,其他属性返回NULL,求排查问题

问题分析与修复方案

嘿,我帮你找到了问题的根源,咱们一步步来看:

核心问题:构造函数错误覆盖了$datacol

你的__construct方法里有个关键错误:你把load()方法的返回值(布尔值true/false)赋值给了$this->datacol,直接覆盖了load()方法内部已经赋值好的数据库查询结果数组。

看这段构造函数代码:

public function __construct($catid=0) {
    $this->catid=0;
    $this->datacol=$this->load($catid); // 这里是错误的!
}

而你的load()方法逻辑是:

  • 查询成功时,先把$this->datacol = mysqli_fetch_array($res);(赋值为数组),然后返回true
  • 查询失败时返回false

所以当你在构造函数里执行$this->datacol=$this->load($catid);,相当于把$datacol从数组改成了布尔值true或false。后面调用getName()时,你试图从布尔值里取['category'],自然会返回NULL。

修复步骤

1. 修改构造函数,去掉错误的赋值

把构造函数改成只调用load()方法,不要把返回值赋值给$datacol:

public function __construct($catid=0) {
    // 去掉$this->catid=0; 因为load成功后会自动设置catid
    $this->load($catid);
}

如果想处理加载失败的情况,可以加上错误处理:

public function __construct($catid=0) {
    if (!$this->load($catid)) {
        $this->catid = 0;
        $this->datacol = []; // 初始化空数组,避免后续get方法报错
    }
}

2. 额外优化:修复SQL注入风险

你的load()方法里直接把$catid拼到SQL语句里,存在严重的SQL注入风险。建议使用mysqli预处理语句来避免这个问题,修改后的load()方法如下:

public function load($catid) {
    global $conn;
    // 使用预处理语句
    $sql = 'SELECT * FROM tbl_categories WHERE catid = ?';
    $stmt = mysqli_prepare($conn, $sql);
    mysqli_stmt_bind_param($stmt, 'i', $catid); // 'i'表示整数类型
    mysqli_stmt_execute($stmt);
    $res = mysqli_stmt_get_result($stmt);
    
    if (!mysqli_num_rows($res)) {
        mysqli_stmt_close($stmt);
        return false;
    }
    
    $this->datacol = mysqli_fetch_array($res);
    $this->catid = $this->datacol['catid'];
    mysqli_stmt_close($stmt);
    return true;
}

测试验证

修改后,再执行你的实例化代码:

$cat=new category(10);
echo var_dump($cat);
echo var_dump($cat->getId());
echo var_dump($cat->getName());

应该就能正确获取到getName()的返回值了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:25:36