Discuz开发 Discuz x插件开发中常见的一些问题整理

2021-03-20 803 0条评论


为规范代码书写、提高作品质量、加强开发素养,同时使审核省时省力,快速通过,整理一些提审应用中遇到的常见问题(有些问题是老生常谈),供开发者参考。下面是一些discuz x插件开发中常见的一些问题整理。


1、获取客户端IP地址问题:

$ip = $_SERVER["REMOTE_ADDR"];

复制代码

有些开发者用这种常规代码来获取IP,并非不可以,但是对DZ的一些变量了解不足。DZ已经预置了一个安全获取IP的变量,即$_G['clientip'],可以直接使用。


2、关于C::t(...)->insert(...)用法不熟,如:

C::t('#plname#tbname')->insert($uid, $uname, $message, $timenow, $ip);

复制代码

然后在table_tbname.class.php数据表类文件中是这样写的

p

ublic function insert($uid, $uname, $message, $time, $rormip) {

        return DB::insert($this->_table, array(

                'uid' => $uid,

                'unane' => $uname,

                'message' => $message,

                'time' => $time,

                'rormip' => $rormip

        ), true, true);

}

复制代码

以上重写insert函数,说明对C::t方法认识不足,甚至完全没搞懂如何运用,没有通读《技术文库》有关章节。在"新增数据层:数据层的规范和约定"中明确"数据表类继承discuz_table基类",而该基类实现了UID(UPDATE、INSERT、DELETE)方法,直接继承使用就行了,没必要重写。上例可修改如下:

$data = array('uid'=>$uid,'unane' => $uname,'message' => $message,'time' => $time,'rormip' => $rormip);

C::t('#plname#tbname')->insert($data,true,true);

复制代码

相关的数据类文件中保留构造函数即可

class table_tbname extends discuz_table

{

        public function __construct() {

                $this->_table = 'tbname';

                $this->_pk = 'id';

                parent::__construct();

        }

}

复制代码

3、对函数参数的意义认识不足,有照葫芦画瓢之嫌:

如上面的C::t('#plname#tbname')->insert($data,true,true);

其中insert函数的第二参数表示是否返回新纪录的ID值,而该语句第二参数要求返回新ID,却没有赋值变量,因此如是写法不仅毫无意义,而且降低了执行效率(尽管仅此一句可以忽略不计,但要是有N个这样的语句呢?)


4、请求来路合法性验证问题

对于表单数据处理,不少人习惯于如下写法

if($_GET['submit']){...}

复制代码

这种写法不能保证安全性,因此必须使用规范写法,即

if(submitcheck('submit')){...}

复制代码

关于submitcheck函数机制请努力研读source/class/helper/helper_form.php,加深理解


文章版权及转载声明

本文作者:符文浩 网址:http://blog.fuwenhao.com/post/401.html 发布于 2021-03-20
文章转载或复制请以超链接形式并注明出处。

发表评论

快捷回复:

评论列表 (暂无评论,803人围观)参与讨论

还没有评论,来说两句吧...

取消
微信二维码
微信二维码
支付宝二维码