Browse Source

流量统计功能增加蜘蛛判断及查询

develop
tianya 4 days ago
parent
commit
754e10158f
7 changed files with 69 additions and 21 deletions
  1. +5
    -1
      docs/changelog.md
  2. +9
    -0
      src/admin/statistics_list.php
  3. +5
    -0
      src/admin/templets/statistics_list.htm
  4. +3
    -0
      src/system/archive/archives.class.php
  5. +1
    -1
      src/system/libraries/crawlerdetect.class.php
  6. +38
    -11
      src/system/libraries/fixtures/crawlers.php
  7. +8
    -8
      src/system/libraries/statistics.class.php

+ 5
- 1
docs/changelog.md View File

@@ -1,6 +1,10 @@
# 更新记录 # 更新记录
通过访问 https://www.dedebiz.com/git 获取完整更新记录 通过访问 https://www.dedebiz.com/git 获取完整更新记录


# V6.5.8
- 流量统计功能增加蜘蛛判断及查询;
- 修复自定义模型中字段禁止会员投稿的问题;
# V6.5.6 # V6.5.6
- PHP8高版本兼容性调整; - PHP8高版本兼容性调整;
- SQLite支持兼容性调整; - SQLite支持兼容性调整;
@@ -79,7 +83,7 @@
- 修正TAG生成目录错误; - 修正TAG生成目录错误;
- 移除FTP的支持; - 移除FTP的支持;
- 其他常规问题修复; - 其他常规问题修复;
-
# V6.2.10 # V6.2.10
- DedeBIZ基于自由软件基金会发行的GPL v2许可证发布 - DedeBIZ基于自由软件基金会发行的GPL v2许可证发布
- 修正后台功能说明提示; - 修正后台功能说明提示;


+ 9
- 0
src/admin/statistics_list.php View File

@@ -12,6 +12,8 @@ require_once(dirname(__FILE__)."/config.php");
require_once(DEDEINC.'/datalistcp.class.php'); require_once(DEDEINC.'/datalistcp.class.php');
function RenderUrlType($t) { function RenderUrlType($t) {
switch ($t) { switch ($t) {
case -1:
return "蜘蛛";
case 1: case 1:
return "列表"; return "列表";
case 2: case 2:
@@ -31,6 +33,7 @@ if (isset($id) && isset($reid)) {
} }
} }
$ip = isset($ip) ? HtmlReplace(trim($ip)) : ''; $ip = isset($ip) ? HtmlReplace(trim($ip)) : '';
$url_type = isset($url_type) ? intval($url_type) : 0;
if (empty($mobile)) $mobile = ''; if (empty($mobile)) $mobile = '';
if (isset($dopost) && $dopost == "delete") { if (isset($dopost) && $dopost == "delete") {
$ids = explode('`',$aids); $ids = explode('`',$aids);
@@ -47,12 +50,18 @@ if (isset($dopost) && $dopost == "delete") {
exit(); exit();
} else { } else {
$addsql = " WHERE ip LIKE '%$ip%' "; $addsql = " WHERE ip LIKE '%$ip%' ";
if ($url_type === -1) {
$addsql .= " AND url_type = -1 ";
} else if ($url_type === 1) {
$addsql .= " AND url_type > 0 ";
}
$sql = "SELECT * FROM `#@__statistics_detail` $addsql ORDER BY id DESC"; $sql = "SELECT * FROM `#@__statistics_detail` $addsql ORDER BY id DESC";
$dlist = new DataListCP(); $dlist = new DataListCP();
//流量列表数 //流量列表数
$dlist->pagesize = 30; $dlist->pagesize = 30;
$tplfile = DEDEADMIN."/templets/statistics_list.htm"; $tplfile = DEDEADMIN."/templets/statistics_list.htm";
$dlist->SetParameter("ip",$ip); $dlist->SetParameter("ip",$ip);
$dlist->SetParameter("url_type",$url_type);
$dlist->SetTemplate($tplfile); $dlist->SetTemplate($tplfile);
$dlist->SetSource($sql); $dlist->SetSource($sql);
$dlist->Display(); $dlist->Display();


+ 5
- 0
src/admin/templets/statistics_list.htm View File

@@ -21,6 +21,11 @@
<div class="card-body"> <div class="card-body">
<form name="form1" action="statistics_list.php" method="get"> <form name="form1" action="statistics_list.php" method="get">
<input type="text" name="ip" class="admin-input-lg" placeholder="请输入地址ip" value="<?php echo !empty($ip)? $ip : '';?>"> <input type="text" name="ip" class="admin-input-lg" placeholder="请输入地址ip" value="<?php echo !empty($ip)? $ip : '';?>">
<select name="url_type" class="admin-input-sm mr-2">
<option value="0"<?php echo $url_type ===0? ' selected' : '';?>>选择类型</option>
<option value="1"<?php echo $url_type ===1? ' selected' : '';?>>用户</option>
<option value="-1"<?php echo $url_type ===-1? ' selected' : '';?>>蜘蛛</option>
</select>
<button type="submit" class="btn btn-success btn-sm">搜索</button> <button type="submit" class="btn btn-success btn-sm">搜索</button>
</form> </form>
</div> </div>


+ 3
- 0
src/system/archive/archives.class.php View File

@@ -60,6 +60,9 @@ class Archives
//如果当前文档不是系统模型,为自定义模型 //如果当前文档不是系统模型,为自定义模型
$query = "SELECT arc.*,tp.reid,tp.typedir,ch.addtable,mb.uname,mb.face,mb.userid,mb.sex FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp on tp.id=arc.typeid LEFT JOIN `#@__channeltype` as ch on arc.channel = ch.id LEFT JOIN `#@__member` mb on arc.mid = mb.mid WHERE arc.id='$aid' "; $query = "SELECT arc.*,tp.reid,tp.typedir,ch.addtable,mb.uname,mb.face,mb.userid,mb.sex FROM `#@__archives` arc LEFT JOIN `#@__arctype` tp on tp.id=arc.typeid LEFT JOIN `#@__channeltype` as ch on arc.channel = ch.id LEFT JOIN `#@__member` mb on arc.mid = mb.mid WHERE arc.id='$aid' ";
$this->Fields = $this->dsql->GetOne($query); $this->Fields = $this->dsql->GetOne($query);
if (!is_array($this->Fields)) {
echo DedeAlert('id:'.$aid.'的文档数据不存在',ALERT_DANGER);
}
} else { } else {
$this->Fields['title'] = ''; $this->Fields['title'] = '';
$this->Fields['money'] = $this->Fields['arcrank'] = 0; $this->Fields['money'] = $this->Fields['arcrank'] = 0;


+ 1
- 1
src/system/libraries/crawlerdetect.class.php View File

@@ -64,7 +64,7 @@ class CrawlerDetect
/** /**
* Class constructor. * Class constructor.
*/ */
public function __construct(array $headers = null, $userAgent = null)
public function __construct($headers = null, $userAgent = null)
{ {
$this->crawlers = new Crawlers(); $this->crawlers = new Crawlers();
$this->exclusions = new Exclusions(); $this->exclusions = new Exclusions();


+ 38
- 11
src/system/libraries/fixtures/crawlers.php View File

@@ -1,5 +1,5 @@
<?php <?php
if (!defined('DEDEINC')) exit ('dedebiz');
if (!defined('DEDEINC')) exit('dedebiz');
/* /*
* This file is part of Crawler Detect - the web crawler detection library. * This file is part of Crawler Detect - the web crawler detection library.
* *
@@ -8,7 +8,7 @@ if (!defined('DEDEINC')) exit ('dedebiz');
* This source file is subject to the MIT license that is bundled * This source file is subject to the MIT license that is bundled
* with this source code in the file LICENSE. * with this source code in the file LICENSE.
*/ */
require_once(DEDEINC."/libraries/fixtures/abstractprovider.php");
require_once(DEDEINC . "/libraries/fixtures/abstractprovider.php");


class Crawlers extends AbstractProvider class Crawlers extends AbstractProvider
{ {
@@ -22,6 +22,7 @@ class Crawlers extends AbstractProvider
'^Aether', '^Aether',
'^Amazon Simple Notification Service Agent$', '^Amazon Simple Notification Service Agent$',
'^Amazon-Route53-Health-Check-Service', '^Amazon-Route53-Health-Check-Service',
'^Amazon CloudFront',
'^b0t$', '^b0t$',
'^bluefish ', '^bluefish ',
'^Calypso v\/', '^Calypso v\/',
@@ -57,6 +58,7 @@ class Crawlers extends AbstractProvider
'^pnpm\/', '^pnpm\/',
'^RMA\/', '^RMA\/',
'^Ruby|Ruby\/[0-9]', '^Ruby|Ruby\/[0-9]',
"^symbolicator\\/",
'^Swurl ', '^Swurl ',
'^TLS tester ', '^TLS tester ',
'^twine\/', '^twine\/',
@@ -159,7 +161,6 @@ class Crawlers extends AbstractProvider
'a\.pr-cy\.ru', 'a\.pr-cy\.ru',
'B-l-i-t-z-B-O-T', 'B-l-i-t-z-B-O-T',
'Backlink-Ceck', 'Backlink-Ceck',
'backlink-check',
'BacklinkHttpStatus', 'BacklinkHttpStatus',
'BackStreet', 'BackStreet',
'BackupLand', 'BackupLand',
@@ -168,6 +169,7 @@ class Crawlers extends AbstractProvider
'Badass', 'Badass',
'baidu\.com', 'baidu\.com',
'Bandit', 'Bandit',
'Barracuda Sentinel \(EE\)',
'basicstate', 'basicstate',
'BatchFTP', 'BatchFTP',
'Battleztar Bazinga', 'Battleztar Bazinga',
@@ -208,7 +210,6 @@ class Crawlers extends AbstractProvider
'Branch Metrics API', 'Branch Metrics API',
'Branch-Passthrough', 'Branch-Passthrough',
'Brandprotect', 'Brandprotect',
'BrandVerity',
'Brandwatch', 'Brandwatch',
'Brodie\/', 'Brodie\/',
'Browsershots', 'Browsershots',
@@ -222,6 +223,7 @@ class Crawlers extends AbstractProvider
'Butterfly\/', 'Butterfly\/',
'BuzzSumo', 'BuzzSumo',
'CAAM\/[0-9]', 'CAAM\/[0-9]',
'caam dot crwlr at gmail dot com',
'CakePHP', 'CakePHP',
'Calculon', 'Calculon',
'Canary%20Mail', 'Canary%20Mail',
@@ -294,6 +296,7 @@ class Crawlers extends AbstractProvider
'DareBoost', 'DareBoost',
'DatabaseDriverMysqli', 'DatabaseDriverMysqli',
'DataCha0s', 'DataCha0s',
'DatadogSynthetics',
'Datafeedwatch', 'Datafeedwatch',
'Datanyze', 'Datanyze',
'DataparkSearch', 'DataparkSearch',
@@ -374,6 +377,7 @@ class Crawlers extends AbstractProvider
'Extreme Picture Finder', 'Extreme Picture Finder',
'EyeNetIE', 'EyeNetIE',
'ezooms', 'ezooms',
'facebookcatalog',
'facebookexternalhit', 'facebookexternalhit',
'facebookexternalua', 'facebookexternalua',
'facebookplatform', 'facebookplatform',
@@ -420,16 +424,20 @@ class Crawlers extends AbstractProvider
'Flunky', 'Flunky',
'flynxapp', 'flynxapp',
'forensiq', 'forensiq',
'ForusP',
'FoundSeoTool', 'FoundSeoTool',
'free gallery',
'fragFINN\.de',
'free thumbnails',
'Freeuploader', 'Freeuploader',
'FreshRSS', 'FreshRSS',
'frontman',
'Funnelback', 'Funnelback',
'Fuzz Faster U Fool', 'Fuzz Faster U Fool',
'G-i-g-a-b-o-t', 'G-i-g-a-b-o-t',
'g00g1e\.net', 'g00g1e\.net',
'ganarvisitas', 'ganarvisitas',
'gdnplus\.com', 'gdnplus\.com',
'GeedoProductSearch',
'geek-tools', 'geek-tools',
'Genieo', 'Genieo',
'GentleSource', 'GentleSource',
@@ -471,13 +479,13 @@ class Crawlers extends AbstractProvider
'Google PP Default', 'Google PP Default',
'Google Search Console', 'Google Search Console',
'Google Web Preview', 'Google Web Preview',
'Google-Ads-Creatives-Assistant',
'Google-Ads-Overview',
'Google-Ads',
'Google-Adwords', 'Google-Adwords',
'Google-Apps-Script', 'Google-Apps-Script',
'Google-Calendar-Importer', 'Google-Calendar-Importer',
'Google-HotelAdsVerifier', 'Google-HotelAdsVerifier',
'Google-HTTP-Java-Client', 'Google-HTTP-Java-Client',
'Google-InspectionTool',
'Google-Podcast', 'Google-Podcast',
'Google-Publisher-Plugin', 'Google-Publisher-Plugin',
'Google-Read-Aloud', 'Google-Read-Aloud',
@@ -491,6 +499,7 @@ class Crawlers extends AbstractProvider
'Google-Youtube-Links', 'Google-Youtube-Links',
'GoogleDocs', 'GoogleDocs',
'GoogleHC\/', 'GoogleHC\/',
'GoogleOther',
'GoogleProber', 'GoogleProber',
'GoogleProducer', 'GoogleProducer',
'GoogleSites', 'GoogleSites',
@@ -524,7 +533,6 @@ class Crawlers extends AbstractProvider
'Hatena', 'Hatena',
'Havij', 'Havij',
'HaxerMen', 'HaxerMen',
'HeadlessChrome',
'HEADMasterSEO', 'HEADMasterSEO',
'HeartRails_Capture', 'HeartRails_Capture',
'help@dataminr\.com', 'help@dataminr\.com',
@@ -552,7 +560,7 @@ class Crawlers extends AbstractProvider
'http-request\/', 'http-request\/',
'HTTP-Tiny', 'HTTP-Tiny',
'HTTP::Lite', 'HTTP::Lite',
'http:\/\/www.neomo.de\/', //'Francis [Bot]'
'http:\/\/www.neomo.de\/', // 'Francis [Bot]'
'HttpComponents', 'HttpComponents',
'httphr', 'httphr',
'HTTPie', 'HTTPie',
@@ -614,6 +622,7 @@ class Crawlers extends AbstractProvider
'intraVnews', 'intraVnews',
'IODC', 'IODC',
'IOI', 'IOI',
'Inboxb0t',
'iplabel', 'iplabel',
'ips-agent', 'ips-agent',
'IPS\/[0-9]', 'IPS\/[0-9]',
@@ -662,6 +671,7 @@ class Crawlers extends AbstractProvider
'knows\.is', 'knows\.is',
'KOCMOHABT', 'KOCMOHABT',
'kouio', 'kouio',
'krawler\.dk',
'kube-probe', 'kube-probe',
'kubectl', 'kubectl',
'kulturarw3', 'kulturarw3',
@@ -686,6 +696,7 @@ class Crawlers extends AbstractProvider
'Link Valet', 'Link Valet',
'LinkAlarm\/', 'LinkAlarm\/',
'LinkAnalyser', 'LinkAnalyser',
'link-check',
'linkCheck', 'linkCheck',
'linkdex', 'linkdex',
'LinkExaminer', 'LinkExaminer',
@@ -706,6 +717,7 @@ class Crawlers extends AbstractProvider
'longurl-r-package', 'longurl-r-package',
'looid\.com', 'looid\.com',
'looksystems\.net', 'looksystems\.net',
'lscache_runner',
'ltx71', 'ltx71',
'lua-resty-http', 'lua-resty-http',
'Lucee \(CFML Engine\)', 'Lucee \(CFML Engine\)',
@@ -718,6 +730,7 @@ class Crawlers extends AbstractProvider
'L\.webis', 'L\.webis',
'mabontland', 'mabontland',
'MacOutlook\/', 'MacOutlook\/',
'MagentaNews\/',
'Mag-Net', 'Mag-Net',
'MagpieRSS', 'MagpieRSS',
'Mail::STS', 'Mail::STS',
@@ -734,6 +747,7 @@ class Crawlers extends AbstractProvider
'masscan\/', 'masscan\/',
'Mata Hari', 'Mata Hari',
'mattermost', 'mattermost',
'MatchorySearch\/',
'Mediametric', 'Mediametric',
'Mediapartners-Google', 'Mediapartners-Google',
'mediawords', 'mediawords',
@@ -751,6 +765,7 @@ class Crawlers extends AbstractProvider
'Microsoft Windows Network Diagnostics', 'Microsoft Windows Network Diagnostics',
'Microsoft-WebDAV-MiniRedir', 'Microsoft-WebDAV-MiniRedir',
'Microsoft\.Data\.Mashup', 'Microsoft\.Data\.Mashup',
'MicrosoftPreview',
'MIDown tool', 'MIDown tool',
'MIIxpc', 'MIIxpc',
'Mindjet', 'Mindjet',
@@ -766,10 +781,12 @@ class Crawlers extends AbstractProvider
'mogimogi', 'mogimogi',
'Mojeek', 'Mojeek',
'Mojolicious \(Perl\)', 'Mojolicious \(Perl\)',
'Mollie',
'monitis', 'monitis',
'Monitority\/', 'Monitority\/',
'Monit\/', 'Monit\/',
'montastic', 'montastic',
'MonSpark',
'MonTools', 'MonTools',
'Moreover', 'Moreover',
'Morfeus Fucking Scanner', 'Morfeus Fucking Scanner',
@@ -793,6 +810,7 @@ class Crawlers extends AbstractProvider
'Nameprotect', 'Nameprotect',
'nationalarchives', 'nationalarchives',
'Navroad', 'Navroad',
'nbertaupete95',
'NearSite', 'NearSite',
'Needle', 'Needle',
'Nessus', 'Nessus',
@@ -947,6 +965,7 @@ class Crawlers extends AbstractProvider
'PrintFriendly', 'PrintFriendly',
'PritTorrent', 'PritTorrent',
'Prlog', 'Prlog',
'probely\.com',
'probethenet', 'probethenet',
'Project ?25499', 'Project ?25499',
'Project-Resonance', 'Project-Resonance',
@@ -958,6 +977,7 @@ class Crawlers extends AbstractProvider
'pshtt, https scanning', 'pshtt, https scanning',
'PTST ', 'PTST ',
'PTST\/[0-9]+', 'PTST\/[0-9]+',
'pulsetic\.com',
'Pump', 'Pump',
'Python-httplib2', 'Python-httplib2',
'python-httpx', 'python-httpx',
@@ -1006,6 +1026,7 @@ class Crawlers extends AbstractProvider
'RPT-HTTPClient', 'RPT-HTTPClient',
'RSSMix\/', 'RSSMix\/',
'RSSOwl', 'RSSOwl',
'RuxitSynthetic',
'RyowlEngine', 'RyowlEngine',
'safe-agent-scanner', 'safe-agent-scanner',
'SalesIntelligent', 'SalesIntelligent',
@@ -1050,6 +1071,7 @@ class Crawlers extends AbstractProvider
'Seobility', 'Seobility',
'SEOCentro', 'SEOCentro',
'SeoCheck', 'SeoCheck',
'seocompany',
'SEOkicks', 'SEOkicks',
'SEOlizer', 'SEOlizer',
'Seomoz', 'Seomoz',
@@ -1119,9 +1141,11 @@ class Crawlers extends AbstractProvider
'SpamExperts', 'SpamExperts',
'Spammen', 'Spammen',
'Spanner', 'Spanner',
'Spawning-AI',
'spaziodati', 'spaziodati',
'SPDYCheck', 'SPDYCheck',
'Specificfeeds', 'Specificfeeds',
'SpeedKit',
'speedy', 'speedy',
'SPEng', 'SPEng',
'Spinn3r', 'Spinn3r',
@@ -1244,9 +1268,11 @@ class Crawlers extends AbstractProvider
'VB Project', 'VB Project',
'vBSEO', 'vBSEO',
'VCI', 'VCI',
'Verity',
'via ggpht\.com GoogleImageProxy', 'via ggpht\.com GoogleImageProxy',
'Virusdie', 'Virusdie',
'visionutils', 'visionutils',
'Visual Rights Group',
'vkShare', 'vkShare',
'VoidEYE', 'VoidEYE',
'Voil', 'Voil',
@@ -1394,6 +1420,7 @@ class Crawlers extends AbstractProvider
'Zabbix', 'Zabbix',
'Zade', 'Zade',
'Zao', 'Zao',
'Zapier',
'Zauba', 'Zauba',
'Zemanta Aggregator', 'Zemanta Aggregator',
'Zend\\\\Http\\\\Client', 'Zend\\\\Http\\\\Client',
@@ -1407,6 +1434,6 @@ class Crawlers extends AbstractProvider
'Zoom\.Mac', 'Zoom\.Mac',
'ZoteroTranslationServer', 'ZoteroTranslationServer',
'ZyBorg', 'ZyBorg',
'[a-z0-9\-_]*(bot|crawl|archiver|transcoder|spider|uptime|validator|fetcher|cron|checker|reader|extractor|monitoring|analyzer|scraper)',
'[a-z0-9\-_]*(bot|crawl|headless|archiver|transcoder|spider|uptime|validator|fetcher|cron|checker|reader|extractor|monitoring|analyzer|scraper)',
); );
}
}

+ 8
- 8
src/system/libraries/statistics.class.php View File

@@ -19,10 +19,6 @@ class DedeStatistics {
{ {
global $envs, $cfg_cookie_encode; global $envs, $cfg_cookie_encode;
$agent = new Agent(); $agent = new Agent();
//不记录爬虫
if ($agent->isRobot()) {
return "";
}
$pm = array(); $pm = array();
$pm['dduuid'] = GetCookie("DedeStUUID"); $pm['dduuid'] = GetCookie("DedeStUUID");
if (empty($pm['dduuid'])) { if (empty($pm['dduuid'])) {
@@ -46,6 +42,10 @@ class DedeStatistics {
$pm['created_date'] = MyDate("Ymd",$pm['t']); $pm['created_date'] = MyDate("Ymd",$pm['t']);
$pm['created_hour'] = MyDate("H",$pm['t']); $pm['created_hour'] = MyDate("H",$pm['t']);
$pm['url_type'] = isset($envs['url_type'])? $envs['url_type'] : $url_type; $pm['url_type'] = isset($envs['url_type'])? $envs['url_type'] : $url_type;
if ($crawler = $agent->robot($agent->getUserAgent())) {
$pm['url_type'] = -1;
$pm['browser'] = $crawler;
}
$pm['typeid'] = isset($envs['typeid'])? $envs['typeid'] : $typeid; $pm['typeid'] = isset($envs['typeid'])? $envs['typeid'] : $typeid;
$pm['aid'] = isset($envs['aid'])? $envs['aid'] : $aid; $pm['aid'] = isset($envs['aid'])? $envs['aid'] : $aid;
$pm['value'] = isset($envs['value'])? $envs['value'] : $value; $pm['value'] = isset($envs['value'])? $envs['value'] : $value;
@@ -156,10 +156,10 @@ class DedeStatistics {
if (is_array($info)) { if (is_array($info)) {
return $info; return $info;
} }
$pv = $dsql->GetOne("SELECT COUNT(*) as total FROM `#@__statistics_detail` WHERE created_date = $d");
$uv = $dsql->GetOne("SELECT COUNT(DISTINCT dduuid) as total FROM `#@__statistics_detail` WHERE created_date = $d");
$ip = $dsql->GetOne("SELECT COUNT(DISTINCT ip) as total FROM `#@__statistics_detail` WHERE created_date = $d");
$vv = $dsql->GetOne("SELECT COUNT(DISTINCT ssid) as total FROM `#@__statistics_detail` WHERE created_date = $d");
$pv = $dsql->GetOne("SELECT COUNT(*) as total FROM `#@__statistics_detail` WHERE created_date = $d AND url_type >= 0");
$uv = $dsql->GetOne("SELECT COUNT(DISTINCT dduuid) as total FROM `#@__statistics_detail` WHERE created_date = $d AND url_type >= 0");
$ip = $dsql->GetOne("SELECT COUNT(DISTINCT ip) as total FROM `#@__statistics_detail` WHERE created_date = $d AND url_type >= 0");
$vv = $dsql->GetOne("SELECT COUNT(DISTINCT ssid) as total FROM `#@__statistics_detail` WHERE created_date = $d AND url_type >= 0");
if ($d < intval($today)) { if ($d < intval($today)) {
//缓存数据 //缓存数据
$insql = "INSERT INTO `#@__statistics` (`sdate`,`pv`,`uv`,`ip`,`vv`) VALUES ('$d', '{$pv['total']}','{$uv['total']}','{$ip['total']}','{$vv['total']}')"; $insql = "INSERT INTO `#@__statistics` (`sdate`,`pv`,`uv`,`ip`,`vv`) VALUES ('$d', '{$pv['total']}','{$uv['total']}','{$ip['total']}','{$vv['total']}')";


Loading…
Cancel
Save