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

PHP PDO fetchObject返回重复属性,部分为NULL的问题求助

解决PDO fetchObject()返回重复属性的问题

问题原因

你的Food类定义了全小写属性,但数据库表列采用驼峰命名,PDO默认会保留数据库列的原始命名作为对象属性;同时PHP允许动态给对象添加未在类中定义的属性,再加上类中预先定义的属性未被赋值(保持NULL),最终导致对象出现两组属性共存的情况。

解决办法

方法1:设置PDO自动转换列名为小写

初始化PDO连接时,添加PDO::ATTR_CASE => PDO::CASE_LOWER配置,让PDO把所有返回的列名转为小写,和类中的属性命名匹配:

$dsn = 'mysql:host=your_db_host;dbname=your_db_name;charset=utf8mb4';
$pdoOptions = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_CASE => PDO::CASE_LOWER, // 强制列名转为小写
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_OBJ
];
$pdo = new PDO($dsn, 'your_username', 'your_password', $pdoOptions);

之后调用fetchObject('Food')时,PDO会自动将小写列名对应到类的小写属性上,不会再生成额外的驼峰属性。

方法2:SQL查询中给列名起别名

在查询语句里,把驼峰列名别名化为类中的小写属性名,确保返回的列名和类属性完全一致:

SELECT FoodName AS foodname, Price AS price, Stock AS stock FROM foods WHERE id = ?

这样PDO返回的结果列名就是类中定义的小写名称,fetchObject会直接赋值到对应的类属性,不会产生多余属性。

方法3:通过类构造函数手动映射属性

在Food类中添加构造函数,接收PDO返回的数据并手动赋值到类属性,避免动态添加属性:

class Food {
    public $foodname;
    public $price;
    public $stock;

    public function __construct(object $data) {
        $this->foodname = $data->FoodName ?? null;
        $this->price = $data->Price ?? null;
        $this->stock = $data->Stock ?? null;
    }
}

使用时先获取数据对象,再实例化Food类:

$stmt = $pdo->prepare("SELECT FoodName, Price, Stock FROM foods WHERE id = ?");
$stmt->execute([1]);
$dataObj = $stmt->fetch(PDO::FETCH_OBJ);
$food = new Food($dataObj);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.15 14:47:25