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

