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
相关产品推荐
相关产品推荐

