table_common_member.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521
  1. <?php
  2. /**
  3. * [Discuz!] (C)2001-2099 Comsenz Inc.
  4. * This is NOT a freeware, use is subject to license terms
  5. *
  6. * $Id: table_common_member.php 31849 2012-10-17 04:39:16Z zhangguosheng $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class table_common_member extends discuz_table_archive
  12. {
  13. public function __construct() {
  14. $this->_table = 'common_member';
  15. $this->_pk = 'uid';
  16. $this->_pre_cache_key = 'common_member_';
  17. parent::__construct();
  18. }
  19. public function update_credits($uid, $credits) {
  20. if($uid) {
  21. $data = array('credits'=>intval($credits));
  22. DB::update($this->_table, $data, array('uid' => intval($uid)), 'UNBUFFERED');
  23. $this->update_cache($uid, $data);
  24. }
  25. }
  26. public function update_by_groupid($groupid, $data) {
  27. $uids = array();
  28. $groupid = dintval($groupid, true);
  29. if($groupid && $this->_allowmem) {
  30. $uids = array_keys($this->fetch_all_by_groupid($groupid));
  31. }
  32. if($groupid && !empty($data) && is_array($data)) {
  33. DB::update($this->_table, $data, DB::field('groupid', $groupid), 'UNBUFFERED');
  34. }
  35. if($uids) {
  36. $this->update_cache($uids, $data);
  37. }
  38. }
  39. public function increase($uids, $setarr) {
  40. $uids = dintval((array)$uids, true);
  41. $sql = array();
  42. $allowkey = array('credits', 'newpm', 'newprompt');
  43. foreach($setarr as $key => $value) {
  44. if(($value = intval($value)) && in_array($key, $allowkey)) {
  45. $sql[] = "`$key`=`$key`+'$value'";
  46. }
  47. }
  48. if(!empty($sql)){
  49. DB::query("UPDATE ".DB::table($this->_table)." SET ".implode(',', $sql)." WHERE uid IN (".dimplode($uids).")", 'UNBUFFERED');
  50. $this->increase_cache($uids, $setarr);
  51. }
  52. }
  53. public function fetch_by_username($username, $fetch_archive = 0) {
  54. $user = array();
  55. if($username) {
  56. $user = DB::fetch_first('SELECT * FROM %t WHERE username=%s', array($this->_table, $username));
  57. if(isset($this->membersplit) && $fetch_archive && empty($user)) {
  58. $user = C::t($this->_table.'_archive')->fetch_by_username($username, 0);
  59. }
  60. }
  61. return $user;
  62. }
  63. public function fetch_all_by_username($usernames, $fetch_archive = 1) {
  64. $users = array();
  65. if(!empty($usernames)) {
  66. $users = DB::fetch_all('SELECT * FROM %t WHERE username IN (%n)', array($this->_table, (array)$usernames), 'username');
  67. if(isset($this->membersplit) && $fetch_archive && count($usernames) !== count($users)) {
  68. $users += C::t($this->_table.'_archive')->fetch_all_by_username($usernames, 0);
  69. }
  70. }
  71. return $users;
  72. }
  73. public function fetch_uid_by_username($username, $fetch_archive = 0) {
  74. $uid = 0;
  75. if($username) {
  76. $uid = DB::result_first('SELECT uid FROM %t WHERE username=%s', array($this->_table, $username));
  77. if(isset($this->membersplit) && $fetch_archive && empty($uid)) {
  78. $uid = C::t($this->_table.'_archive')->fetch_uid_by_username($username, 0);
  79. }
  80. }
  81. return $uid;
  82. }
  83. public function fetch_all_uid_by_username($usernames, $fetch_archive = 1) {
  84. $uids = array();
  85. if($usernames) {
  86. foreach($this->fetch_all_by_username($usernames, $fetch_archive) as $username => $value) {
  87. $uids[$username] = $value['uid'];
  88. }
  89. }
  90. return $uids;
  91. }
  92. public function fetch_all_by_adminid($adminids, $fetch_archive = 1) {
  93. $users = array();
  94. $adminids = dintval((array)$adminids, true);
  95. if($adminids) {
  96. $users = DB::fetch_all('SELECT * FROM %t WHERE adminid IN (%n) ORDER BY adminid, uid', array($this->_table, (array)$adminids), $this->_pk);
  97. if(isset($this->membersplit) && $fetch_archive) {
  98. $users += C::t($this->_table.'_archive')->fetch_all_by_adminid($adminids, 0);
  99. }
  100. }
  101. return $users;
  102. }
  103. public function fetch_all_username_by_uid($uids) {
  104. $users = array();
  105. if(($uids = dintval($uids, true))) {
  106. foreach($this->fetch_all($uids) as $uid => $value) {
  107. $users[$uid] = $value['username'];
  108. }
  109. }
  110. return $users;
  111. }
  112. public function count_by_groupid($groupid) {
  113. return $groupid ? DB::result_first('SELECT COUNT(*) FROM %t WHERE '.DB::field('groupid', $groupid), array($this->_table)) : 0;
  114. }
  115. public function fetch_all_by_groupid($groupid, $start = 0, $limit = 0) {
  116. $users = array();
  117. if(($groupid = dintval($groupid, true))) {
  118. $users = DB::fetch_all('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('groupid', $groupid).' '.DB::limit($start, $limit), null, 'uid');
  119. }
  120. return $users;
  121. }
  122. public function fetch_all_groupid() {
  123. return DB::fetch_all('SELECT DISTINCT(groupid) FROM '.DB::table($this->_table), null, 'groupid');
  124. }
  125. public function fetch_all_by_allowadmincp($val, $glue = '=') {
  126. return DB::fetch_all('SELECT * FROM '.DB::table($this->_table).' WHERE '.DB::field('allowadmincp', intval($val), $glue), NULL, 'uid');
  127. }
  128. public function update_admincp_manage($uids) {
  129. if(($uids = dintval($uids, true))) {
  130. $data = DB::query('UPDATE '.DB::table($this->_table).' SET allowadmincp=allowadmincp | 1 WHERE uid IN ('.dimplode($uids).')');
  131. $this->reset_cache($uids);
  132. return $data;
  133. }
  134. return false;
  135. }
  136. public function clean_admincp_manage($uids) {
  137. if(($uids = dintval($uids, true))) {
  138. $data = DB::query('UPDATE '.DB::table($this->_table).' SET allowadmincp=allowadmincp & 0xFE WHERE uid IN ('.dimplode($uids).')');
  139. $this->reset_cache($uids);
  140. return $data;
  141. }
  142. return false;
  143. }
  144. public function fetch_all_ban_by_groupexpiry($timestamp) {
  145. 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();
  146. }
  147. public function count($fetch_archive = 1) {
  148. $count = DB::result_first('SELECT COUNT(*) FROM %t', array($this->_table));
  149. if(isset($this->membersplit) && $fetch_archive) {
  150. $count += C::t($this->_table.'_archive')->count(0);
  151. }
  152. $count += intval(DB::result_first('SELECT COUNT(*) FROM '.DB::table('common_connect_guest'), null, true));
  153. return $count;
  154. }
  155. public function fetch_by_email($email, $fetch_archive = 0) {
  156. $user = array();
  157. if($email) {
  158. $user = DB::fetch_first('SELECT * FROM %t WHERE email=%s', array($this->_table, $email));
  159. if(isset($this->membersplit) && $fetch_archive && empty($user)) {
  160. $user = C::t($this->_table.'_archive')->fetch_by_email($email, 0);
  161. }
  162. }
  163. return $user;
  164. }
  165. public function fetch_all_by_email($emails, $fetch_archive = 1) {
  166. $users = array();
  167. if(!empty($emails)) {
  168. $users = DB::fetch_all('SELECT * FROM %t WHERE %i', array($this->_table, DB::field('email', $emails)), 'email');
  169. if(isset($this->membersplit) && $fetch_archive && count($emails) !== count($users)) {
  170. $users += C::t($this->_table.'_archive')->fetch_all_by_email($emails, 0);
  171. }
  172. }
  173. return $users;
  174. }
  175. public function count_by_email($email, $fetch_archive = 0) {
  176. $count = 0;
  177. if($email) {
  178. $count = DB::result_first('SELECT COUNT(*) FROM %t WHERE email=%s', array($this->_table, $email));
  179. if(isset($this->membersplit) && $fetch_archive) {
  180. $count += C::t($this->_table.'_archive')->count_by_email($email, 0);
  181. }
  182. }
  183. return $count;
  184. }
  185. public function fetch_all_by_like_username($username, $start = 0, $limit = 0) {
  186. $data = array();
  187. if($username) {
  188. $data = DB::fetch_all('SELECT * FROM %t WHERE username LIKE %s'.DB::limit($start, $limit), array($this->_table, stripsearchkey($username).'%'), 'uid');
  189. }
  190. return $data;
  191. }
  192. public function count_by_like_username($username) {
  193. return !empty($username) ? DB::result_first('SELECT COUNT(*) FROM %t WHERE username LIKE %s', array($this->_table, stripsearchkey($username).'%')) : 0;
  194. }
  195. public function fetch_runtime() {
  196. return DB::result_first("SELECT (MAX(regdate)-MIN(regdate))/86400 AS runtime FROM ".DB::table($this->_table));
  197. }
  198. public function count_admins() {
  199. return DB::result_first("SELECT COUNT(*) FROM ".DB::table($this->_table)." WHERE adminid<>'0' AND adminid<>'-1'");
  200. }
  201. public function count_by_regdate($timestamp) {
  202. return DB::result_first('SELECT COUNT(*) FROM %t WHERE regdate>%d', array($this->_table, $timestamp));
  203. }
  204. public function fetch_all_stat_memberlist($username, $orderby = '', $sort = '', $start = 0, $limit = 0) {
  205. $orderby = in_array($orderby, array('uid','credits','regdate', 'gender','username','posts','lastvisit'), true) ? $orderby : 'uid';
  206. $sql = '';
  207. $sql = !empty($username) ? " WHERE username LIKE '".addslashes(stripsearchkey($username))."%'" : '';
  208. $memberlist = array();
  209. $query = DB::query("SELECT m.uid, m.username, mp.gender, m.email, m.regdate, ms.lastvisit, mc.posts, m.credits
  210. FROM ".DB::table($this->_table)." m
  211. LEFT JOIN ".DB::table('common_member_profile')." mp ON mp.uid=m.uid
  212. LEFT JOIN ".DB::table('common_member_status')." ms ON ms.uid=m.uid
  213. LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid
  214. $sql ORDER BY ".DB::order($orderby, $sort).DB::limit($start, $limit));
  215. while($member = DB::fetch($query)) {
  216. $member['usernameenc'] = rawurlencode($member['username']);
  217. $member['regdate'] = dgmdate($member['regdate']);
  218. $member['lastvisit'] = dgmdate($member['lastvisit']);
  219. $memberlist[$member['uid']] = $member;
  220. }
  221. return $memberlist;
  222. }
  223. public function delete_no_validate($uids) {
  224. if(($uids = dintval($uids, true))) {
  225. $delnum = $this->delete($uids);
  226. C::t('common_member_field_forum')->delete($uids);
  227. C::t('common_member_field_home')->delete($uids);
  228. C::t('common_member_status')->delete($uids);
  229. C::t('common_member_count')->delete($uids);
  230. C::t('common_member_profile')->delete($uids);
  231. C::t('common_member_validate')->delete($uids);
  232. return $delnum;
  233. }
  234. return false;
  235. }
  236. public function insert($uid, $username, $password, $email, $ip, $groupid, $extdata, $adminid = 0) {
  237. if(($uid = dintval($uid))) {
  238. $credits = isset($extdata['credits']) ? $extdata['credits'] : array();
  239. $profile = isset($extdata['profile']) ? $extdata['profile'] : array();
  240. $profile['uid'] = $uid;
  241. $base = array(
  242. 'uid' => $uid,
  243. 'username' => (string)$username,
  244. 'password' => (string)$password,
  245. 'email' => (string)$email,
  246. 'adminid' => intval($adminid),
  247. 'groupid' => intval($groupid),
  248. 'regdate' => TIMESTAMP,
  249. 'emailstatus' => intval($extdata['emailstatus']),
  250. 'credits' => dintval($credits[0]),
  251. 'timeoffset' => 9999
  252. );
  253. $status = array(
  254. 'uid' => $uid,
  255. 'regip' => (string)$ip,
  256. 'lastip' => (string)$ip,
  257. 'lastvisit' => TIMESTAMP,
  258. 'lastactivity' => TIMESTAMP,
  259. 'lastpost' => 0,
  260. 'lastsendmail' => 0
  261. );
  262. $count = array(
  263. 'uid' => $uid,
  264. 'extcredits1' => dintval($credits[1]),
  265. 'extcredits2' => dintval($credits[2]),
  266. 'extcredits3' => dintval($credits[3]),
  267. 'extcredits4' => dintval($credits[4]),
  268. 'extcredits5' => dintval($credits[5]),
  269. 'extcredits6' => dintval($credits[6]),
  270. 'extcredits7' => dintval($credits[7]),
  271. 'extcredits8' => dintval($credits[8])
  272. );
  273. $ext = array('uid' => $uid);
  274. parent::insert($base, false, true);
  275. C::t('common_member_status')->insert($status, false, true);
  276. C::t('common_member_count')->insert($count, false, true);
  277. C::t('common_member_profile')->insert($profile, false, true);
  278. C::t('common_member_field_forum')->insert($ext, false, true);
  279. C::t('common_member_field_home')->insert($ext, false, true);
  280. manyoulog('user', $uid, 'add');
  281. }
  282. }
  283. public function delete($val, $unbuffered = false, $fetch_archive = 0) {
  284. $ret = false;
  285. if(($val = dintval($val, true))) {
  286. $ret = parent::delete($val, $unbuffered, $fetch_archive);
  287. if($this->_allowmem) {
  288. $data = ($data = memory('get', 'deleteuids')) === false ? array() : $data;
  289. foreach((array)$val as $uid) {
  290. $data[$uid] = $uid;
  291. }
  292. memory('set', 'deleteuids', $data, 86400*2);
  293. }
  294. }
  295. return $ret;
  296. }
  297. public function count_zombie() {
  298. $dateline = TIMESTAMP - 7776000;//60*60*24*90
  299. 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));
  300. }
  301. public function split($splitnum, $iscron = false) {
  302. loadcache('membersplitdata');
  303. @set_time_limit(0);
  304. discuz_database_safecheck::setconfigstatus(0);
  305. $dateline = TIMESTAMP - 7776000;//60*60*24*90
  306. $temptablename = DB::table('common_member_temp___');
  307. if(!DB::fetch_first("SHOW TABLES LIKE '$temptablename'")) {
  308. DB::query("CREATE TABLE $temptablename (`uid` int(10) NOT NULL DEFAULT 0,PRIMARY KEY (`uid`)) ENGINE=MYISAM;");
  309. }
  310. $splitnum = max(1, intval($splitnum));
  311. if(!DB::result_first('SELECT COUNT(*) FROM '.$temptablename)) {
  312. 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));
  313. }
  314. if(DB::result_first('SELECT COUNT(*) FROM '.$temptablename)) {
  315. if(!$iscron && getglobal('setting/memberspliting') === null) {
  316. $this->switch_keys('disable');
  317. }
  318. $uidlist = DB::fetch_all('SELECT uid FROM '.$temptablename, null, 'uid');
  319. $uids = dimplode(array_keys($uidlist));
  320. $movesql = 'REPLACE INTO %t SELECT * FROM %t WHERE uid IN ('.$uids.')';
  321. $deletesql = 'DELETE FROM %t WHERE uid IN ('.$uids.')';
  322. if(DB::query($movesql, array('common_member_archive', 'common_member'), false, true)) {
  323. DB::query($deletesql, array('common_member'), false, true);
  324. }
  325. if(DB::query($movesql, array('common_member_profile_archive', 'common_member_profile'), false, true)) {
  326. DB::query($deletesql, array('common_member_profile'), false, true);
  327. }
  328. if(DB::query($movesql, array('common_member_field_forum_archive', 'common_member_field_forum'), false, true)) {
  329. DB::query($deletesql, array('common_member_field_forum'), false, true);
  330. }
  331. if(DB::query($movesql, array('common_member_field_home_archive', 'common_member_field_home'), false, true)) {
  332. DB::query($deletesql, array('common_member_field_home'), false, true);
  333. }
  334. if(DB::query($movesql, array('common_member_status_archive', 'common_member_status'), false, true)) {
  335. DB::query($deletesql, array('common_member_status'), false, true);
  336. }
  337. if(DB::query($movesql, array('common_member_count_archive', 'common_member_count'), false, true)) {
  338. DB::query($deletesql, array('common_member_count'), false, true);
  339. }
  340. DB::query('DROP TABLE '.$temptablename);
  341. $membersplitdata = getglobal('cache/membersplitdata');
  342. $zombiecount = $membersplitdata['zombiecount'] - $splitnum;
  343. if($zombiecount < 0) {
  344. $zombiecount = 0;
  345. }
  346. savecache('membersplitdata', array('membercount' => $membersplitdata['membercount'], 'zombiecount' => $zombiecount, 'dateline' => TIMESTAMP));
  347. C::t('common_setting')->delete('memberspliting');
  348. return true;
  349. } else {
  350. DB::query('DROP TABLE '.$temptablename);
  351. if(!$iscron) {
  352. $this->switch_keys('enable');
  353. C::t('common_member_profile')->optimize();
  354. C::t('common_member_field_forum')->optimize();
  355. C::t('common_member_field_home')->optimize();
  356. }
  357. return false;
  358. }
  359. }
  360. public function switch_keys($type) {
  361. if($type === 'disable') {
  362. $type = 'DISABLE';
  363. C::t('common_setting')->update_batch(array('memberspliting'=>1, 'membersplit'=>1));
  364. } else {
  365. $type = 'ENABLE';
  366. C::t('common_setting')->delete('memberspliting');
  367. }
  368. require_once libfile('function/cache');
  369. updatecache('setting');
  370. }
  371. public function count_by_credits($credits) {
  372. return DB::result_first('SELECT COUNT(*) FROM %t WHERE credits>%d', array($this->_table, $credits));
  373. }
  374. public function fetch_all_for_spacecp_search($wherearr, $fromarr, $start = 0, $limit = 100) {
  375. if(!$start && !$limit) {
  376. $start = 100;
  377. }
  378. if(!$wherearr) {
  379. $wherearr[] = '1';
  380. }
  381. if(!$fromarr) {
  382. $fromarr[] = DB::table($this->_table);
  383. }
  384. return DB::fetch_all("SELECT s.* FROM ".implode(',', $fromarr)." WHERE ".implode(' AND ', $wherearr).DB::limit($start, $limit));
  385. }
  386. public function fetch_all_girls_for_ranklist($offset = 0, $limit = 20, $orderby = 'ORDER BY s.unitprice DESC, s.credit DESC') {
  387. $members = array();
  388. $query = DB::query("SELECT m.uid, m.username, mc.*, mp.gender
  389. FROM ".DB::table('common_member')." m
  390. LEFT JOIN ".DB::table('home_show')." s ON s.uid=m.uid
  391. LEFT JOIN ".DB::table('common_member_profile')." mp ON mp.uid=m.uid
  392. LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid
  393. WHERE mp.gender='2'
  394. ORDER BY $orderby
  395. LIMIT $offset, $limit");
  396. while($member = DB::fetch($query)) {
  397. $member['avatar'] = avatar($member['uid'], 'small');
  398. $members[] = $member;
  399. }
  400. return $members;
  401. }
  402. public function fetch_all_order_by_credit_for_ranklist($num, $orderby) {
  403. $data = array();
  404. if(!($num = intval($num))) {
  405. return $data;
  406. }
  407. if($orderby === 'all') {
  408. $sql = "SELECT m.uid,m.username,m.videophotostatus,m.groupid,m.credits,field.spacenote FROM ".DB::table('common_member')." m
  409. LEFT JOIN ".DB::table('common_member_field_home')." field ON field.uid=m.uid
  410. ORDER BY m.credits DESC LIMIT 0, $num";
  411. } else {
  412. $orderby = intval($orderby);
  413. $orderby = in_array($orderby, array(1, 2, 3, 4, 5, 6, 7, 8)) ? $orderby : 1;
  414. $sql = "SELECT m.uid,m.username,m.videophotostatus,m.groupid, mc.extcredits$orderby AS extcredits
  415. FROM ".DB::table('common_member')." m
  416. LEFT JOIN ".DB::table('common_member_count')." mc ON mc.uid=m.uid WHERE mc.extcredits$orderby>0
  417. ORDER BY extcredits$orderby DESC LIMIT 0, $num";
  418. }
  419. $query = DB::query($sql);
  420. while($result = DB::fetch($query)) {
  421. $data[] = $result;
  422. }
  423. return $data;
  424. }
  425. public function fetch_all_order_by_friendnum_for_ranklist($num) {
  426. $num = intval($num);
  427. $num = $num ? $num : 20;
  428. $data = $users = $oldorder = array();
  429. $query = DB::query('SELECT uid, friends FROM '.DB::table('common_member_count').' WHERE friends>0 ORDER BY friends DESC LIMIT '.$num);
  430. while($user = DB::fetch($query)) {
  431. $users[$user['uid']] = $user;
  432. $oldorder[] = $user['uid'];
  433. }
  434. $uids = array_keys($users);
  435. if($uids) {
  436. $query = DB::query('SELECT m.uid, m.username, m.videophotostatus, m.groupid, field.spacenote
  437. FROM '.DB::table('common_member')." m
  438. LEFT JOIN ".DB::table('common_member_field_home')." field ON m.uid=field.uid
  439. WHERE m.uid IN (".dimplode($uids).")");
  440. while($value = DB::fetch($query)) {
  441. $users[$value['uid']] = array_merge($users[$value['uid']], $value);
  442. }
  443. foreach($oldorder as $uid) {
  444. $data[] = $users[$uid];
  445. }
  446. }
  447. return $data;
  448. }
  449. public function max_uid() {
  450. return DB::result_first('SELECT MAX(uid) FROM %t', array($this->_table));
  451. }
  452. public function range_by_uid($from, $limit) {
  453. return DB::fetch_all('SELECT * FROM %t WHERE uid >= %d ORDER BY uid LIMIT %d', array($this->_table, $from, $limit), $this->_pk);
  454. }
  455. public function update_groupid_by_groupid($source, $target) {
  456. return DB::query('UPDATE %t SET groupid=%d WHERE adminid <= 0 AND groupid=%d', array($this->_table, $target, $source));
  457. }
  458. }
  459. ?>