diff options
author | Meik Sievertsen <acydburn@phpbb.com> | 2006-06-06 20:53:46 +0000 |
---|---|---|
committer | Meik Sievertsen <acydburn@phpbb.com> | 2006-06-06 20:53:46 +0000 |
commit | dd9ad539fdab80badedf801a816b8a0beafbbf5c (patch) | |
tree | db8ae8a184b060d5576604cc0dfa723773daedb8 /phpBB/includes/functions_admin.php | |
parent | 2c8afb820e3842bed2ab6cec4053e71b5c566985 (diff) | |
download | forums-dd9ad539fdab80badedf801a816b8a0beafbbf5c.tar forums-dd9ad539fdab80badedf801a816b8a0beafbbf5c.tar.gz forums-dd9ad539fdab80badedf801a816b8a0beafbbf5c.tar.bz2 forums-dd9ad539fdab80badedf801a816b8a0beafbbf5c.tar.xz forums-dd9ad539fdab80badedf801a816b8a0beafbbf5c.zip |
ok, this one is rather large... the most important change:
re-introduce append_sid: old style continues to work, not a performance hog as it was in 2.0.x -> structure is different
apart from this, code cleanage, bug fixing, etc.
git-svn-id: file:///svn/phpbb/trunk@6015 89ea8834-ac86-4346-8a33-228a782c2dd0
Diffstat (limited to 'phpBB/includes/functions_admin.php')
-rw-r--r-- | phpBB/includes/functions_admin.php | 323 |
1 files changed, 194 insertions, 129 deletions
diff --git a/phpBB/includes/functions_admin.php b/phpBB/includes/functions_admin.php index ada8809b74..91cd9cd05c 100644 --- a/phpBB/includes/functions_admin.php +++ b/phpBB/includes/functions_admin.php @@ -89,7 +89,6 @@ function recalc_btree($sql_id, $sql_table, $module_class = '') FROM $sql_table $sql_where"; $result = $db->sql_query($sql); - $row = $db->sql_fetchrow($result); $db->sql_freeresult($result); @@ -185,7 +184,7 @@ function make_forum_select($select_id = false, $ignore_id = false, $ignore_acl = } /** -* Generate size select form +* Generate size select options */ function size_select_options($size_compare) { @@ -195,13 +194,13 @@ function size_select_options($size_compare) $size_types = array('b', 'kb', 'mb'); $s_size_options = ''; - + for ($i = 0, $size = sizeof($size_types_text); $i < $size; $i++) { $selected = ($size_compare == $size_types[$i]) ? ' selected="selected"' : ''; $s_size_options .= '<option value="' . $size_types[$i] . '"' . $selected . '>' . $size_types_text[$i] . '</option>'; } - + return $s_size_options; } @@ -229,7 +228,7 @@ function group_select_options($group_id, $exclude_ids = false) $s_group_options .= '<option' . (($row['group_type'] == GROUP_SPECIAL) ? ' class="sep"' : '') . ' value="' . $row['group_id'] . '"' . $selected . '>' . (($row['group_type'] == GROUP_SPECIAL) ? $user->lang['G_' . $row['group_name']] : $row['group_name']) . '</option>'; } $db->sql_freeresult($result); - + return $s_group_options; } @@ -245,6 +244,7 @@ function get_forum_list($acl_list = 'f_list', $id_only = true, $postable_only = { // This query is identical to the jumpbox one $expire_time = ($no_cache) ? 0 : 120; + $sql = 'SELECT forum_id, parent_id, forum_name, forum_type, left_id, right_id FROM ' . FORUMS_TABLE . ' ORDER BY left_id ASC'; @@ -285,14 +285,15 @@ function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $incl { case 'parents': $condition = 'f1.left_id BETWEEN f2.left_id AND f2.right_id'; - break; + break; case 'children': $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id'; - break; + break; default: $condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id OR f1.left_id BETWEEN f2.left_id AND f2.right_id'; + break; } $rows = array(); @@ -327,12 +328,12 @@ function filelist($rootdir, $dir = '', $type = 'gif|jpg|jpeg|png') // Remove initial / if present $rootdir = (substr($rootdir, 0, 1) == '/') ? substr($rootdir, 1) : $rootdir; - // Add closing / if present + // Add closing / if not present $rootdir = ($rootdir && substr($rootdir, -1) != '/') ? $rootdir . '/' : $rootdir; // Remove initial / if present $dir = (substr($dir, 0, 1) == '/') ? substr($dir, 1) : $dir; - // Add closing / if present + // Add closing / if not present $dir = ($dir && substr($dir, -1) != '/') ? $dir . '/' : $dir; if (!is_dir($rootdir . $dir)) @@ -373,7 +374,7 @@ function move_topics($topic_ids, $forum_id, $auto_sync = true) } $forum_ids = array($forum_id); - + if (!is_array($topic_ids)) { $topic_ids = array($topic_ids); @@ -398,9 +399,6 @@ function move_topics($topic_ids, $forum_id, $auto_sync = true) $db->sql_freeresult($result); } - /** - * @todo watch for undesired results on marked topics for moving topics, maybe handle it seperatly to cover cookie tracking - */ $table_ary = array(TOPICS_TABLE, POSTS_TABLE, LOG_TABLE, DRAFTS_TABLE, TOPICS_TRACK_TABLE); foreach ($table_ary as $table) { @@ -486,6 +484,7 @@ function move_posts($post_ids, $topic_id, $auto_sync = true) function delete_topics($where_type, $where_ids, $auto_sync = true) { global $db; + $forum_ids = $topic_ids = array(); if (is_array($where_ids)) @@ -521,8 +520,6 @@ function delete_topics($where_type, $where_ids, $auto_sync = true) return $return; } - // TODO: probably some other stuff too - $sql_where = ' IN (' . implode(', ', $topic_ids) . ')'; $db->sql_transaction('begin'); @@ -563,15 +560,17 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = { $where_ids = array_unique($where_ids); } + if (empty($where_ids)) { return false; } + $post_ids = $topic_ids = $forum_ids = array(); $sql = 'SELECT post_id, poster_id, topic_id, forum_id FROM ' . POSTS_TABLE . " - WHERE $where_type " . ((!is_array($where_ids)) ? "= $where_ids" : 'IN (' . implode(', ', $where_ids) . ')'); + WHERE $where_type " . ((!is_array($where_ids)) ? '= ' . (int) $where_ids : 'IN (' . implode(', ', array_map('intval', $where_ids)) . ')'); $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) @@ -581,6 +580,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = $topic_ids[] = $row['topic_id']; $forum_ids[] = $row['forum_id']; } + $db->sql_freeresult($result); if (!sizeof($post_ids)) { @@ -602,7 +602,7 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = unset($table_ary); // Remove the message from the search index - $search_type = $config['search_type']; + $search_type = basename($config['search_type']); if (!file_exists($phpbb_root_path . 'includes/search/' . $search_type . '.' . $phpEx)) { @@ -643,9 +643,10 @@ function delete_posts($where_type, $where_ids, $auto_sync = true, $posted_sync = /** * Delete Attachments -* mode => (post, topic, attach, user) -* ids => (post_ids, topic_ids, attach_ids, user_ids) -* resync => set this to false if you are deleting posts or topics... +* +* @param string $mode can be: post|topic|attach|user +* @param mixed $ids can be: post_ids, topic_ids, attach_ids, user_ids +* @param bool $resync set this to false if you are deleting posts or topics */ function delete_attachments($mode, $ids, $resync = true) { @@ -654,8 +655,13 @@ function delete_attachments($mode, $ids, $resync = true) if (is_array($ids)) { $ids = array_unique($ids); + $ids = array_map('intval', $ids); } - + else + { + $ids = array((int) $ids); + } + if (!sizeof($ids)) { return false; @@ -672,7 +678,7 @@ function delete_attachments($mode, $ids, $resync = true) FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $sql_id . ' IN (' . implode(', ', $ids) . ')'; $result = $db->sql_query($sql); - + while ($row = $db->sql_fetchrow($result)) { $post_ids[] = $row['post_id']; @@ -689,7 +695,7 @@ function delete_attachments($mode, $ids, $resync = true) WHERE post_msg_id IN (' . implode(', ', $ids) . ') AND in_message = 0'; $result = $db->sql_query($sql); - + while ($row = $db->sql_fetchrow($result)) { $topic_ids[] = $row['topic_id']; @@ -699,14 +705,16 @@ function delete_attachments($mode, $ids, $resync = true) } // Delete attachments - $db->sql_query('DELETE FROM ' . ATTACHMENTS_TABLE . ' WHERE ' . $sql_id . ' IN (' . implode(', ', $ids) . ')'); + $sql = 'DELETE FROM ' . ATTACHMENTS_TABLE . ' + WHERE ' . $sql_id . ' IN (' . implode(', ', $ids) . ')'; + $db->sql_query($sql); $num_deleted = $db->sql_affectedrows(); if (!$num_deleted) { return 0; } - + // Delete attachments from filesystem $space_removed = $files_removed = 0; foreach ($physical as $file_ary) @@ -744,9 +752,10 @@ function delete_attachments($mode, $ids, $resync = true) { if ($mode == 'post' || $mode == 'topic') { - $db->sql_query('UPDATE ' . POSTS_TABLE . ' + $sql = 'UPDATE ' . POSTS_TABLE . ' SET post_attachment = 0 - WHERE post_id IN (' . implode(', ', $post_ids) . ')'); + WHERE post_id IN (' . implode(', ', $post_ids) . ')'; + $db->sql_query($sql); } if ($mode == 'user' || $mode == 'attach') @@ -754,11 +763,11 @@ function delete_attachments($mode, $ids, $resync = true) $remaining = array(); $sql = 'SELECT post_msg_id - FROM ' . ATTACHMENTS_TABLE . ' - WHERE post_msg_id IN (' . implode(', ', $post_ids) . ') - AND in_message = 0'; + FROM ' . ATTACHMENTS_TABLE . ' + WHERE post_msg_id IN (' . implode(', ', $post_ids) . ') + AND in_message = 0'; $result = $db->sql_query($sql); - + while ($row = $db->sql_fetchrow($result)) { $remaining[] = $row['post_msg_id']; @@ -766,21 +775,23 @@ function delete_attachments($mode, $ids, $resync = true) $db->sql_freeresult($result); $unset_ids = array_diff($post_ids, $remaining); + if (sizeof($unset_ids)) { - $db->sql_query('UPDATE ' . POSTS_TABLE . ' + $sql = 'UPDATE ' . POSTS_TABLE . ' SET post_attachment = 0 - WHERE post_id IN (' . implode(', ', $unset_ids) . ')'); + WHERE post_id IN (' . implode(', ', $unset_ids) . ')'; + $db->sql_query($sql); } $remaining = array(); $sql = 'SELECT post_msg_id - FROM ' . ATTACHMENTS_TABLE . ' - WHERE post_msg_id IN (' . implode(', ', $post_ids) . ') - AND in_message = 1'; + FROM ' . ATTACHMENTS_TABLE . ' + WHERE post_msg_id IN (' . implode(', ', $post_ids) . ') + AND in_message = 1'; $result = $db->sql_query($sql); - + while ($row = $db->sql_fetchrow($result)) { $remaining[] = $row['post_msg_id']; @@ -788,11 +799,13 @@ function delete_attachments($mode, $ids, $resync = true) $db->sql_freeresult($result); $unset_ids = array_diff($post_ids, $remaining); + if (sizeof($unset_ids)) { - $db->sql_query('UPDATE ' . PRIVMSGS_TABLE . ' + $sql = 'UPDATE ' . PRIVMSGS_TABLE . ' SET message_attachment = 0 - WHERE msg_id IN (' . implode(', ', $unset_ids) . ')'); + WHERE msg_id IN (' . implode(', ', $unset_ids) . ')'; + $db->sql_query($sql); } } } @@ -802,9 +815,10 @@ function delete_attachments($mode, $ids, $resync = true) // Update topic indicator if ($mode == 'topic') { - $db->sql_query('UPDATE ' . TOPICS_TABLE . ' + $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_attachment = 0 - WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'); + WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; + $db->sql_query($sql); } if ($mode == 'post' || $mode == 'user' || $mode == 'attach') @@ -812,8 +826,8 @@ function delete_attachments($mode, $ids, $resync = true) $remaining = array(); $sql = 'SELECT topic_id - FROM ' . ATTACHMENTS_TABLE . ' - WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; + FROM ' . ATTACHMENTS_TABLE . ' + WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) @@ -823,11 +837,13 @@ function delete_attachments($mode, $ids, $resync = true) $db->sql_freeresult($result); $unset_ids = array_diff($topic_ids, $remaining); + if (sizeof($unset_ids)) { - $db->sql_query('UPDATE ' . TOPICS_TABLE . ' + $sql = 'UPDATE ' . TOPICS_TABLE . ' SET topic_attachment = 0 - WHERE topic_id IN (' . implode(', ', $unset_ids) . ')'); + WHERE topic_id IN (' . implode(', ', $unset_ids) . ')'; + $db->sql_query($sql); } } } @@ -840,7 +856,7 @@ function delete_attachments($mode, $ids, $resync = true) */ function delete_topic_shadows($max_age, $forum_id = '', $auto_sync = true) { - $where = (is_array($forum_id)) ? 'AND t.forum_id IN (' . implode(', ', $forum_id) . ')' : (($forum_id) ? "AND t.forum_id = $forum_id" : ''); + $where = (is_array($forum_id)) ? 'AND t.forum_id IN (' . implode(', ', array_map('intval', $forum_id)) . ')' : (($forum_id) ? 'AND t.forum_id = ' . (int) $forum_id : ''); switch (SQL_LAYER) { @@ -861,12 +877,13 @@ function delete_topic_shadows($max_age, $forum_id = '', $auto_sync = true) AND t.topic_time < ' . (time() - $max_age) . $where; $result = $db->sql_query($sql); - + $topic_ids = array(); while ($row = $db->sql_fetchrow($result)) { $topic_ids[] = $row['topic_id']; } + $db->sql_freeresult($result); if (sizeof($topic_ids)) { @@ -874,6 +891,7 @@ function delete_topic_shadows($max_age, $forum_id = '', $auto_sync = true) WHERE topic_id IN (' . implode(',', $topic_ids) . ')'; $db->sql_query($sql); } + break; } if ($auto_sync) @@ -965,19 +983,23 @@ function phpbb_unlink($filename, $mode = 'file') /** * All-encompasing sync function * -* Usage: -* sync('topic', 'topic_id', 123); <= resync topic #123 -* sync('topic', 'forum_id', array(2, 3)); <= resync topics from forum #2 and #3 -* sync('topic'); <= resync all topics -* sync('topic', 'range', 'topic_id BETWEEN 1 AND 60'); <= resync a range of topics/forums (only available for 'topic' and 'forum' modes) +* Exaples: +* <code> +* sync('topic', 'topic_id', 123); // resync topic #123 +* sync('topic', 'forum_id', array(2, 3)); // resync topics from forum #2 and #3 +* sync('topic'); // resync all topics +* sync('topic', 'range', 'topic_id BETWEEN 1 AND 60'); // resync a range of topics/forums (only available for 'topic' and 'forum' modes) +* </code> * * Modes: -* - topic_moved Removes topic shadows that would be in the same forum as the topic they link to +* - forum Resync complete forum +* - topic Resync topics +* - topic_moved Removes topic shadows that would be in the same forum as the topic they link to * - topic_approved Resyncs the topic_approved flag according to the status of the first post * - post_reported Resyncs the post_reported flag, relying on actual reports * - topic_reported Resyncs the topic_reported flag, relying on post_reported flags -* - post_attachement Same as post_reported, thanks to a quick Search/Replace -* - topic_attachement Same as topic_reported, thanks to a quick Search/Replace +* - post_attachement Same as post_reported, but with attachment flags +* - topic_attachement Same as topic_reported, but with attachment flags */ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $sync_extra = false) { @@ -986,10 +1008,11 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, if (is_array($where_ids)) { $where_ids = array_unique($where_ids); + $where_ids = array_map('intval', $where_ids); } else if ($where_type != 'range') { - $where_ids = ($where_ids) ? array($where_ids) : array(); + $where_ids = ($where_ids) ? array((int) $where_ids) : array(); } if ($mode == 'forum' || $mode == 'topic') @@ -1028,7 +1051,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, { return; } - + // $where_type contains the field for the where clause (forum_id, topic_id) $where_sql = 'WHERE ' . $mode{0} . ".$where_type IN (" . implode(', ', $where_ids) . ')'; $where_sql_and = $where_sql . "\n\tAND"; @@ -1055,23 +1078,25 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, AND t1.forum_id = t2.forum_id"; $result = $db->sql_query($sql); - if ($row = $db->sql_fetchrow($result)) + $topic_id_ary = array(); + while ($row = $db->sql_fetchrow($result)) { - $topic_id_ary = array(); - do - { - $topic_id_ary[] = $row['topic_id']; - } - while ($row = $db->sql_fetchrow($result)); - - $sql = 'DELETE FROM ' . TOPICS_TABLE . ' - WHERE topic_id IN (' . implode(', ', $topic_id_ary) . ')'; - $db->sql_query($sql); - unset($topic_id_ary); + $topic_id_ary[] = $row['topic_id']; } $db->sql_freeresult($result); + + if (!sizeof($topic_id_ary)) + { + return; + } + + $sql = 'DELETE FROM ' . TOPICS_TABLE . ' + WHERE topic_id IN (' . implode(', ', $topic_id_ary) . ')'; + $db->sql_query($sql); + + break; } - break; + break; case 'topic_approved': switch (SQL_LAYER) @@ -1107,8 +1132,9 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, SET topic_approved = 1 - topic_approved WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; $db->sql_query($sql); + break; } - break; + break; case 'post_reported': $post_ids = $post_reported = array(); @@ -1118,6 +1144,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $where_sql GROUP BY p.post_id, p.post_reported"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $post_ids[$row['post_id']] = $row['post_id']; @@ -1126,6 +1153,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $post_reported[$row['post_id']] = 1; } } + $db->sql_freeresult($result); $sql = 'SELECT DISTINCT(post_id) FROM ' . REPORTS_TABLE . ' @@ -1144,6 +1172,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, unset($post_reported[$row['post_id']]); } } + $db->sql_freeresult($result); // $post_reported should be empty by now, if it's not it contains // posts that are falsely flagged as reported @@ -1159,7 +1188,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE post_id IN (' . implode(', ', $post_ids) . ')'; $db->sql_query($sql); } - break; + break; case 'topic_reported': if ($sync_extra) @@ -1173,15 +1202,18 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, FROM ' . POSTS_TABLE . " t $where_sql_and t.post_reported = 1"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $topic_reported[$row['topic_id']] = 1; } + $db->sql_freeresult($result); $sql = 'SELECT t.topic_id, t.topic_reported FROM ' . TOPICS_TABLE . " t $where_sql"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { if ($row['topic_reported'] ^ isset($topic_reported[$row['topic_id']])) @@ -1189,6 +1221,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $topic_ids[] = $row['topic_id']; } } + $db->sql_freeresult($result); if (sizeof($topic_ids)) { @@ -1197,7 +1230,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; $db->sql_query($sql); } - break; + break; case 'post_attachment': $post_ids = $post_attachment = array(); @@ -1207,6 +1240,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $where_sql GROUP BY p.post_id, p.post_attachment"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $post_ids[$row['post_id']] = $row['post_id']; @@ -1215,14 +1249,15 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $post_attachment[$row['post_id']] = 1; } } + $db->sql_freeresult($result); $sql = 'SELECT DISTINCT(post_msg_id) FROM ' . ATTACHMENTS_TABLE . ' WHERE post_msg_id IN (' . implode(', ', $post_ids) . ') AND in_message = 0'; + $result = $db->sql_query($sql); $post_ids = array(); - $result = $db->sql_query($sql); while ($row = $db->sql_fetchrow($result)) { if (!isset($post_attachment[$row['post_id']])) @@ -1234,6 +1269,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, unset($post_attachment[$row['post_id']]); } } + $db->sql_freeresult($result); // $post_attachment should be empty by now, if it's not it contains // posts that are falsely flagged as having attachments @@ -1249,7 +1285,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE post_id IN (' . implode(', ', $post_ids) . ')'; $db->sql_query($sql); } - break; + break; case 'topic_attachment': if ($sync_extra) @@ -1263,15 +1299,18 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, FROM ' . POSTS_TABLE . " t $where_sql_and t.post_attachment = 1"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $topic_attachment[$row['topic_id']] = 1; } + $db->sql_freeresult($result); $sql = 'SELECT t.topic_id, t.topic_attachment FROM ' . TOPICS_TABLE . " t $where_sql"; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { if ($row['topic_attachment'] ^ isset($topic_attachment[$row['topic_id']])) @@ -1279,6 +1318,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $topic_ids[] = $row['topic_id']; } } + $db->sql_freeresult($result); if (sizeof($topic_ids)) { @@ -1287,9 +1327,10 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE topic_id IN (' . implode(', ', $topic_ids) . ')'; $db->sql_query($sql); } - break; + break; case 'forum': + // 1: Get the list of all forums $sql = 'SELECT f.* FROM ' . FORUMS_TABLE . " f @@ -1316,6 +1357,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $forum_data[$forum_id]['last_poster_id'] = 0; $forum_data[$forum_id]['last_poster_name'] = ''; } + $db->sql_freeresult($result); // 2: Get topic counts for each forum $sql = 'SELECT forum_id, topic_approved, COUNT(topic_id) AS forum_topics @@ -1323,6 +1365,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE forum_id IN (' . implode(', ', $forum_ids) . ') GROUP BY forum_id, topic_approved'; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $forum_id = (int) $row['forum_id']; @@ -1333,6 +1376,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $forum_data[$forum_id]['topics'] = $row['forum_topics']; } } + $db->sql_freeresult($result); // 3: Get post count and last_post_id for each forum $sql = 'SELECT forum_id, COUNT(post_id) AS forum_posts, MAX(post_id) AS last_post_id @@ -1341,15 +1385,17 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, AND post_approved = 1 GROUP BY forum_id'; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { $forum_id = (int) $row['forum_id']; - $forum_data[$forum_id]['posts'] = intval($row['forum_posts']); - $forum_data[$forum_id]['last_post_id'] = intval($row['last_post_id']); + $forum_data[$forum_id]['posts'] = (int) $row['forum_posts']; + $forum_data[$forum_id]['last_post_id'] = (int) $row['last_post_id']; $post_ids[] = $row['last_post_id']; } + $db->sql_freeresult($result); // 4: Retrieve last_post infos if (sizeof($post_ids)) @@ -1359,9 +1405,10 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, WHERE p.post_id IN (' . implode(', ', $post_ids) . ') AND p.poster_id = u.user_id'; $result = $db->sql_query($sql); + while ($row = $db->sql_fetchrow($result)) { - $post_info[intval($row['post_id'])] = $row; + $post_info[$row['post_id']] = $row; } $db->sql_freeresult($result); @@ -1393,7 +1440,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, foreach ($forum_data as $forum_id => $row) { - $sql = array(); + $sql_ary = array(); foreach ($fieldnames as $fieldname) { @@ -1401,24 +1448,24 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, { if (preg_match('#name$#', $fieldname)) { - $sql['forum_' . $fieldname] = (string) $row[$fieldname]; + $sql_ary['forum_' . $fieldname] = (string) $row[$fieldname]; } else { - $sql['forum_' . $fieldname] = (int) $row[$fieldname]; + $sql_ary['forum_' . $fieldname] = (int) $row[$fieldname]; } } } - if (sizeof($sql)) + if (sizeof($sql_ary)) { $sql = 'UPDATE ' . FORUMS_TABLE . ' - SET ' . $db->sql_build_array('UPDATE', $sql) . ' + SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE forum_id = ' . $forum_id; $db->sql_query($sql); } } - break; + break; case 'topic': $topic_data = $post_ids = $approved_unapproved_ids = $resync_forums = $delete_topics = $delete_posts = array(); @@ -1519,6 +1566,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, delete_topics($where_type, $where_ids, true); return; } + if (sizeof($delete_topics)) { $delete_topic_ids = array(); @@ -1553,6 +1601,7 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, $topic_data[$topic_id]['poster'] = $row['poster_id']; $topic_data[$topic_id]['first_poster_name'] = ($row['poster_id'] == ANONYMOUS) ? $row['post_username'] : $row['username']; } + if ($row['post_id'] == $topic_data[$topic_id]['last_post_id']) { $topic_data[$topic_id]['last_poster_id'] = $row['poster_id']; @@ -1612,20 +1661,20 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, foreach ($topic_data as $topic_id => $row) { - $sql = array(); + $sql_ary = array(); foreach ($fieldnames as $fieldname) { if ($row['topic_' . $fieldname] != $row[$fieldname]) { - $sql['topic_' . $fieldname] = $row[$fieldname]; + $sql_ary['topic_' . $fieldname] = $row[$fieldname]; } } - if (sizeof($sql)) + if (sizeof($sql_ary)) { $sql = 'UPDATE ' . TOPICS_TABLE . ' - SET ' . $db->sql_build_array('UPDATE', $sql) . ' + SET ' . $db->sql_build_array('UPDATE', $sql_ary) . ' WHERE topic_id = ' . $topic_id; $db->sql_query($sql); @@ -1641,8 +1690,10 @@ function sync($mode, $where_type = '', $where_ids = '', $resync_parents = false, { sync('forum', 'forum_id', $resync_forums, true); } - break; + break; } + + return; } /** @@ -1652,7 +1703,7 @@ function prune($forum_id, $prune_mode, $prune_date, $prune_flags = 0, $auto_sync { global $db; - $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(',', $forum_id) . ')' : " = $forum_id"; + $sql_forum = (is_array($forum_id)) ? ' IN (' . implode(', ', array_map('intval', $forum_id)) . ')' : ' = ' . (int) $forum_id; $sql_and = ''; if (!($prune_flags & 4)) @@ -1722,8 +1773,10 @@ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_fr FROM ' . FORUMS_TABLE . " WHERE forum_id = $forum_id"; $result = $db->sql_query($sql, 3600); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); - if ($row = $db->sql_fetchrow($result)) + if ($row) { $prune_date = time() - ($prune_days * 86400); $next_prune = time() + ($prune_freq * 86400); @@ -1737,7 +1790,6 @@ function auto_prune($forum_id, $prune_mode, $prune_flags, $prune_days, $prune_fr add_log('admin', 'LOG_AUTO_PRUNE', $row['forum_name']); } - $db->sql_freeresult($result); return; } @@ -1806,6 +1858,7 @@ function split_sql_file($sql, $delimiter) { unset($data[key($data)]); } + return $data; } @@ -1852,11 +1905,11 @@ function cache_moderators() ), 'WHERE' => '(o.auth_option_id = a.auth_option_id OR o.auth_option_id = r.auth_option_id) - AND ((a.auth_setting = ' . ACL_NO . ' AND r.auth_setting IS NULL) - OR r.auth_setting = ' . ACL_NO . ') - AND a.group_id = ug.group_id - AND ug.user_id IN (' . implode(', ', $ug_id_ary) . ") - AND o.auth_option LIKE 'm\_%'", + AND ((a.auth_setting = ' . ACL_NO . ' AND r.auth_setting IS NULL) + OR r.auth_setting = ' . ACL_NO . ') + AND a.group_id = ug.group_id + AND ug.user_id IN (' . implode(', ', $ug_id_ary) . ") + AND o.auth_option LIKE 'm\_%'", )); $result = $db->sql_query($sql); @@ -1980,11 +2033,11 @@ function cache_moderators() */ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id = 0, $topic_id = 0, $user_id = 0, $limit_days = 0, $sort_by = 'l.log_time DESC') { - global $db, $user, $auth, $phpEx, $SID, $phpbb_root_path, $phpbb_admin_path; + global $db, $user, $auth, $phpEx, $phpbb_root_path, $phpbb_admin_path; $topic_id_list = $reportee_id_list = $is_auth = $is_mod = array(); - $profile_url = (defined('IN_ADMIN')) ? "{$phpbb_admin_path}index.$phpEx$SID&i=users&mode=overview" : "{$phpbb_root_path}memberlist.$phpEx$SID&mode=viewprofile"; + $profile_url = (defined('IN_ADMIN')) ? append_sid("{$phpbb_admin_path}index.$phpEx", 'i=users&mode=overview') : append_sid("{$phpbb_root_path}memberlist.$phpEx", 'mode=viewprofile'); switch ($mode) { @@ -1992,7 +2045,7 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id $log_type = LOG_ADMIN; $sql_forum = ''; break; - + case 'mod': $log_type = LOG_MOD; @@ -2053,25 +2106,23 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id } $log[$i] = array( - 'id' => $row['log_id'], - + 'id' => $row['log_id'], 'reportee_id' => $row['reportee_id'], 'reportee_username' => '', - 'user_id' => $row['user_id'], 'username' => '<a href="' . $profile_url . '&u=' . $row['user_id'] . '">' . $row['username'] . '</a>', 'ip' => $row['log_ip'], 'time' => $row['log_time'], 'forum_id' => $row['forum_id'], 'topic_id' => $row['topic_id'], - - 'viewforum' => ($row['forum_id'] && $auth->acl_get('f_read', $row['forum_id'])) ? "{$phpbb_root_path}viewforum.$phpEx$SID&f=" . $row['forum_id'] : '', + + 'viewforum' => ($row['forum_id'] && $auth->acl_get('f_read', $row['forum_id'])) ? append_sid("{$phpbb_root_path}viewforum.$phpEx", 'f=' . $row['forum_id']) : '', 'action' => (isset($user->lang[$row['log_operation']])) ? $user->lang[$row['log_operation']] : '{' . ucfirst(str_replace('_', ' ', $row['log_operation'])) . '}', ); if (!empty($row['log_data'])) { - $log_data_ary = unserialize(stripslashes($row['log_data'])); + $log_data_ary = unserialize($row['log_data']); if (isset($user->lang[$row['log_operation']])) { @@ -2097,19 +2148,39 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id $topic_id_list = array_unique($topic_id_list); // This query is not really needed if move_topics() updates the forum_id field, - // altough it's also used to determine if the topic still exists in the database + // although it's also used to determine if the topic still exists in the database $sql = 'SELECT topic_id, forum_id FROM ' . TOPICS_TABLE . ' WHERE topic_id IN (' . implode(', ', array_map('intval', $topic_id_list)) . ')'; $result = $db->sql_query($sql); + $default_forum_id = 0; + while ($row = $db->sql_fetchrow($result)) { - if ($auth->acl_get('f_read', $row['forum_id'])) + if (!$row['forum_id']) + { + if ($auth->acl_getf_global('f_read')) + { + if (!$default_forum_id) + { + $sql = 'SELECT forum_id + FROM ' . FORUMS_TABLE . ' + WHERE forum_type = ' . FORUM_POST; + $f_result = $db->sql_query_limit($sql, 1); + $default_forum_id = (int) $db->sql_fetchfield('forum_id', false, $f_result); + $db->sql_freeresult($f_result); + } + + $is_auth[$row['topic_id']] = $default_forum_id; + } + } + else { - // DEBUG!! - global topic - $config['default_forum_id'] = 2; - $is_auth[$row['topic_id']] = ($row['forum_id']) ? $row['forum_id'] : $config['default_forum_id']; + if ($auth->acl_get('f_read', $row['forum_id'])) + { + $is_auth[$row['topic_id']] = $row['forum_id']; + } } if ($auth->acl_gets('a_', 'm_', $row['forum_id'])) @@ -2117,11 +2188,12 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id $is_mod[$row['topic_id']] = $row['forum_id']; } } + $db->sql_freeresult($result); foreach ($log as $key => $row) { - $log[$key]['viewtopic'] = (isset($is_auth[$row['topic_id']])) ? "{$phpbb_root_path}viewtopic.$phpEx$SID&f=" . $is_auth[$row['topic_id']] . '&t=' . $row['topic_id'] : ''; - $log[$key]['viewlogs'] = (isset($is_mod[$row['topic_id']])) ? "{$phpbb_root_path}mcp.$phpEx$SID&i=logs&mode=topic_logs&t=" . $row['topic_id'] : ''; + $log[$key]['viewtopic'] = (isset($is_auth[$row['topic_id']])) ? append_sid("{$phpbb_root_path}viewtopic.$phpEx", 'f=' . $is_auth[$row['topic_id']] . '&t=' . $row['topic_id']) : ''; + $log[$key]['viewlogs'] = (isset($is_mod[$row['topic_id']])) ? append_sid("{$phpbb_root_path}mcp.$phpEx", 'i=logs&mode=topic_logs&t=' . $row['topic_id'], true, $user->session_id) : ''; } } @@ -2149,12 +2221,9 @@ function view_log($mode, &$log, &$log_count, $limit = 0, $offset = 0, $forum_id AND l.log_time >= $limit_days $sql_forum"; $result = $db->sql_query($sql); - - $row = $db->sql_fetchrow($result); + $log_count = (int) $db->sql_fetchfield('total_entries'); $db->sql_freeresult($result); - $log_count = $row['total_entries']; - return; } @@ -2171,7 +2240,6 @@ function view_warned_users(&$users, &$user_count, $limit = 0, $offset = 0, $limi ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : '') . " ORDER BY $sort_by"; $result = $db->sql_query_limit($sql, $limit, $offset); - $users = $db->sql_fetchrowset($result); $db->sql_freeresult($result); @@ -2179,14 +2247,10 @@ function view_warned_users(&$users, &$user_count, $limit = 0, $offset = 0, $limi FROM ' . USERS_TABLE . ' WHERE user_warnings > 0 ' . (($limit_days) ? "AND user_last_warning >= $limit_days" : ''); - $result = $db->sql_query($sql); - - $row = $db->sql_fetchrow($result); + $user_count = (int) $db->sql_fetchfield('user_count'); $db->sql_freeresult($result); - $user_count = $row['user_count']; - return; } @@ -2198,13 +2262,15 @@ function get_database_size() { global $db, $user, $table_prefix; - // This code is heavily influenced by a similar routine - // in phpMyAdmin 2.2.0 + // This code is heavily influenced by a similar routine in phpMyAdmin 2.2.0 if (preg_match('#^mysql#', SQL_LAYER)) { - $result = $db->sql_query('SELECT VERSION() AS mysql_version'); + $sql = 'SELECT VERSION() AS mysql_version'; + $result = $db->sql_query($sql); + $row = $db->sql_fetchrow($result); + $db->sql_freeresult($result); - if ($row = $db->sql_fetchrow($result)) + if ($row) { $version = $row['mysql_version']; @@ -2251,7 +2317,6 @@ function get_database_size() $sql = 'SELECT ((SUM(size) * 8.0) * 1024.0) as dbsize FROM sysfiles'; $result = $db->sql_query($sql); - $dbsize = ($row = $db->sql_fetchrow($result)) ? intval($row['dbsize']) : $user->lang['NOT_AVAILABLE']; $db->sql_freeresult($result); } |