save('config', $config);
$sql = 'UPDATE ' . CONFIG_TABLE . "
SET config_value = '" . sql_escape($config_value) . "'
WHERE config_name = '$config_name'";
$db->sql_query($sql);
}
function get_userdata($user)
{
global $db;
$sql = "SELECT *
FROM " . USERS_TABLE . "
WHERE ";
$sql .= ((is_int($user)) ? "user_id = $user" : "username = '" . sql_quote($user) . "'") . " AND user_id <> " . ANONYMOUS;
$result = $db->sql_query($sql);
return ($row = $db->sql_fetchrow($result)) ? $row : false;
}
function get_forum_branch($forum_id, $type = 'all', $order = 'descending', $include_forum = TRUE)
{
global $db;
switch ($type)
{
case 'parents':
$condition = 'f1.left_id BETWEEN f2.left_id AND f2.right_id';
break;
case 'children':
$condition = 'f2.left_id BETWEEN f1.left_id AND f1.right_id';
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';
}
$rows = array();
$sql = 'SELECT f2.*
FROM (' . FORUMS_TABLE . ' f1
LEFT JOIN ' . FORUMS_TABLE . " f2 ON $condition)
WHERE f1.forum_id = $forum_id
ORDER BY f2.left_id " . (($order == 'descending') ? 'ASC' : 'DESC');
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
if (!$include_forum && $row['forum_id'] == $forum_id)
{
continue;
}
$rows[] = $row;
}
return $rows;
}
// Create forum navigation links for given forum, create parent
// list if currently null, assign basic forum info to template
function generate_forum_nav(&$forum_data)
{
global $db, $user, $template;
// Get forum parents
$forum_parents = array();
if ($forum_data['parent_id'] > 0)
{
if (empty($forum_data['forum_parents']))
{
$sql = 'SELECT forum_id, forum_name
FROM ' . FORUMS_TABLE . '
WHERE left_id < ' . $forum_data['left_id'] . '
AND right_id > ' . $forum_data['right_id'] . '
ORDER BY left_id ASC';
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$forum_parents[$row['forum_id']] = $row['forum_name'];
}
$sql = 'UPDATE ' . FORUMS_TABLE . "
SET forum_parents = '" . sql_escape(serialize($forum_parents)) . "'
WHERE parent_id = " . $forum_data['parent_id'];
$db->sql_query($sql);
}
else
{
$forum_parents = unserialize($forum_data['forum_parents']);
}
}
// Build navigation links
foreach ($forum_parents as $parent_forum_id => $parent_name)
{
$template->assign_block_vars('navlinks', array(
'FORUM_NAME' => $parent_name,
'U_VIEW_FORUM' => 'viewforum.' . $phpEx . $SID . '&f=' . $parent_forum_id
));
}
$template->assign_block_vars('navlinks', array(
'FORUM_NAME' => $forum_data['forum_name'],
'U_VIEW_FORUM' => 'viewforum.' . $phpEx . $SID . '&f=' . $forum_id
));
$template->assign_vars(array(
'FORUM_ID' => $forum_id,
'FORUM_NAME' => $forum_data['forum_name'],
'FORUM_DESC' => strip_tags($forum_data['forum_desc'])
));
return;
}
// Obtain list of moderators of each forum
function get_moderators(&$forum_moderators, $forum_id = false)
{
global $cache, $SID, $db, $acl_options, $phpEx;
if (!empty($forum_id) && is_array($forum_id))
{
$forum_sql = 'AND forum_id IN (' . implode(', ', $forum_id) . ')';
}
else
{
$forum_sql = ($forum_id) ? 'AND forum_id = ' . $forum_id : '';
}
$sql = 'SELECT *
FROM ' . MODERATOR_TABLE . "
WHERE display_on_index = 1
$forum_sql";
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$forum_moderators[$row['forum_id']][] = (!empty($row['user_id'])) ? '' . $row['username'] . '' : '' . $row['groupname'] . '';
}
$db->sql_freeresult($result);
return;
}
// User authorisation levels output
function get_forum_rules($mode, &$rules, &$forum_id)
{
global $SID, $auth, $user;
$rules .= (($auth->acl_gets('f_post', 'm_', 'a_', $forum_id)) ? $user->lang['Rules_post_can'] : $user->lang['Rules_post_cannot']) . '
';
$rules .= (($auth->acl_gets('f_reply', 'm_', 'a_', $forum_id)) ? $user->lang['Rules_reply_can'] : $user->lang['Rules_reply_cannot']) . '
';
$rules .= (($auth->acl_gets('f_edit', 'm_', 'a_', $forum_id)) ? $user->lang['Rules_edit_can'] : $user->lang['Rules_edit_cannot']) . '
';
$rules .= (($auth->acl_gets('f_delete', 'm_', 'a_', $forum_id) || $auth->acl_get('m_delete', $forum_id)) ? $user->lang['Rules_delete_can'] : $user->lang['Rules_delete_cannot']) . '
';
$rules .= (($auth->acl_gets('f_attach', 'm_', 'a_', $forum_id)) ? $user->lang['Rules_attach_can'] : $user->lang['Rules_attach_cannot']) . '
';
return;
}
function make_jumpbox($action, $forum_id = false)
{
global $auth, $template, $user, $db, $nav_links, $phpEx;
$boxstring = '';
$template->assign_vars(array(
'L_GO' => $user->lang['Go'],
'L_JUMP_TO' => $user->lang['Jump_to'],
'S_JUMPBOX_SELECT' => $boxstring,
'S_JUMPBOX_ACTION' => $action)
);
return;
}
// Pick a language, any language ...
function language_select($default, $select_name = "language", $dirname="language")
{
global $phpEx;
$dir = @opendir($dirname);
$user = array();
while ($file = readdir($dir))
{
if (!is_dir($dirname . '/' . $file))
{
continue;
}
if (@file_exists($dirname . '/' . $file . '/iso.txt'))
{
list($displayname) = file($dirname . '/' . $file . '/iso.txt');
$lang[$displayname] = $file;
}
}
@closedir($dir);
@asort($lang);
@reset($lang);
$user_select = '';
return $user_select;
}
// Pick a template/theme combo,
function style_select($default_style, $select_name = 'style', $dirname = 'templates')
{
global $db;
$sql = "SELECT style_id, style_name
FROM " . STYLES_TABLE . "
ORDER BY style_name, style_id";
$result = $db->sql_query($sql);
$style_select = '";
return $style_select;
}
// Pick a timezone
function tz_select($default, $select_name = 'timezone')
{
global $sys_timezone, $user;
$tz_select = '';
return $tz_select;
}
// Topic and forum watching common code
function watch_topic_forum($mode, &$s_watching, &$s_watching_img, $user_id, $match_id, $notify_status = 'unset')
{
global $template, $db, $user, $phpEx, $SID, $start;
$table_sql = ($mode == 'forum') ? FORUMS_WATCH_TABLE : TOPICS_WATCH_TABLE;
$where_sql = ($mode == 'forum') ? 'forum_id' : 'topic_id';
$u_url = ($mode == 'forum') ? 'f' : 't';
// Is user watching this thread?
if ($user_id)
{
$can_watch = TRUE;
if ($notify_status == 'unset')
{
$sql = "SELECT notify_status
FROM $table_sql
WHERE $where_sql = $match_id
AND user_id = $user_id";
$result = $db->sql_query($sql);
if ($row = $db->sql_fetchrow($result))
{
$notify_status = $row['notify_status'];
}
else
{
$notify_status = NULL;
}
}
if (!is_null($notify_status))
{
if (isset($_GET['unwatch']))
{
if ($_GET['unwatch'] == $mode)
{
$is_watching = 0;
$sql = "DELETE FROM " . $table_sql . "
WHERE $where_sql = $match_id
AND user_id = $user_id";
$db->sql_query($sql);
}
$template->assign_vars(array(
'META' => '')
);
$message = $user->lang['No_longer_watching_' . $mode] . '
' . sprintf($user->lang['Click_return_' . $mode], '', '');
trigger_error($message);
}
else
{
$is_watching = TRUE;
if ($notify_status)
{
$sql = "UPDATE " . $table_sql . "
SET notify_status = 0
WHERE $where_sql = $match_id
AND user_id = $user_id";
$db->sql_query($sql);
}
}
}
else
{
if (isset($_GET['watch']))
{
if ($_GET['watch'] == $mode)
{
$is_watching = TRUE;
$sql = "INSERT INTO " . $table_sql . " (user_id, $where_sql, notify_status)
VALUES ($user_id, $match_id, 0)";
$db->sql_query($sql);
}
$template->assign_vars(array(
'META' => '')
);
$message = $user->lang['You_are_watching_' . $mode] . '
' . sprintf($user->lang['Click_return_' . $mode], '', '');
trigger_error($message);
}
else
{
$is_watching = 0;
}
}
}
else
{
if (isset($_GET['unwatch']))
{
if ($_GET['unwatch'] == $mode)
{
redirect("login.$phpEx$SID&redirect=view$mode.$phpEx&" . $u_url . "=$match_id&unwatch=forum");
}
}
else
{
$can_watch = 0;
$is_watching = 0;
}
}
if ($can_watch)
{
$s_watching = ($is_watching) ? '' . $user->lang['Stop_watching_' . $mode] . '' : '' . $user->lang['Start_watching_' . $mode] . '';
}
return;
}
// Marks a topic or form as read in the 'lastread' table.
function markread($mode, $forum_id = 0, $topic_id = 0, $post_id = 0)
{
global $db, $user;
if ($user->data['user_id'] == ANONYMOUS)
{
return;
}
switch ($mode)
{
case 'mark':
// Mark one forum as read.
// Do this by inserting a record with -$forum_id in the 'forum_id' field.
$sql = "SELECT forum_id
FROM " . LASTREAD_TABLE . "
WHERE user_id = " . $user->data['user_id'] . "
AND forum_id = -$forum_id";
$result = $db->sql_query($sql);
if ($db->sql_fetchrow($result))
{
// User has marked this topic as read before: Update the record
$sql = "UPDATE " . LASTREAD_TABLE . "
SET lastread_time = " . time() . "
WHERE user_id = " . $user->data['user_id'] . "
AND forum_id = -$forum_id";
$db->sql_query($sql);
}
else
{
// User is marking this forum for the first time.
// Insert dummy topic_id to satisfy PRIMARY KEY (user_id, topic_id)
// dummy id = -forum_id
$sql = "INSERT INTO " . LASTREAD_TABLE . "
(user_id, forum_id, topic_id, lastread_time)
VALUES
(" . $user->data['user_id'] . ", -$forum_id, -$forum_id, " . time() . ")";
$db->sql_query($sql);
}
break;
case 'markall':
// Mark all forums as read.
// Select all forum_id's that are not yet in the lastread table
$sql = "SELECT f.forum_id
FROM " . FORUMS_TABLE . " f
LEFT JOIN (" . LASTREAD_TABLE . " lr ON (
lr.user_id = " . $user->data['user_id'] . "
AND f.forum_id = -lr.forum_id))
WHERE lr.forum_id IS NULL";
$result = $db->sql_query($sql);
if ($row = $db->sql_fetchrow($result))
{
// Some forum_id's are missing. We are not taking into account
// the auth data, even forums the user can't see are marked as read.
$sql = "INSERT INTO " . LASTREAD_TABLE . "
(user_id, forum_id, topic_id, lastread_time)
VALUES\n";
$forum_insert = array();
do
{
// Insert dummy topic_id to satisfy PRIMARY KEY
// dummy id = -forum_id
$forum_insert[] = "(" . $user->data['user_id'] . ", -".$row['forum_id'].", -".$row['forum_id'].", " . time() . ")";
}
while ($row = $db->sql_fetchrow($result));
$forum_insert = implode(",\n", $forum_insert);
$sql .= $forum_insert;
$db->sql_query($sql);
}
// Mark all forums as read
$sql = "UPDATE " . LASTREAD_TABLE . "
SET lastread_time = " . time() . "
WHERE user_id = " . $user->data['user_id'] . "
AND forum_id < 0";
$db->sql_query($sql);
break;
case 'post':
// Mark a topic as read and mark it as a topic where the user has made a post.
$type = 1;
case 'topic':
// Mark a topic as read.
// Type:
// 0 = Normal topic
// 1 = user made a post in this topic
$type_update = (isset($type) && $type = 1) ? 'lastread_type = 1,' : '';
$sql = "UPDATE " . LASTREAD_TABLE . "
SET $type_update forum_id = $forum_id, lastread_time = " . time() . "
WHERE topic_id = $topic_id
AND user_id = " . $user->data['user_id'];
$db->sql_query($sql);
if ($db->sql_affectedrows($result) == 0)
{
// Couldn't update. Row probably doesn't exist. Insert one.
if(isset($type) && $type = 1)
{
$type_name = 'lastread_type, ';
$type_value = '1, ';
}
else
{
$type_name = '';
$type_value = '';
}
$sql = "INSERT INTO " . LASTREAD_TABLE . "
(user_id, topic_id, forum_id, $type_name lastread_time)
VALUES
(" . $user->data['user_id'] . ", $topic_id, $forum_id, $type_value " . time() . ")";
$db->sql_query($sql);
}
break;
}
}
// Pagination routine, generates page number sequence
function generate_pagination($base_url, $num_items, $per_page, $start_item, $add_prevnext_text = TRUE)
{
global $user;
$total_pages = ceil($num_items/$per_page);
if ($total_pages == 1 || !$num_items)
{
return '';
}
$on_page = floor($start_item / $per_page) + 1;
$page_string = ($on_page == 1) ? '1' : '' . $user->lang['PREVIOUS'] . ' 1';
if ($total_pages > 5)
{
$start_cnt = min(max(1, $on_page - 4), $total_pages - 5);
$end_cnt = max(min($total_pages, $on_page + 4), 6);
$page_string .= ($start_cnt > 1) ? ' ... ' : ', ';
for($i = $start_cnt + 1; $i < $end_cnt; $i++)
{
$page_string .= ($i == $on_page) ? '' . $i . '' : '' . $i . '';
if ($i < $end_cnt - 1)
{
$page_string .= ', ';
}
}
$page_string .= ($end_cnt < $total_pages) ? ' ... ' : ', ';
}
else
{
$page_string .= ', ';
for($i = 2; $i < $total_pages; $i++)
{
$page_string .= ($i == $on_page) ? '' . $i . '' : '' . $i . '';
if ($i < $total_pages)
{
$page_string .= ', ';
}
}
}
$page_string .= ($on_page == $total_pages) ? '' . $total_pages . '' : '' . $total_pages . ' ' . $user->lang['NEXT'] . '';
$page_string = $user->lang['GOTO_PAGE'] . ' ' . $page_string;
return $page_string;
}
function on_page($num_items, $per_page, $start)
{
global $user;
return sprintf($user->lang['PAGE_OF'], floor($start / $per_page) + 1, max(ceil($num_items / $per_page), 1));
}
// Obtain list of naughty words and build preg style replacement arrays for use by the
// calling script, note that the vars are passed as references this just makes it easier
// to return both sets of arrays
function obtain_word_list(&$orig_word, &$replacement_word)
{
global $db, $cache;
if ($cache->exists('word_censors'))
{
$words = $cache->load('word_censors');
$orig_word = $words['orig'];
$replacement_word = $words['replacement'];
}
else
{
$sql = "SELECT word, replacement
FROM " . WORDS_TABLE;
$result = $db->sql_query($sql);
while ($row = $db->sql_fetchrow($result))
{
$orig_word[] = '#\b(' . str_replace('\*', '\w*?', preg_quote($row['word'], '#')) . ')\b#i';
$replacement_word[] = $row['replacement'];
}
$words = array('orig' => $orig_word, 'replacement' => $replacement_word);
$cache->save('word_censors', $words);
}
return true;
}
// Redirects the user to another page then exits the script nicely
function redirect($url)
{
global $db, $config;
if (isset($db))
{
$db->sql_close();
}
$server_protocol = ($config['cookie_secure']) ? 'https://' : 'http://';
$server_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($config['server_name']));
$server_port = ($config['server_port'] <> 80) ? ':' . trim($config['server_port']) . '/' : '/';
$script_name = preg_replace('/^\/?(.*?)\/?$/', '\1', trim($config['script_path']));
$url = preg_replace('/^\/?(.*?)\/?$/', '/\1', trim($url));
// Redirect via an HTML form for PITA webservers
if (@preg_match('/Microsoft|WebSTAR|Xitami/', getenv('SERVER_SOFTWARE')))
{
header('Refresh: 0; URL=' . $server_protocol . $server_name . $server_port . $script_name . $url);
echo '
![]() | General Error |
' . $msg_text . ' Please notify the board administrator or webmaster : ' . $config['board_email'] . ' |