对phpcms v9的那个评论一点解析

2012-11-02 02:28:59 5 3656 1
出差中,看见wooyun上说是评论的回复的时候出现问题,有错误大家 指出来,我好日后改正。
看代码文件
这个为评论页面 测试用的。
http://192.168.48.192/DEV1.5.0/gbk/install_package/index.php?m=comment&c=index&a=init&commentid=content_6-1-1&iframe=1&id=29


从url看可以看出来m 是module,c是头文件,a是初始化,后面不解释了。好像是这样。
下面是第一次评论的时候文件
comment.Class.php
public function add($commentid, $siteid, $data, $id = '', $title = '', $url = '') {
                //开始查询评论这条评论是否存在。
                //echo $data[userid],'|'.$data[username],'|',$data[content];
                //echo $_SERVER[PHP_SELF];
                //exit;
                $title = new_addslashes($title);
                if (!$comment = $this->comment_db->get_one(array('commentid'=>$commentid, 'siteid'=>$siteid), 'tableid, commentid')) { //评论不存在
                        //取得当前可以使用的内容数据表
                        $r = $this->comment_table_db->get_one('', 'tableid, total', 'tableid desc');
                        $tableid = $r['tableid'];
                        if ($r['total'] >= 1000000) {
                                //当上一张数据表存的数据已经达到1000000时,创建新的数据存储表,存储数据。
                                if (!$tableid = $this->comment_table_db->creat_table()) {
                                        $this->msg_code = 4;
                                        return false;
                                }
                        }
                        //新建评论到评论总表中。
                        $comment_data = array('commentid'=>$commentid, 'siteid'=>$siteid, 'tableid'=>$tableid, 'display_type'=>($data['direction']>0 ? 1 : 0));
                       
                        if (!empty($title)) $comment_data['title'] = $title;
                        if (!empty($url)) $comment_data['url'] = $url;
                        if (!$this->comment_db->insert($comment_data)) {
                                $this->msg_code = 5;
                                return false;
                        }
                } else {//评论存在时
                        $tableid = $comment['tableid'];
                }
                if (empty($tableid)) {
                        $this->msg_code = 1;
                        return false;
                }
                //为数据存储数据模型设置 数据表名。
                $this->comment_data_db->table_name($tableid);
                //检查数据存储表。
                if (!$this->comment_data_db->table_exists('comment_data_'.$tableid)) {
                        //当存储数据表不存时,尝试创建数据表。
                        if (!$tableid = $this->comment_table_db->creat_table($tableid)) {
                                $this->msg_code = 2;
                                return false;
                        }
                }
                //向数据存储表中写入数据。       
                $data['commentid'] = $commentid;
                $data['siteid'] = $siteid;
                $data['ip'] = ip();
                $data['status'] = 1;
                $data['creat_at'] = SYS_TIME;
                //对评论的内容进行关键词过滤。
                $data['content'] = strip_tags($data['content']); //去掉html xml php标签
                $badword = pc_base::load_model('badword_model');
                $data['content'] = $badword->replace_badword($data['content']);
                if ($id) {
                        $r = $this->comment_data_db->get_one(array('id'=>$id));
//直接读出内容了,没有过滤
                        if ($r) {
                                pc_base::load_sys_class('format', '', 0);
                                if ($r['reply']) {
                                        $data['content'] = '<div class="content">'.str_replace('<span></span>', '<span class="blue f12">'.$r['username'].' '.L('chez').' '.format::date($r['creat_at'], 1).L('release').'</span>', $r['content']).'</div><span></span>'.$data['content'];
                                } else {
                                        $data['content'] = '<div class="content"><span class="blue f12">'.$r['username'].' '.L('chez').' '.format::date($r['creat_at'], 1).L('release').'</span><pre>'.$r['content'].'</pre></div><span></span>'.$data['content'];
                                }
                                $data['reply'] = 1;
  //echo $data[content];//直接读取数据,没有编码。炯。下面是图
                            // exit;
                        }
                }
                //判断当前站点是否需要审核
               
                $site = $this->comment_setting_db->site($siteid);

                if ($site['check']) {
                        $data['status'] = 0;

                }
                //echo $data[content];
                if ($comment_data_id = $this->comment_data_db->insert($data, true)) { //插入数据库。
                        //需要审核,插入到审核表
                                //echo $comment_data_id;
                                //exit;
                        if ($data['status']==0) {
                                $this->comment_check_db->insert(array('comment_data_id'=>$comment_data_id, 'siteid'=>$siteid,'tableid'=>$tableid));
                                echo 1;
                                exit;
                        } elseif (!empty($data['userid']) && !empty($site['add_point']) && module_exists('pay')) { //不需要审核直接给用户添加积分
                                pc_base::load_app_class('receipts', 'pay', 0);
                                receipts::point($site['add_point'], $data['userid'], $data['username'], '', 'selfincome', 'Comment');
                        }
                        //开始更新数据存储表数据总条数
                        $this->comment_table_db->edit_total($tableid, '+=1');
                        //开始更新评论总表数据总数
                        $sql['lastupdate'] = SYS_TIME;
                        //只有在评论通过的时候才更新评论主表的评论数
                        if ($data['status'] == 1) {
                                $sql['total'] = '+=1';
                                switch ($data['direction']) {
                                        case 1: //正方
                                                $sql['square'] = '+=1';
                                                break;
                                        case 2://反方
                                                $sql['anti'] = '+=1';
                                                break;
                                        case 3://中立方
                                                $sql['neutral'] = '+=1';
                                                break;
                                }
                        }
                        $this->comment_db->update($sql, array('commentid'=>$commentid));
                        if ($site['check']) {
                                $this->msg_code = 7;
                        } else {
                                $this->msg_code = 0;
                        }
                        return true;
                } else {
                        $this->msg_code = 3;
                        return false;
                }
        }
最后插入数据是这样的。
mysql.class.php文件
        public function insert($data, $table, $return_insert_id = false, $replace = false) {
                if(!is_array( $data ) || $table == '' || count($data) == 0) {
                        return false;
                }
               
                $fielddata = array_keys($data);
                $valuedata = array_values($data);
                array_walk($fielddata, array($this, 'add_special_char'));
                array_walk($valuedata, array($this, 'escape_string')); //取valuae
               
                $field = implode (',', $fielddata);
                $value = implode (',', $valuedata);//每条进行分割

                $cmd = $replace ? 'REPLACE INTO' : 'INSERT INTO';
                $sql = $cmd.' `'.$this->config['database'].'`.`'.$table.'`('.$field.') VALUES ('.$value.')';
                //echo $sql;
                //exit;
                $return = $this->execute($sql);
                return $return_insert_id ? $this->insert_id() : $return;
        }
回复评论的时候



下面测试开始:

第一次发表评论的时候






进入数据库后。

再次评论的时候,我们从数据库直接读取数据,没有过滤直接如下。


去掉echo 之这样

不对的地方给改正些,发了这么多一个金币都没有。。。

关于作者

xiaoxiaoabc68篇文章774篇回复

评论5次

要评论?请先  登录  或  注册