国产精品爱啪在线线免费观看_97视频精品_欧美精品一区二区在线播放_国产欧美久久一区二区三区

新秀網(wǎng)絡(luò)驗(yàn)證系統(tǒng)

標(biāo)題: Discuz x3.5 核心文件 class_card.php [打印本頁(yè)]

作者: admin    時(shí)間: 2024-5-12 22:45
標(biāo)題: Discuz x3.5 核心文件 class_card.php
[PHP] 純文本查看 復(fù)制代碼
<?php

/**
*      [Discuz!] (C)2001-2099 Comsenz Inc.
*      This is NOT a freeware, use is subject to license terms
*
*      $Id: class_card.php 27449 2012-02-01 05:32:35Z zhangguosheng $
*/

if(!defined('IN_DISCUZ')) {
        exit('Access Denied');
}
class card{

        var $set = array();
        var $rulekey = array("str"=>"\@", "num"=>"\#", "full"=>"\*");
        var $sysrule = '';
        var $rule = '';
        var $rulemap_str = "ABCDEFGHIJKLMNPQRSTUVWXYZ";
        var $rulemap_num = "123456789";

        var $rulereturn = array();
        var $cardlist = array();

        var $succeed = 0;
        var $fail = 0;
        var $failmin = 1;
        var $failrate = '0.1';


        function __construct() {
                $this->init();
        }
        /**
         * 初始化函數(shù)
         * 設(shè)置系統(tǒng)變量和規(guī)則
         */
        function init() {
            global $_G;
            $this->set = &$_G['setting']['card']; // 引用全局設(shè)置中的卡片設(shè)置
            $this->sysrule = "^[A-Z0-9".implode('|', $this->rulekey)."]+$"; // 定義系統(tǒng)認(rèn)可的規(guī)則字符集
        }

        /**
         * 生成卡片規(guī)則
         * @param string $rule 用戶自定義規(guī)則,為空則使用默認(rèn)規(guī)則
         * @param int $num 生成卡片的數(shù)量
         * @param array $cardval 卡片值的數(shù)組,包含額外的信息如生成者UID和時(shí)間戳
         * @return int 返回生成結(jié)果,成功為true,失敗為-1或其他錯(cuò)誤代碼
         */
        function make($rule = '', $num = 1, $cardval = array()) {
            global $_G;
            $this->rule = empty($rule) ? $this->set['rule'] : trim($rule); // 確定使用的規(guī)則
            if(empty($this->rule)) {
                return -1; // 如果沒(méi)有有效的規(guī)則,直接返回-1
            }
            $this->fail($num); // 初始化失敗嘗試次數(shù)
            $cardval['makeruid'] = $_G['uid']; // 設(shè)置制作卡片的用戶UID
            $cardval['dateline'] = $_G['timestamp']; // 設(shè)置卡片創(chuàng)建時(shí)間戳
            for($i = 0; $i < $num ; $i++) { // 開(kāi)始生成指定數(shù)量的卡片
                if($this->checkrule($this->rule)) { // 檢查規(guī)則是否符合要求
                    $card = $this->rule; // 使用規(guī)則創(chuàng)建卡片
                    foreach($this->rulereturn AS $key => $val) { // 替換規(guī)則中的占位符
                        $search = array();
                        foreach($val AS $skey => $sval) {
                            $search[] = '/'.$this->rulekey[$key].'/';
                        }
                        $card =  preg_replace($search, $val, $card, 1);
                    }
                } else {
                    return 0; // 如果規(guī)則檢查失敗,則返回0
                }
                $cardval['id'] = $card; // 設(shè)置卡片ID
                C::t('common_card')->insert($cardval, false, false, 'SILENT'); // 試圖插入卡片信息到數(shù)據(jù)庫(kù)
                if(($sqlerror = DB::error())) { // 檢查數(shù)據(jù)庫(kù)操作是否出錯(cuò)
                    if($sqlerror == 1062) { // 處理唯一性沖突
                        $this->fail++;
                        if($this->failmin > $this->fail) {
                            $num++;
                        } else {
                            $num = $i - 1;
                        }
                    }
                } else {
                    $this->succeed += intval(DB::affected_rows()); // 記錄成功插入的卡片數(shù)量
                    $this->cardlist[] = $card; // 收集生成的卡片ID
                }
            }
            return true; // 如果生成過(guò)程沒(méi)有遇到錯(cuò)誤,則返回true
        }

        /**
         * 檢查規(guī)則是否有效
         * @param string $rule 待檢查的規(guī)則
         * @param string $type 檢查類型,默認(rèn)為'0'
         * @return int 返回檢查結(jié)果,true表示規(guī)則有效,-2表示規(guī)則格式不正確
         */
        function checkrule($rule, $type = '0') {
            if(!preg_match("/($this->sysrule)/i", $rule)){ // 檢查規(guī)則是否符合系統(tǒng)定義的格式
                return -2;
            }
            if($type == 0) { // 如果是類型0的規(guī)則,進(jìn)一步處理
                foreach($this->rulekey AS $key => $val) { // 遍歷規(guī)則關(guān)鍵字
                    $match = array();
                    preg_match_all("/($val){1}/i", $rule, $match); // 匹配規(guī)則中出現(xiàn)的關(guān)鍵字
                    $number[$key] = count($match[0]); // 統(tǒng)計(jì)每個(gè)關(guān)鍵字出現(xiàn)的次數(shù)
                    if($number[$key] > 0) { // 如果有關(guān)鍵字出現(xiàn),則隨機(jī)替換為具體值
                        for($i = 0; $i < $number[$key]; $i++) {
                            switch($key) {
                            case 'str':
                                $rand = mt_rand(0, (strlen($this->rulemap_str) - 1));
                                $this->rulereturn[$key][$i] = $this->rulemap_str[$rand];
                                break;
                            case 'num':
                                $rand = mt_rand(0, (strlen($this->rulemap_num) - 1));
                                $this->rulereturn[$key][$i] = $this->rulemap_num[$rand];
                                break;
                            case 'full':
                                $fullstr = $this->rulemap_str.$this->rulemap_num;
                                $rand = mt_rand(0,(strlen($fullstr) - 1));
                                $this->rulereturn[$key][$i] = $fullstr[$rand];
                                break;
                            }
                        }
                    }
                }
            }
            return true; // 如果規(guī)則檢查通過(guò),則返回true
        }

        /**
         * 根據(jù)生成卡片的數(shù)量,計(jì)算允許的失敗次數(shù)
         * @param int $num 企圖生成的卡片數(shù)量
         */
        function fail($num = 1) {
            $failrate = $this->failrate ? (float)$this->failrate : '0.1'; // 獲取失敗率,若未設(shè)置則默認(rèn)為0.1
            $this->failmin = ceil($num * $failrate); // 計(jì)算最少的失敗次數(shù)
            $this->failmin = $this->failmin > 100 ? 100 : $this->failmin; // 限制失敗次數(shù)的最大值為100
        }
};
?>






歡迎光臨 新秀網(wǎng)絡(luò)驗(yàn)證系統(tǒng) (http://www.5566wy.com/) Powered by Discuz! X3.5