table_forum_forum.php 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373
  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_forum_forum.php 36284 2016-12-12 00:47:50Z nemohou $
  7. */
  8. if(!defined('IN_DISCUZ')) {
  9. exit('Access Denied');
  10. }
  11. class table_forum_forum extends discuz_table
  12. {
  13. public function __construct() {
  14. $this->_table = 'forum_forum';
  15. $this->_pk = 'fid';
  16. $this->_pre_cache_key = 'forum_forum_';
  17. parent::__construct();
  18. }
  19. public function fetch_all_by_status($status, $orderby = 1) {
  20. $status = $status ? 1 : 0;
  21. $ordersql = $orderby ? 'ORDER BY t.type, t.displayorder' : '';
  22. return DB::fetch_all('SELECT * FROM '.DB::table($this->_table)." t WHERE t.status='$status' $ordersql");
  23. }
  24. public function fetch_all_fids($allstatus = 0, $type = '', $fup = '', $start = 0, $limit = 0, $count = 0) {
  25. $typesql = empty($type) ? "type<>'group'" : DB::field('type', $type);
  26. $statussql = empty($allstatus) ? ' AND status<>3' : '';
  27. $fupsql = empty($fup) ? '' : ' AND '.DB::field('fup', $fup);
  28. $limitsql = empty($limit) ? '' : ' LIMIT '.$start.', '.$limit;
  29. if($count) {
  30. return DB::result_first("SELECT count(*) FROM ".DB::table($this->_table)." WHERE $typesql $statussql $fupsql");
  31. }
  32. return DB::fetch_all("SELECT * FROM ".DB::table($this->_table)." WHERE $typesql $statussql $fupsql $limitsql");
  33. }
  34. public function fetch_info_by_fid($fid) {
  35. if(($data = $this->fetch_cache($fid)) === false) {
  36. $data = DB::fetch_first("SELECT ff.*, f.* FROM %t f LEFT JOIN %t ff ON ff.fid=f.fid WHERE f.fid=%d", array($this->_table, 'forum_forumfield', $fid));
  37. $this->store_cache($fid, $data);
  38. }
  39. return $data;
  40. }
  41. public function fetch_all_name_by_fid($fids) {
  42. if(empty($fids)) {
  43. return array();
  44. }
  45. return DB::fetch_all('SELECT fid, name FROM '.DB::table($this->_table)." WHERE ".DB::field('fid', $fids), array(), 'fid');
  46. }
  47. public function fetch_all_info_by_fids($fids, $status = 0, $limit = 0, $fup = 0, $displayorder = 0, $onlyforum = 0, $noredirect = 0, $type = '', $start = 0) {
  48. $sql = $fids ? "f.".DB::field('fid', $fids) : '';
  49. $sql .= empty($fup) ? '' : ($sql ? ' AND ' : '').'f.'.DB::field('fup', $fup);
  50. if(!strcmp($status, 'available')) {
  51. $sql .= ($sql ? ' AND ' : '')." f.status>'0'";
  52. } elseif($status) {
  53. $sql .= $status ? ($sql ? ' AND ' : '')." f.".DB::field('status', $status) : '';
  54. }
  55. $sql .= $onlyforum ? ($sql ? ' AND ' : '').'f.type<>\'group\'' : '';
  56. $sql .= $type ? ($sql ? ' AND ' : '').'f.'.DB::field('type', $type) : '';
  57. $sql .= $noredirect ? ($sql ? ' AND ' : '').'ff.redirect=\'\'' : '';
  58. $ordersql = $displayorder ? ' ORDER BY f.displayorder' : '';
  59. $limitsql = $limit ? DB::limit($start, $limit) : '';
  60. if(!$sql) {
  61. return array();
  62. }
  63. return DB::fetch_all("SELECT ff.*, f.* FROM %t f LEFT JOIN %t ff USING (fid) WHERE $sql $ordersql $limitsql", array($this->_table, 'forum_forumfield'), 'fid');
  64. }
  65. public function fetch_all_default_recommend($num = 10) {
  66. return DB::fetch_all("SELECT f.fid, f.name, ff.description, ff.icon FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff USING(fid) WHERE f.status='3' AND f.type='sub' ORDER BY f.commoncredits desc ".DB::limit($num));
  67. }
  68. public function fetch_all_group_type($alltypeorder = 0) {
  69. $ordersql = empty($alltypeorder) ? 'f.type, ' : "f.type<>'group', ";
  70. return DB::fetch_all("SELECT f.fid, f.type, f.status, f.name, f.fup, f.displayorder, f.forumcolumns, f.inheritedmod, ff.moderators, ff.password, ff.redirect, ff.groupnum FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff USING(fid) WHERE f.status='3' AND f.type IN('group', 'forum') ORDER BY $ordersql f.displayorder");
  71. }
  72. public function fetch_all_recommend_by_fid($fid) {
  73. return DB::fetch_all("SELECT ff.*, f.* FROM %t f LEFT JOIN %t ff ON ff.fid=f.fid WHERE f.recommend=%d", array($this->_table, 'forum_forumfield', $fid));
  74. }
  75. public function fetch_all_info_by_ignore_fid($fid) {
  76. if(!intval($fid)) {
  77. return array();
  78. }
  79. return DB::fetch_all("SELECT fid, type, name, fup FROM ".DB::table($this->_table)." WHERE ".DB::field('fid', $fid, '<>')." AND type<>'sub' AND status<>'3' ORDER BY displayorder");
  80. }
  81. public function fetch_all_forum($status = 0) {
  82. $statusql = intval($status) ? 'f.'.DB::field('status', $status) : 'f.status<>\'3\'';
  83. return DB::fetch_all("SELECT ff.*, f.*, a.uid FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff ON ff.fid=f.fid LEFT JOIN ".DB::table('forum_access')." a ON a.fid=f.fid AND a.allowview>'0' WHERE $statusql ORDER BY f.type, f.displayorder");
  84. }
  85. public function fetch_all_subforum_by_fup($fups) {
  86. return DB::fetch_all("SELECT fid, fup, name, threads, posts, todayposts, domain FROM %t WHERE status='1' AND fup IN (%n) AND type='sub' ORDER BY displayorder", array($this->_table, $fups));
  87. }
  88. public function fetch_all_forum_ignore_access() {
  89. return DB::fetch_all("SELECT ff.*, f.* FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff ON ff.fid=f.fid WHERE status <3 ORDER BY f.fid");
  90. }
  91. public function fetch_all_forum_for_sub_order() {
  92. return DB::fetch_all("SELECT ff.*, f.fid, f.type, f.status, f.name, f.fup, f.displayorder, f.inheritedmod FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff USING(fid) WHERE f.status<>'3' ORDER BY f.type<>'group', f.displayorder");
  93. }
  94. public function fetch_all_valid_forum() {
  95. return DB::fetch_all("SELECT * FROM ".DB::table($this->_table)." WHERE status='1' AND type IN ('forum', 'sub') ORDER BY type");
  96. }
  97. public function fetch_all_valid_fieldinfo() {
  98. return DB::fetch_all("SELECT ff.* FROM ".DB::table($this->_table)." f INNER JOIN ".DB::table('forum_forumfield')." ff USING(fid) WHERE f.status='1'");
  99. }
  100. public function fetch_threadcacheon_num() {
  101. return DB::result_first("SELECT COUNT(*) FROM ".DB::table($this->_table)." WHERE status='1' AND threadcaches>0");
  102. }
  103. public function fetch_all_by_recyclebin($recyclebin = 0) {
  104. return DB::fetch_all('SELECT fid, name FROM %t WHERE status<3 AND type IN (\'forum\', \'sub\') AND recyclebin=%d', array($this->_table, $recyclebin));
  105. }
  106. public function update($val, $data, $unbuffered = false, $low_priority = false) {
  107. $this->clear_cache($val);
  108. return parent::update($val, $data, $unbuffered, $low_priority);
  109. }
  110. public function update_threadcaches($threadcache, $fids) {
  111. if(empty($fids)) {
  112. return false;
  113. }
  114. $sqladd = in_array('all', $fids) ? '' : ' WHERE '.DB::field('fid', $fids);
  115. DB::query("UPDATE ".DB::table($this->_table)." SET threadcaches='".intval($threadcache)."'$sqladd");
  116. }
  117. public function update_styleid($ids) {
  118. DB::query("UPDATE ".DB::table($this->_table)." SET styleid='0' WHERE styleid IN(%n)",array($ids));
  119. }
  120. public function fetch_forum_num($type = '', $fup = '') {
  121. $fupsql = $fup ? DB::field('fup', $fup).' AND ' : '';
  122. $addwhere = $type == 'group' ? "`status`='3'" : "`status`<>3";
  123. return DB::result_first("SELECT COUNT(*) FROM ".DB::table($this->_table)." WHERE $fupsql $addwhere");
  124. }
  125. public function check_forum_exists($fids, $issub = 1) {
  126. if(empty($fids)) {
  127. return false;
  128. }
  129. $typesql = $issub ? " AND type<>'group'" : '';
  130. return DB::result_first("SELECT COUNT(*) FROM ".DB::table($this->_table)." WHERE %i".$typesql, array(DB::field('fid', $fids)));
  131. }
  132. public function fetch_sum_todaypost() {
  133. return DB::result_first("SELECT sum(todayposts) FROM ".DB::table($this->_table));
  134. }
  135. public function fetch_group_counter() {
  136. return DB::fetch_first("SELECT SUM(todayposts) AS todayposts, COUNT(fid) AS groupnum FROM ".DB::table($this->_table)." WHERE status='3' AND type='sub'");
  137. }
  138. public function fetch_all_sub_group_by_fup($fups, $limit = 20) {
  139. return DB::fetch_all("SELECT fid, fup, name FROM %t WHERE fup IN(%n) AND type='sub' AND level>'-1' ORDER BY commoncredits DESC LIMIT %d", array($this->_table, $fups, $limit), $this->_pk);
  140. }
  141. public function fetch_all_for_threadsorts() {
  142. return DB::fetch_all("SELECT f.fid, f.name, ff.threadsorts FROM ".DB::table($this->_table)." f , ".DB::table('forum_forumfield')." ff WHERE ff.threadsorts<>'' AND f.fid=ff.fid");
  143. }
  144. public function fetch_all_for_search($conditions, $start = 0, $limit = 20) {
  145. if(empty($conditions)) {
  146. return array();
  147. }
  148. if($start == -1) {
  149. return DB::result_first("SELECT count(*) FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff ON f.fid=ff.fid
  150. WHERE status='3' AND type='sub' AND %i", array($conditions));
  151. }
  152. return DB::fetch_all("SELECT f.fid, f.fup, f.type, f.name, f.posts, f.threads, ff.membernum, ff.lastupdate, ff.dateline, ff.foundername, ff.founderuid FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff ON f.fid=ff.fid
  153. WHERE status='3' AND type='sub' AND %i ".DB::limit($start, $limit), array($conditions));
  154. }
  155. public function clear_todayposts() {
  156. DB::query("UPDATE ".DB::table($this->_table)." SET todayposts='0'");
  157. }
  158. public function clear_forum_counter_for_group() {
  159. DB::query("UPDATE ".DB::table($this->_table)." SET threads='0', posts='0' WHERE type='group'");
  160. }
  161. public function update_forum_counter($fid, $threads = 0, $posts = 0, $todayposts = 0, $modwork = 0, $favtimes = 0) {
  162. if(!dintval($fid)) {
  163. return false;
  164. }
  165. $addsql = array();
  166. if($threads) {
  167. $addsql[] = "threads=threads+'".intval($threads)."'";
  168. }
  169. if($posts) {
  170. $addsql[] = "posts=posts+'".intval($posts)."'";
  171. }
  172. if($todayposts) {
  173. $addsql[] = "todayposts=todayposts+'".intval($todayposts)."'";
  174. }
  175. if($modwork) {
  176. $addsql[] = "modworks='1'";
  177. }
  178. if($favtimes) {
  179. $addsql[] = "favtimes=favtimes+'".intval($favtimes)."'";
  180. }
  181. if($addsql) {
  182. DB::query("UPDATE ".DB::table($this->_table)." SET ".implode(', ', $addsql)." WHERE ".DB::field('fid', $fid), 'UNBUFFERED');
  183. }
  184. }
  185. public function update_commoncredits($fid) {
  186. if(!intval($fid)) {
  187. return false;
  188. }
  189. DB::query("UPDATE ".DB::table($this->_table)." SET commoncredits=commoncredits+1 WHERE ".DB::field('fid', $fid));
  190. }
  191. public function update_oldrank_and_yesterdayposts() {
  192. DB::query("UPDATE ".DB::table($this->_table).' SET oldrank=rank,yesterdayposts=todayposts');
  193. }
  194. public function update_group_level($levelid, $fid) {
  195. if(!intval($levelid) || !intval($fid)) {
  196. return false;
  197. }
  198. DB::query("UPDATE ".DB::table($this->_table)." SET level=%d WHERE fid=%d", array($levelid, $fid));
  199. }
  200. public function fetch_all_fid_for_group($start, $limit, $issub = 0, $conditions = '') {
  201. if(!empty($conditions) && !is_string($conditions)) {
  202. return array();
  203. }
  204. $typesql = $issub ? 'type=\'sub\'' : 'type<>\'sub\'';
  205. return DB::fetch_all("SELECT fid FROM ".DB::table($this->_table)." WHERE status='3' AND $typesql %i ".DB::limit($start, $limit), array($conditions));
  206. }
  207. public function fetch_groupnum_by_fup($fup) {
  208. if(!intval($fup)) {
  209. return false;
  210. }
  211. return DB::result_first("SELECT COUNT(*) as num FROM ".DB::table($this->_table)." WHERE fup=%d AND type='sub' GROUP BY fup", array($fup));
  212. }
  213. public function fetch_all_group_for_ranking() {
  214. return DB::fetch_all("SELECT fid FROM ".DB::table($this->_table)." WHERE type='sub' AND status='3' ORDER BY commoncredits DESC LIMIT 0, 1000");
  215. }
  216. public function fetch_all_for_ranklist($status, $type, $orderfield, $start = 0, $limit = 0, $ignorefids = array()) {
  217. if(empty($orderfield)) {
  218. return array();
  219. }
  220. $typesql = $type ? ' AND f.'.DB::field('type', $type) : ' AND f.type<>\'group\'';
  221. $ignoresql = $ignorefids ? ' AND f.fid NOT IN('.dimplode($ignorefids).')' : '';
  222. if($orderfield == 'membernum') {
  223. $fields = ', ff.membernum';
  224. $jointable = ' LEFT JOIN '.DB::table('forum_forumfield').' ff ON ff.fid=f.fid';
  225. $orderfield = 'ff.'.$orderfield;
  226. }
  227. return DB::fetch_all("SELECT f.* $fields FROM %t f $jointable WHERE f.status=%d $typesql $ignoresql ORDER BY %i DESC ".DB::limit($start, $limit), array($this->_table, $status, $orderfield));
  228. }
  229. public function fetch_fid_by_name($name) {
  230. return DB::result_first("SELECT fid FROM %t WHERE name=%s", array($this->_table, $name));
  231. }
  232. public function insert_group($fup, $type, $name, $status, $level) {
  233. DB::query("INSERT INTO %t (fup, type, name, status, level) VALUES (%d, %s, %s, %d, %d)", array($this->_table, $fup, $type, $name, $status, $level));
  234. return DB::insert_id();
  235. }
  236. public function fetch_all_by_fid($fids) {
  237. return DB::fetch_all("SELECT * FROM %t WHERE fid IN(%n)", array($this->_table, (array)$fids), $this->_pk);
  238. }
  239. public function delete_by_fid($fids) {
  240. if(empty($fids)) {
  241. return false;
  242. }
  243. DB::query("DELETE FROM ".DB::table($this->_table)." WHERE %i", array(DB::field('fid', $fids)));
  244. DB::query("DELETE FROM ".DB::table('forum_forumfield')." WHERE %i", array(DB::field('fid', $fids)));
  245. }
  246. public function update_fup_by_fup($sourcefup, $targetfup) {
  247. DB::query("UPDATE ".DB::table($this->_table)." SET fup=%d WHERE fup=%s", array($targetfup, $sourcefup));
  248. }
  249. public function validate_level_for_group($fids) {
  250. if(empty($fids)) {
  251. return false;
  252. }
  253. DB::query("UPDATE ".DB::table($this->_table)." SET level='0' WHERE %i", array(DB::field('fid', $fids)));
  254. }
  255. public function validate_level_num() {
  256. return DB::result_first("SELECT count(*) FROM ".DB::table($this->_table)." WHERE status='3' AND level='-1'");
  257. }
  258. public function fetch_all_validate($start, $limit) {
  259. return DB::fetch_all("SELECT f.*, ff.dateline, ff.founderuid, ff.foundername, ff.description FROM ".DB::table($this->_table)." f LEFT JOIN ".DB::table('forum_forumfield')." ff ON ff.fid=f.fid WHERE status='3' AND level='-1' ORDER BY f.fid DESC LIMIT ".intval($start).', '.intval($limit));
  260. }
  261. public function update_archive($fids) {
  262. return DB::update('forum_forum', array('archive' => '0'), "fid NOT IN (".dimplode($fids).")");
  263. }
  264. public function fetch_all_for_grouplist($orderby = 'displayorder', $fieldarray = array(), $num = 1, $fids = array(), $sort = 0, $getcount = 0) {
  265. if($fieldarray && is_array($fieldarray)) {
  266. $fieldadd = '';
  267. foreach($fieldarray as $field) {
  268. $fieldadd .= $field.', ';
  269. }
  270. } else {
  271. $fieldadd = 'ff.*, ';
  272. }
  273. $start = 0;
  274. if(is_array($num)) {
  275. list($start, $snum) = $num;
  276. } else {
  277. $snum = $num;
  278. }
  279. $orderbyarray = array('displayorder' => 'f.displayorder DESC', 'dateline' => 'ff.dateline DESC', 'lastupdate' => 'ff.lastupdate DESC', 'membernum' => 'ff.membernum DESC', 'thread' => 'f.threads DESC', 'activity' => 'f.commoncredits DESC');
  280. $useindex = $orderby == 'displayorder' ? 'USE INDEX(fup_type)' : '';
  281. $orderby = !empty($orderby) && $orderbyarray[$orderby] ? "ORDER BY ".$orderbyarray[$orderby] : '';
  282. $limitsql = $num ? "LIMIT $start, $snum " : '';
  283. $field = $sort ? 'fup' : 'fid';
  284. $fids = $fids && is_array($fids) ? 'f.'.$field.' IN ('.dimplode($fids).')' : '';
  285. if(empty($fids)) {
  286. $levelsql = " AND f.level>'-1'";
  287. }
  288. $fieldsql = $fieldadd.' f.fid, f.name, f.threads, f.posts, f.todayposts, f.level as flevel ';
  289. if($getcount) {
  290. return DB::result_first("SELECT count(*) FROM ".DB::table($this->_table)." f $useindex WHERE".($fids ? " $fids AND " : '')." f.type='sub' AND f.status=3 $levelsql");
  291. }
  292. return DB::fetch_all("SELECT $fieldsql FROM ".DB::table($this->_table)." f $useindex LEFT JOIN ".DB::table("forum_forumfield")." ff ON ff.fid=f.fid WHERE".($fids ? " $fids AND " : '')." f.type='sub' AND f.status=3 $levelsql $orderby $limitsql");
  293. }
  294. public function fetch_all_for_grouplist_by_province($province = null, $orderby = 'displayorder', $fieldarray = array(), $num = 1, $fids = array(), $sort = 0, $getcount = 0) {
  295. if($fieldarray && is_array($fieldarray)) {
  296. $fieldadd = '';
  297. foreach($fieldarray as $field) {
  298. $fieldadd .= $field.', ';
  299. }
  300. } else {
  301. $fieldadd = 'ff.*, ';
  302. }
  303. $start = 0;
  304. if(is_array($num)) {
  305. list($start, $snum) = $num;
  306. } else {
  307. $snum = $num;
  308. }
  309. $orderbyarray = array('displayorder' => 'f.displayorder DESC', 'dateline' => 'ff.dateline DESC', 'lastupdate' => 'ff.lastupdate DESC', 'membernum' => 'ff.membernum DESC', 'thread' => 'f.threads DESC', 'activity' => 'f.commoncredits DESC');
  310. $useindex = $orderby == 'displayorder' ? 'USE INDEX(fup_type)' : '';
  311. $orderby = !empty($orderby) && $orderbyarray[$orderby] ? "ORDER BY ".$orderbyarray[$orderby] : '';
  312. $limitsql = $num ? "LIMIT $start, $snum " : '';
  313. $field = $sort ? 'fup' : 'fid';
  314. $fids = $fids && is_array($fids) ? 'f.'.$field.' IN ('.dimplode($fids).')' : '';
  315. if(empty($fids)) {
  316. $levelsql = " AND f.level>'-1'";
  317. }
  318. $fieldsql = $fieldadd.' f.fid, f.name, f.threads, f.posts, f.todayposts, f.level as flevel ';
  319. if($getcount) {
  320. return DB::result_first("SELECT count(*) FROM ".DB::table($this->_table)." f $useindex WHERE".($fids ? " $fids AND " : '')." f.type='sub' AND f.status=3 $levelsql");
  321. }
  322. if($province == null) {
  323. $province_sql = '';
  324. } else {
  325. $province_sql = " AND ff.province='$province'";
  326. }
  327. return DB::fetch_all("SELECT $fieldsql FROM ".DB::table($this->_table)." f $useindex LEFT JOIN ".DB::table("forum_forumfield")." ff ON ff.fid=f.fid WHERE".($fids ? " $fids AND " : '')." f.type='sub' $province_sql AND f.status=3 $levelsql $orderby $limitsql");
  328. }
  329. function fetch_table_struct($tablename, $result = 'FIELD') {
  330. if(empty($tablename)) {
  331. return array();
  332. }
  333. $datas = array();
  334. $query = DB::query("DESCRIBE ".DB::table($tablename));
  335. while($data = DB::fetch($query)) {
  336. $datas[$data['Field']] = $result == 'FIELD' ? $data['Field'] : $data;
  337. }
  338. return $datas;
  339. }
  340. function get_forum_by_fid($fid, $field = '', $table = 'forum') {
  341. static $forumlist = array('forum' => array(), 'forumfield' => array());
  342. $table = $table != 'forum' ? 'forumfield' : 'forum';
  343. $return = array();
  344. if(!array_key_exists($fid, $forumlist[$table])) {
  345. $forumlist[$table][$fid] = DB::fetch_first("SELECT * FROM ".DB::table('forum_'.$table)." WHERE fid=%d", array($fid));
  346. if(!is_array($forumlist[$table][$fid])) {
  347. $forumlist[$table][$fid] = array();
  348. }
  349. }
  350. if(!empty($field)) {
  351. $return = isset($forumlist[$table][$fid][$field]) ? $forumlist[$table][$fid][$field] : null;
  352. } else {
  353. $return = $forumlist[$table][$fid];
  354. }
  355. return $return;
  356. }
  357. }
  358. ?>