123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521 |
- <?php
- /**
- * [Discuz!] (C)2001-2099 Comsenz Inc.
- * This is NOT a freeware, use is subject to license terms
- *
- * $Id: table_common_member.php 31849 2012-10-17 04:39:16Z zhangguosheng $
- */
- if(!defined('IN_DISCUZ')) {
- exit('Access Denied');
- }
- class table_common_member extends discuz_table_archive
- {
- public function __construct() {
- $this->_table = 'common_member';
- $this->_pk = 'uid';
- $this->_pre_cache_key = 'common_member_';
- parent::__construct();
- }
- public function update_credits($uid, $credits) {
- if($uid) {
- $data = array('credits'=>intval($credits));
- DB::update($this->_table, $data, array('uid' => intval($uid)), 'UNBUFFERED');
- $this->update_cache($uid, $data);
- }
- }
- public function update_by_groupid($groupid, $data) {
- $uids = array();
- $groupid = dintval($groupid, true);
- if($groupid && $this->_allowmem) {
- $uids = array_keys($this->fetch_all_by_groupid($groupid));
- }
- if($groupid && !empty($data) && is_array($data)) {
- DB::update($this->_table, $data, DB::field('groupid', $groupid), 'UNBUFFERED');
- }
- if($uids) {
- $this->update_cache($uids, $data);
- }
- }
- public function increase($uids, $setarr) {
- $uids = dintval((array)$uids, true);
- $sql = array();
- $allowkey = array('credits', 'newpm', 'newprompt');
- foreach($setarr as $key => $value) {
- if(($value = intval($value)) && in_array($key, $allowkey)) {
- $sql[] = "`$key`=`$key`+'$value'";
- }
- }
- if(!empty($sql)){
- DB::query("UPDATE ".DB::table($this->_table)." SET ".implode(',', $sql)." WHERE uid IN (".dimplode($uids).")", 'UNBUFFERED');
- $this->increase_cache($uids, $setarr);
- }
- }
- public function fetch_by_username($username, $fetch_archive = 0) {
- $user = array();
- if($username) {
- $user = DB::fetch_first('SELECT * FROM %t WHERE username=%s', array($this->_table, $username));
- if(isset($this->membersplit) && $fetch_archive && empty($user)) {
- $user = C::t($this->_table.'_archive')->fetch_by_username($username, 0);
- }
- }
- return $user;
- }
- public function fetch_all_by_username($usernames, $fetch_archive = 1) {
- $users = array();
- if(!empty($usernames)) {
- $users = DB::fetch_all('SELECT * FROM %t WHERE username IN (%n)', array($this->_table, (array)$usernames), 'username');
- if(isset($this->membersplit) && $fetch_archive && count($usernames) !== count($users)) {
- $users += C::t($this->_table.'_archive')->fetch_all_by_username($usernames, 0);
- }
- }
- return $users;
- }
- public function fetch_uid_by_username($username, $fetch_archive = 0) {
- $uid = 0;
- if($username) {
- $uid = DB::result_first('SELECT uid FROM %t WHERE username=%s', array($this->_table, $username));
- if(isset($this->membersplit) && $fetch_archive && empty($uid)) {
- $uid = C::t($this->_table.'_archive')->fetch_uid_by_username($username, 0);
- }
- }
- return $uid;
- }
- public function fetch_all_uid_by_username($usernames, $fetch_archive = 1) {
- $uids = array();
- if($usernames) {
- foreach($this->fetch_all_by_username($usernames, $fetch_archive) as $username => $value) {
- $uids[$username] = $value['uid'];
- }
- }
- return $uids;
- }
- public function fetch_all_by_adminid($adminids, $fetch_archive = 1) {
- $users = array();
- $adminids = dintval((array)$adminids, true);
- if($adminids) {
- $users = DB::fetch_all('SELECT * FROM %t WHERE adminid IN (%n) ORDER BY adminid, uid', array($this->_table, (array)$adminids), $this->_pk);
- if(isset($this->membersplit) && $fetch_archive) {
- $users += C::t($this->_table.'_archive')->fetch_all_by_adminid($adminids, 0);
- }
- }
- return $users;
- }
- public function fetch_all_username_by_uid($uids) {
- $users = array();
- if(($uids = dintval($uids, true))) {
- foreach($this->fetch_all($uids) as $uid => $value) {
- $users[$uid] = $value['username'];
- }
- }
- return $users;
- }
- public function count_by_groupid($groupid) {
- return $groupid ? DB::result_first('SELECT COUNT(*) FROM %t WHERE '.DB::field('groupid', $groupid), array($this->_table)) : 0;
- }
- public function fetch_all_by_groupid($groupid, $start = 0, $limit = 0) {
- $users = array();
- if(($groupid = dintval($groupid, true))) {
- $users = DB::fetch_all('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('groupid', $groupid).' '.DB::limit($start, $limit), null, 'uid');
- }
- return $users;
- }
- public function fetch_all_groupid() {
- return DB::fetch_all('SELECT DISTINCT(groupid) FROM '.DB::table($this->_table), null, 'groupid');
- }
- public function fetch_all_by_allowadmincp($val, $glue = '=') {
- return DB::fetch_all('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('allowadmincp', intval($val), $glue), NULL, 'uid');
- }
- public function update_admincp_manage($uids) {
- if(($uids = dintval($uids, true))) {
- $data = DB::query('UPDATE '.DB::table($this->_table).' SET allowadmincp=allowadmincp | 1 WHERE uid IN ('.dimplode($uids).')');
- $this->reset_cache($uids);
- return $data;
- }
- return false;
- }
- public function clean_admincp_manage($uids) {
- if(($uids = dintval($uids, true))) {
- $data = DB::query('UPDATE '.DB::table($this->_table).' SET allowadmincp=allowadmincp & 0xFE WHERE uid IN ('.dimplode($uids).')');
- $this->reset_cache($uids);
- return $data;
- }
- return false;
- }
- public function fetch_all_ban_by_groupexpiry($timestamp) {
- return ($timestamp = intval($timestamp)) ? DB::fetch_all("SELECT uid, groupid, credits FROM ".DB::table($this->_table)." WHERE groupid IN ('4', '5') AND groupexpiry>'0' AND groupexpiry<'$timestamp'", array(), 'uid') : array();
- }
- public function count($fetch_archive = 1) {
- $count = DB::result_first('SELECT COUNT(*) FROM %t', array($this->_table));
- if(isset($this->membersplit) && $fetch_archive) {
- $count += C::t($this->_table.'_archive')->count(0);
- }
- $count += intval(DB::result_first('SELECT COUNT(*) FROM '.DB::table('common_connect_guest'), null, true));
- return $count;
- }
- public function fetch_by_email($email, $fetch_archive = 0) {
- $user = array();
- if($email) {
- $user = DB::fetch_first('SELECT * FROM %t WHERE email=%s', array($this->_table, $email));
- if(isset($this->membersplit) && $fetch_archive && empty($user)) {
- $user = C::t($this->_table.'_archive')->fetch_by_email($email, 0);
- }
- }
- return $user;
- }
- public function fetch_all_by_email($emails, $fetch_archive = 1) {
- $users = array();
- if(!empty($emails)) {
- $users = DB::fetch_all('SELECT * FROM %t WHERE %i', array($this->_table, DB::field('email', $emails)), 'email');
- if(isset($this->membersplit) && $fetch_archive && count($emails) !== count($users)) {
- $users += C::t($this->_table.'_archive')->fetch_all_by_email($emails, 0);
- }
- }
- return $users;
- }
- public function count_by_email($email, $fetch_archive = 0) {
- $count = 0;
- if($email) {
- $count = DB::result_first('SELECT COUNT(*) FROM %t WHERE email=%s', array($this->_table, $email));
- if(isset($this->membersplit) && $fetch_archive) {
- $count += C::t($this->_table.'_archive')->count_by_email($email, 0);
- }
- }
- return $count;
- }
- public function fetch_all_by_like_username($username, $start = 0, $limit = 0) {
- $data = array();
- if($username) {
- $data = DB::fetch_all('SELECT * FROM %t WHERE username LIKE %s'.DB::limit($start, $limit), array($this->_table, stripsearchkey($username).'%'), 'uid');
- }
- return $data;
- }
- public function count_by_like_username($username) {
- return !empty($username) ? DB::result_first('SELECT COUNT(*) FROM %t WHERE username LIKE %s', array($this->_table, stripsearchkey($username).'%')) : 0;
- }
- public function fetch_runtime() {
- return DB::result_first("SELECT (MAX(regdate)-MIN(regdate))/86400 AS runtime FROM ".DB::table($this->_table));
- }
- public function count_admins() {
- return DB::result_first("SELECT COUNT(*) FROM ".DB::table($this->_table)." WHERE adminid<>'0' AND adminid<>'-1'");
- }
- public function count_by_regdate($timestamp) {
- return DB::result_first('SELECT COUNT(*) FROM %t WHERE regdate>%d', array($this->_table, $timestamp));
- }
- public function fetch_all_stat_memberlist($username, $orderby = '', $sort = '', $start = 0, $limit = 0) {
- $orderby = in_array($orderby, array('uid','credits','regdate', 'gender','username','posts','lastvisit'), true) ? $orderby : 'uid';
- $sql = '';
- $sql = !empty($username) ? " WHERE username LIKE '".addslashes(stripsearchkey($username))."%'" : '';
- $memberlist = array();
- $query = DB::query("SELECT m.uid, m.username, mp.gender, m.email, m.regdate, ms.lastvisit, mc.posts, m.credits
- FROM ".DB::table($this->_table)." m
- LEFT JOIN ".DB::table('common_member_profile')." mp ON mp.uid=m.uid
- LEFT JOIN ".DB::table('common_member_status')." ms ON ms.uid=m.uid
- LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid
- $sql ORDER BY ".DB::order($orderby, $sort).DB::limit($start, $limit));
- while($member = DB::fetch($query)) {
- $member['usernameenc'] = rawurlencode($member['username']);
- $member['regdate'] = dgmdate($member['regdate']);
- $member['lastvisit'] = dgmdate($member['lastvisit']);
- $memberlist[$member['uid']] = $member;
- }
- return $memberlist;
- }
- public function delete_no_validate($uids) {
- if(($uids = dintval($uids, true))) {
- $delnum = $this->delete($uids);
- C::t('common_member_field_forum')->delete($uids);
- C::t('common_member_field_home')->delete($uids);
- C::t('common_member_status')->delete($uids);
- C::t('common_member_count')->delete($uids);
- C::t('common_member_profile')->delete($uids);
- C::t('common_member_validate')->delete($uids);
- return $delnum;
- }
- return false;
- }
- public function insert($uid, $username, $password, $email, $ip, $groupid, $extdata, $adminid = 0) {
- if(($uid = dintval($uid))) {
- $credits = isset($extdata['credits']) ? $extdata['credits'] : array();
- $profile = isset($extdata['profile']) ? $extdata['profile'] : array();
- $profile['uid'] = $uid;
- $base = array(
- 'uid' => $uid,
- 'username' => (string)$username,
- 'password' => (string)$password,
- 'email' => (string)$email,
- 'adminid' => intval($adminid),
- 'groupid' => intval($groupid),
- 'regdate' => TIMESTAMP,
- 'emailstatus' => intval($extdata['emailstatus']),
- 'credits' => dintval($credits[0]),
- 'timeoffset' => 9999
- );
- $status = array(
- 'uid' => $uid,
- 'regip' => (string)$ip,
- 'lastip' => (string)$ip,
- 'lastvisit' => TIMESTAMP,
- 'lastactivity' => TIMESTAMP,
- 'lastpost' => 0,
- 'lastsendmail' => 0
- );
- $count = array(
- 'uid' => $uid,
- 'extcredits1' => dintval($credits[1]),
- 'extcredits2' => dintval($credits[2]),
- 'extcredits3' => dintval($credits[3]),
- 'extcredits4' => dintval($credits[4]),
- 'extcredits5' => dintval($credits[5]),
- 'extcredits6' => dintval($credits[6]),
- 'extcredits7' => dintval($credits[7]),
- 'extcredits8' => dintval($credits[8])
- );
- $ext = array('uid' => $uid);
- parent::insert($base, false, true);
- C::t('common_member_status')->insert($status, false, true);
- C::t('common_member_count')->insert($count, false, true);
- C::t('common_member_profile')->insert($profile, false, true);
- C::t('common_member_field_forum')->insert($ext, false, true);
- C::t('common_member_field_home')->insert($ext, false, true);
- manyoulog('user', $uid, 'add');
- }
- }
- public function delete($val, $unbuffered = false, $fetch_archive = 0) {
- $ret = false;
- if(($val = dintval($val, true))) {
- $ret = parent::delete($val, $unbuffered, $fetch_archive);
- if($this->_allowmem) {
- $data = ($data = memory('get', 'deleteuids')) === false ? array() : $data;
- foreach((array)$val as $uid) {
- $data[$uid] = $uid;
- }
- memory('set', 'deleteuids', $data, 86400*2);
- }
- }
- return $ret;
- }
- public function count_zombie() {
- $dateline = TIMESTAMP - 7776000;//60*60*24*90
- return DB::result_first('SELECT count(*) FROM %t mc, %t ms WHERE mc.posts<5 AND ms.lastvisit<%d AND ms.uid=mc.uid', array('common_member_count', 'common_member_status', $dateline));
- }
- public function split($splitnum, $iscron = false) {
- loadcache('membersplitdata');
- @set_time_limit(0);
- discuz_database_safecheck::setconfigstatus(0);
- $dateline = TIMESTAMP - 7776000;//60*60*24*90
- $temptablename = DB::table('common_member_temp___');
- if(!DB::fetch_first("SHOW TABLES LIKE '$temptablename'")) {
- DB::query("CREATE TABLE $temptablename (`uid` int(10) NOT NULL DEFAULT 0,PRIMARY KEY (`uid`)) ENGINE=MYISAM;");
- }
- $splitnum = max(1, intval($splitnum));
- if(!DB::result_first('SELECT COUNT(*) FROM '.$temptablename)) {
- DB::query('INSERT INTO '.$temptablename.' (`uid`) SELECT ms.uid AS uid FROM %t mc, %t ms WHERE mc.posts<5 AND ms.lastvisit<%d AND mc.uid=ms.uid ORDER BY ms.lastvisit LIMIT %d', array('common_member_count', 'common_member_status', $dateline, $splitnum));
- }
- if(DB::result_first('SELECT COUNT(*) FROM '.$temptablename)) {
- if(!$iscron && getglobal('setting/memberspliting') === null) {
- $this->switch_keys('disable');
- }
- $uidlist = DB::fetch_all('SELECT uid FROM '.$temptablename, null, 'uid');
- $uids = dimplode(array_keys($uidlist));
- $movesql = 'REPLACE INTO %t SELECT * FROM %t WHERE uid IN ('.$uids.')';
- $deletesql = 'DELETE FROM %t WHERE uid IN ('.$uids.')';
- if(DB::query($movesql, array('common_member_archive', 'common_member'), false, true)) {
- DB::query($deletesql, array('common_member'), false, true);
- }
- if(DB::query($movesql, array('common_member_profile_archive', 'common_member_profile'), false, true)) {
- DB::query($deletesql, array('common_member_profile'), false, true);
- }
- if(DB::query($movesql, array('common_member_field_forum_archive', 'common_member_field_forum'), false, true)) {
- DB::query($deletesql, array('common_member_field_forum'), false, true);
- }
- if(DB::query($movesql, array('common_member_field_home_archive', 'common_member_field_home'), false, true)) {
- DB::query($deletesql, array('common_member_field_home'), false, true);
- }
- if(DB::query($movesql, array('common_member_status_archive', 'common_member_status'), false, true)) {
- DB::query($deletesql, array('common_member_status'), false, true);
- }
- if(DB::query($movesql, array('common_member_count_archive', 'common_member_count'), false, true)) {
- DB::query($deletesql, array('common_member_count'), false, true);
- }
- DB::query('DROP TABLE '.$temptablename);
- $membersplitdata = getglobal('cache/membersplitdata');
- $zombiecount = $membersplitdata['zombiecount'] - $splitnum;
- if($zombiecount < 0) {
- $zombiecount = 0;
- }
- savecache('membersplitdata', array('membercount' => $membersplitdata['membercount'], 'zombiecount' => $zombiecount, 'dateline' => TIMESTAMP));
- C::t('common_setting')->delete('memberspliting');
- return true;
- } else {
- DB::query('DROP TABLE '.$temptablename);
- if(!$iscron) {
- $this->switch_keys('enable');
- C::t('common_member_profile')->optimize();
- C::t('common_member_field_forum')->optimize();
- C::t('common_member_field_home')->optimize();
- }
- return false;
- }
- }
- public function switch_keys($type) {
- if($type === 'disable') {
- $type = 'DISABLE';
- C::t('common_setting')->update_batch(array('memberspliting'=>1, 'membersplit'=>1));
- } else {
- $type = 'ENABLE';
- C::t('common_setting')->delete('memberspliting');
- }
- require_once libfile('function/cache');
- updatecache('setting');
- }
- public function count_by_credits($credits) {
- return DB::result_first('SELECT COUNT(*) FROM %t WHERE credits>%d', array($this->_table, $credits));
- }
- public function fetch_all_for_spacecp_search($wherearr, $fromarr, $start = 0, $limit = 100) {
- if(!$start && !$limit) {
- $start = 100;
- }
- if(!$wherearr) {
- $wherearr[] = '1';
- }
- if(!$fromarr) {
- $fromarr[] = DB::table($this->_table);
- }
- return DB::fetch_all("SELECT s.* FROM ".implode(',', $fromarr)." WHERE ".implode(' AND ', $wherearr).DB::limit($start, $limit));
- }
- public function fetch_all_girls_for_ranklist($offset = 0, $limit = 20, $orderby = 'ORDER BY s.unitprice DESC, s.credit DESC') {
- $members = array();
- $query = DB::query("SELECT m.uid, m.username, mc.*, mp.gender
- FROM ".DB::table('common_member')." m
- LEFT JOIN ".DB::table('home_show')." s ON s.uid=m.uid
- LEFT JOIN ".DB::table('common_member_profile')." mp ON mp.uid=m.uid
- LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid
- WHERE mp.gender='2'
- ORDER BY $orderby
- LIMIT $offset, $limit");
- while($member = DB::fetch($query)) {
- $member['avatar'] = avatar($member['uid'], 'small');
- $members[] = $member;
- }
- return $members;
- }
- public function fetch_all_order_by_credit_for_ranklist($num, $orderby) {
- $data = array();
- if(!($num = intval($num))) {
- return $data;
- }
- if($orderby === 'all') {
- $sql = "SELECT m.uid,m.username,m.videophotostatus,m.groupid,m.credits,field.spacenote FROM ".DB::table('common_member')." m
- LEFT JOIN ".DB::table('common_member_field_home')." field ON field.uid=m.uid
- ORDER BY m.credits DESC LIMIT 0, $num";
- } else {
- $orderby = intval($orderby);
- $orderby = in_array($orderby, array(1, 2, 3, 4, 5, 6, 7, 8)) ? $orderby : 1;
- $sql = "SELECT m.uid,m.username,m.videophotostatus,m.groupid, mc.extcredits$orderby AS extcredits
- FROM ".DB::table('common_member')." m
- LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid WHERE mc.extcredits$orderby>0
- ORDER BY extcredits$orderby DESC LIMIT 0, $num";
- }
- $query = DB::query($sql);
- while($result = DB::fetch($query)) {
- $data[] = $result;
- }
- return $data;
- }
- public function fetch_all_order_by_friendnum_for_ranklist($num) {
- $num = intval($num);
- $num = $num ? $num : 20;
- $data = $users = $oldorder = array();
- $query = DB::query('SELECT uid, friends FROM '.DB::table('common_member_count').' WHERE friends>0 ORDER BY friends DESC LIMIT '.$num);
- while($user = DB::fetch($query)) {
- $users[$user['uid']] = $user;
- $oldorder[] = $user['uid'];
- }
- $uids = array_keys($users);
- if($uids) {
- $query = DB::query('SELECT m.uid, m.username, m.videophotostatus, m.groupid, field.spacenote
- FROM '.DB::table('common_member')." m
- LEFT JOIN ".DB::table('common_member_field_home')." field ON m.uid=field.uid
- WHERE m.uid IN (".dimplode($uids).")");
- while($value = DB::fetch($query)) {
- $users[$value['uid']] = array_merge($users[$value['uid']], $value);
- }
- foreach($oldorder as $uid) {
- $data[] = $users[$uid];
- }
- }
- return $data;
- }
- public function max_uid() {
- return DB::result_first('SELECT MAX(uid) FROM %t', array($this->_table));
- }
- public function range_by_uid($from, $limit) {
- return DB::fetch_all('SELECT * FROM %t WHERE uid >= %d ORDER BY uid LIMIT %d', array($this->_table, $from, $limit), $this->_pk);
- }
- public function update_groupid_by_groupid($source, $target) {
- return DB::query('UPDATE %t SET groupid=%d WHERE adminid <= 0 AND groupid=%d', array($this->_table, $target, $source));
- }
- }
- ?>
|