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

[复制链接]
ARCHY明星会员实名认证 发表于 2013-9-5 15:52:23 [Discuz开发] 显示全部楼层 |阅读模式 上一主题 下一主题

马上注册,一起探讨正确快速的建站方法

您需要 登录 才可以下载或查看,没有帐号?快速注册

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

1、获取客户端IP地址问题:
  1. $ip = $_SERVER["REMOTE_ADDR"];
复制代码
有些开发者用这种常规代码来获取IP,并非不可以,但是对DZ的一些变量了解不足。DZ已经预置了一个安全获取IP的变量,即$_G['clientip'],可以直接使用。

2、关于C::t(...)->insert(...)用法不熟,如:
  1. C::t('#plname#tbname')->insert($uid, $uname, $message, $timenow, $ip);
复制代码
然后在table_tbname.class.php数据表类文件中是这样写的
p
  1. ublic function insert($uid, $uname, $message, $time, $rormip) {
  2.         return DB::insert($this->_table, array(
  3.                 'uid' => $uid,
  4.                 'unane' => $uname,
  5.                 'message' => $message,
  6.                 'time' => $time,
  7.                 'rormip' => $rormip
  8.         ), true, true);
  9. }
复制代码
以上重写insert函数,说明对C::t方法认识不足,甚至完全没搞懂如何运用,没有通读《技术文库》有关章节。在"新增数据层:数据层的规范和约定"中明确"数据表类继承discuz_table基类",而该基类实现了UID(UPDATE、INSERT、DELETE)方法,直接继承使用就行了,没必要重写。上例可修改如下:
  1. $data = array('uid'=>$uid,'unane' => $uname,'message' => $message,'time' => $time,'rormip' => $rormip);
  2. C::t('#plname#tbname')->insert($data,true,true);
复制代码
相关的数据类文件中保留构造函数即可
  1. class table_tbname extends discuz_table
  2. {
  3.         public function __construct() {
  4.                 $this->_table = 'tbname';
  5.                 $this->_pk = 'id';
  6.                 parent::__construct();
  7.         }
  8. }
复制代码
3、对函数参数的意义认识不足,有照葫芦画瓢之嫌:
如上面的C::t('#plname#tbname')->insert($data,true,true);
其中insert函数的第二参数表示是否返回新纪录的ID值,而该语句第二参数要求返回新ID,却没有赋值变量,因此如是写法不仅毫无意义,而且降低了执行效率(尽管仅此一句可以忽略不计,但要是有N个这样的语句呢?)

4、请求来路合法性验证问题
对于表单数据处理,不少人习惯于如下写法
  1. if($_GET['submit']){...}
复制代码
这种写法不能保证安全性,因此必须使用规范写法,即
  1. if(submitcheck('submit')){...}
复制代码
关于submitcheck函数机制请努力研读source/class/helper/helper_form.php,加深理解




上一篇:discuz x2.5 高清建站详细教程(114课)
下一篇:Discuz! 经典加密解密函数(带详解)
您需要登录后才可以回帖 登录 | 快速注册

本版积分规则

快速回复 返回顶部 返回列表