Openx读全部字段的Bug

探讨了Admin_DA::_getEntities方法中硬编码字段的问题,该方法旨在读取实体对象的所有属性,但实际实现中并未遵循配置文件db_schema.ini声明的字段,而是直接在代码中硬编码了字段名称。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Admin_DA:: _getEntities( $entity, $aParams, $allFields) 被设计为读取一个实体对象,这跟Java里的JPA设计极相似。例如
Admin_DA:: _getEntities( 'ad', $aParams, $allFields) 取出的是广告对象。但坑爹的是 $allFields 这个参数。按照设想,如果$allFields 设为TRUE,应该读出对象里的所有属性,包括数据表里的每个字段。在前面的文章里介绍过,OpenX 通过一个配置文件 db_schema.ini 来声明每个字段,那么读取出来的字段应该是跟配置文件一一对应。事实上并非如此。
通过阅读代码发现,方法里有这么一句
$aColumns = SqlBuilder:: _getColumns($entity, $aParams, $allFields);
再继续挖下去,原来字段名称都硬编码在这里了,ini 文件被无视了。囧

case 'ad' :
            $aColumns += array ('d.bannerid' => 'ad_id', 'd.campaignid' => 'placement_id', 'd.status' => 'status' , 'd.description' => 'name', 'd.storagetype' => 'type' , 'd.ext_bannertype' => 'ext_bannertype');
            if ($allFields) $aColumns += array( 'd.contenttype' => 'contenttype' , 'd.pluginversion' =>'pluginversion', 'd.filename' => 'filename' , 'd.imageurl' => 'imageurl', 'd.htmltemplate' => 'htmltemplate' , 'd.htmlcache' => 'htmlcache', 'd.width' => 'width' , 'd.height' => 'height' , 'd.weight' => 'weight', 'd.seq'=> 'seq' , 'd.target' => 'target' , 'd.url' => 'url', 'd.alt' => 'alt' , 'd.statustext' => 'statustext' , 'd.bannertext' => 'bannertext', 'd.adserver' => 'adserver' , 'd.block' => 'block', 'd.capping' => 'capping' , 'd.session_capping' => 'session_capping', 'd.compiledlimitation' => 'compiledlimitation', 'd.prepend' =>'prepend' , 'd.append' => 'append', 'd.bannertype' => 'bannertype' , 'd.alt_filename' => 'alt_filename' , 'd.alt_imageurl' => 'alt_imageurl', 'd.alt_contenttype' => 'alt_contenttype' , 'd.comments' => 'comments','d.parameters' => 'parameters' , 'd.transparent' => 'transparent');
            break ;

如果要读出自定义的字段,必须在这里加上。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值