Перейти к контенту

Косяки IBF. Версии форума 1.2++ (до 2.x)


Рекомендуемые сообщения

Я когда форум делаю часто натыкаюсь на то, что разработчики по элементарной забывчивости забыли строчку добавить или ещё что-то. Возможно в других версиях это пофиксено, но у меня в базовой (1.2) таких случаев много.

Обладателям других версий посмотрите у себя возможно, это и у вас есть :D

Просьба к другим: кто чего найдёт пишите сюда.

 

 

Добавлено в [mergetime]1099024337[/mergetime]

Косяк № раз.

Файл calendar.php

        $DB->query("SELECT * FROM ibf_calendar_events WHERE event_repeat=1
           AND ( repeat_unit IN ('w','m') OR (repeat_unit='y' AND month={$this->chosen_month}) )
           ");
        	 
       while ( $rec = $DB->fetch_row() )
       {
      	 $recurring[] = $rec;
       }

Здесь не учитывается что периодические события

1) могут быть частные по юзеру

2) могут быть ограниченные по группам

 

и в результате вы создаёте для себя лично напоминание ежемесячное например, а видят его все. ( http://forum.sources.ru/index.php?showtopic=70311 ;) )

Решение.

Добавить

if ( $rec['priv_event'] == 1 )
      	 {
         if ($ibforums->member['id'] != $rec['userid'])
         {
        	 continue;
         }
      	 }

if ( $rec['read_perms'] != '*' )
      	 {
         if ( !preg_match( "/(^|,)".$ibforums->member['mgroup']."(,|$)/", $rec['read_perms'] ) )
         {
        	 continue;
         }
      	 }

 

внутрь цикла перед

$recurring[] = $rec;

Ссылка на комментарий
Поделиться на других сайтах

Косяк №2

 

Отсутствие важнейших индексов

 

Таблица ibf_posts. Поля:

ip_address - когда ваш модератор будет искать сообщения какого-то пользователя по ИП адресу, ваш форум будет лежать и ждать пока закончится поиск

 

Таблица ibf_sessions. Поля

running_time

member_id

По ним производится выборка сессии.

 

Таблица ibf_members. Поле

ip_address.

 

Также ip_address во многих других таблицах.

Ссылка на комментарий
Поделиться на других сайтах

Косяк №3

 

В русской модиф 1.3 не работает повторный запрос кода авторизации при смене email в профиле.

Просто напросто разработчики забыли в этой части кода всего одну строчку - команду send_mail()

То же самое в версии 1.2 (точные параметры версии не помню), так что, возможно, это "глобальный" косяк.

 

Лекарство.

идем в sources/Register.php

ищем функцию revalidate_two()

там ищем "пункт"

else if ( $val['email_chg'] == 1 )

и в конце этого if-a ВМЕСТО

$this->email->to      = $email_one;

 

пишем

                        $this->email->to      = $member['email'];
                        $this->email->send_mail();

Ссылка на комментарий
Поделиться на других сайтах

ImUgh

пасиб. А откуда вообще взялась эта переменная $email_one? я даже в ф-ии её не нашёл.

 

Косяк №4.

 

Идём в Login.php, смотрим ф-ию:

    function markforum()

 

в ней запрос

        $DB->query("SELECT id, name, subwrap, parent_id FROM ibf_forums WHERE id=".$ibforums->input['f']);

Не знаю для чего разработчики перечислили столько параметров в запросе, потому как реально нужен только parent_id :D

По всему видно, что просто откуда-то скопировали (лень было набирать) и забыли убрать лишнее.

Ещё где-то подобное видел.

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Косяк №5.

Разработчики форума версии 1.3 для удаления юзера из админки выделили удаление в отдельную функцию, называется которая remove_member() из файл ad_massive.php,

в которой они забыли про добрую часть запросов по удалению, что привело к тому, что после удаления юзера из админки, он удаляется только из таблицы ibf_members и новый зарегистрировавшийся юзер, получив его id, обламывается зарегистрироваться в других таблицей с выдачей ошибки:

mySQL query error: INSERT INTO y_member_extra (id) VALUES (xxxxx) ** (см. ниже)

 

mySQL error: Duplicate entry 'xxxxx' for key 1

mySQL error code:

 

Решением данного глюка является добавление всех оставшихся запросов в эту функцию.

Добавьте туда после того бедненького одинокого запроса:

$DB->query("DELETE from ibf_members WHERE id='".$IN['mid']."'");

остальные:

// Convert their posts and topics into guest postings..

$DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id='".$IN['mid']."'");
 
$DB->query("UPDATE ibf_topics SET starter_id='0' WHERE starter_id='".$IN['mid']."'");

// Delete member...
 
$DB->query("DELETE from ibf_pfields_content WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_member_extra WHERE id='".$IN['mid']."'");
 
// Delete member messages...
 
$DB->query("DELETE from ibf_messages WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_contacts WHERE member_id='".$IN['mid']."' or contact_id='".$IN['mid']."'");
 
// Delete member subscriptions.
 
$DB->query("DELETE from ibf_tracker WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_forum_tracker WHERE member_id='".$IN['mid']."'");
$DB->query("DELETE from ibf_warn_logs WHERE wlog_mid='".$IN['mid']."'");
 
// Delete from validating..
 
$DB->query("DELETE FROM ibf_validating WHERE member_id='".$IN['mid']."'");

// Set the stats DB straight.
 
$DB->query("SELECT id, name FROM ibf_members WHERE mgroup <> '".$INFO['auth_group']."' ORDER BY joined DESC LIMIT 0,1");
 
$memb = $DB->fetch_row();
 
$DB->query("SELECT COUNT(id) as members from ibf_members WHERE mgroup <> '".$INFO['auth_group']."'");
$r = $DB->fetch_row();
// Remove "guest" account...
$r['members']--;
$r['members'] < 1 ? 0 : $r['members'];

$DB->query("UPDATE ibf_stats SET ".
           "MEM_COUNT={$r['members']}, ".
            "LAST_MEM_NAME='" . $memb['name'] . "', ".
           "LAST_MEM_ID='"   . $memb['id']   . "'");

 

В данное время (когда глюк уже имеет место быть) нужно удалаить запись с id=2 из таблицы ibf_member_extra вручную:

DELETE FROM ibf_member_extra WHERE id=xxxxx

где xxxxx - это id нового пользователя, вызвавшего ошибку (указано в скобках **)

Ссылка на комментарий
Поделиться на других сайтах

Косяк №6 с дополнительными полями при регистрации

 

Как мы знаем в создании доп. полей можно указать, чтобы это поле было обязательным (freq=1), включалось (fshowreg=1) в форму регистрации.

Имеет место быть такой косяк: ставим, что поле обязательное, но, чтобы не включалось в регистрационное форму.

И получаем: на экране регистрации поле не включается, поэтому юзер его заполнить не может.

Однако при проверке оно проверяется (т.к. оно freq=1) и форум пишет "Не все поля заполнены, повторите попытку).

 

Исправление. Файл Register.php:

Находим

$custom_fields = array();

$DB->query("SELECT * FROM ibf_pfields_data");

и меняем на

	$custom_fields = array();
$DB->query("SELECT * FROM ibf_pfields_data WHERE fshowreg=1");

Ссылка на комментарий
Поделиться на других сайтах

Косяк №7 при разрешении постов из премодерации.

 

При разрешении поста из премодерации, как мы знаем, пост участника становится видным всем участниками. Кроме того, если в данном разделе включен счётчик сообщений то он наращивается.

При этом, если группа у участника, чей пост наращивается, имеет g_promotion, т.е. группу, на которую происходит переключения после определённого поста, и этот определённый пост - это как раз тот, после которого производится переключением, имеет место глюк со следующим после этого юзера юзером. У него группа поменяется на такую же, хотя он вовсе может этого не заслуживать.

Кусок кода:

    $loopy_loo = $DB->query("SELECT id, mgroup, posts, disable_group FROM ibf_members

        WHERE id IN ($mstring)");

   

    while ( $member = $DB->fetch_row($loopy_loo) )

    {

 

    //-----------------------------------

    // Are we auto_promoting?

    //-----------------------------------

   

    if ( $groups[ $member['mgroup'] ]['g_promotion'] != '-1&-1' )

    {

      list($gid, $gposts) = explode( '&', $groups[ $member['mgroup'] ]['g_promotion'] );

     

      if ( $gid > 0 and $gposts > 0 )

      {

      if ( $member['posts'] + 1 >= $gposts )

      {

     

$mgroup = "mgroup='$gid', "; // <--- Назначается группа на которую переключаем

       

        if ( USE_MODULES == 1 )

        {

        $this->modules->register_class(&$class);

        $this->modules->on_group_change($ibforums->member['id'], $gid);

        }

      }

      }

    }

// для последующего после юзера после переключения предыдущего переменная $mgroup сброшена не будет и он и все остальные также будут переведены в "крутую" группу

   

    $newbie = $DB->query("UPDATE ibf_members SET ".$mgroup."posts=posts+1 WHERE id={$member['id']}");

 

Решение: внутрь цикла после

    while ( $member = $DB->fetch_row($loopy_loo) )

    {

вставляем очистку переменной:

				
			$loopy_loo = $DB->query("SELECT id, mgroup, posts, disable_group FROM ibf_members 
						 WHERE id IN ($mstring)");

			while ( $member = $DB->fetch_row($loopy_loo) )
			{
				$mgroup = "";

				//-----------------------------------
				// Are we auto_promoting?
				//-----------------------------------

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Косяк №8 при отображении администрации форума.

Файл misc/stat.php

Запрос:

//--------------------------------------------

    // Do we have any moderators?.

    //--------------------------------------------

   

    $DB->query("SELECT m.id, m.name, m.email, m.hide_email, m.location, m.aim_name, m.icq_number,

                        f.id as forum_id, f.read_perms, f.name as forum_name, c.state

                FROM ibf_members m, ibf_categories c

                  LEFT JOIN ibf_moderators mod ON((m.id=mod.member_id or (mod.is_group=1 and mod.group_id=m.mgroup)))

                  LEFT JOIN ibf_forums f ON(f.id=mod.forum_id)

                WHERE c.id=f.category AND c.state != 0");

 

В версиях форума старше 1.2 этот запрос может быть немного другим, но смысл проблемы заключается в выделенных строчках. В версиях 1.3.х также применён алиас mod.

При переходе на MySQL версии 4.х (или он у вас стоит если изначально) этот запрос будет выдавать ошибку, т.к. в MySQL версии 4.х появилась функция MOD (получение остатка от деления) и MySQL будет трактовать алиас mod как функцию.

 

Решение: поменять все выделеенные алиасы на другие уникальные алиасы, которых нет в этом запросе, например md:

//--------------------------------------------

    // Do we have any moderators?.

    //--------------------------------------------

   

    $DB->query("SELECT m.id, m.name, m.email, m.hide_email, m.location, m.aim_name, m.icq_number,

                        f.id as forum_id, f.read_perms, f.name as forum_name, c.state

                FROM ibf_members m, ibf_categories c

                  LEFT JOIN ibf_moderators md ON((m.id=md.member_id or (md.is_group=1 and md.group_id=m.mgroup)))

                  LEFT JOIN ibf_forums f ON(f.id=md.forum_id)

                WHERE c.id=f.category AND c.state != 0");

Изменено пользователем Song
Ссылка на комментарий
Поделиться на других сайтах

Косяк №9 при голосовании.

Если у участника форума есть маска доступа к разделу, но нет маски отвечать или начинать темы, он всё-равно может голосовать в голосованиях в этом разделе.

 

Файл lib/add_poll.php

 

Найти строки

     $DB->query("SELECT f.allow_pollbump, t.*, p.pid as poll_id,p.choices,p.starter_id,p.votes from ibf_polls p, ibf_topics t, ibf_forums f WHERE t.tid='".$ibforums->input['t']."' and p.tid=t.tid and t.forum_id=f.id");
     
     $this->topic = $DB->fetch_row();

 

изменить на

     $DB->query("SELECT f.allow_pollbump, f.reply_perms, t.*, p.pid as poll_id,p.choices,p.starter_id,p.votes from ibf_polls p, ibf_topics t, ibf_forums f WHERE t.tid='".$ibforums->input['t']."' and p.tid=t.tid and t.forum_id=f.id");

    

     $this->topic = $DB->fetch_row();

 

  if ( $std->check_perms($this->topic['reply_perms']) == FALSE )

  {

   $std->Error( array( LEVEL => 1, MSG => 'no_permission') );

  }

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...

Косяк №10, опять индекса

В таблицах ibf_tracker и ibf_forum_tracker

отсутствуют важнейшие индекса, отсутствие которых приводит к перебору все таблицы подписок на топики и форумы при каждом посте.

Чтобы ускорить работу MySQL'я, выполните следующие запросы:

ALTER TABLE ibf_tracker ADD INDEX (member_id), ADD INDEX(topic_id)
ALTER TABLE ibf_forum_tracker ADD INDEX (member_id), ADD INDEX (forum_id)

Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...

Косяк № 11 при запросе категории.

 

При запросе какой-то определённой категории форум обращается ко всей таблице ibf_forums дабы достать все разделы, вместо того, чтобы просто достать только те разделы, которые относятся к данной категории.

Дело в том, что при сборе данных со всей таблицы ibf_forums, форум не использует индекса. А если запрашивать только разделы определённой категории будет использован PRIMARY индекс таблиц ibf_forums и ibf_categories.

Таким образом, при запросе разделов, принадлежащих только одной конкретной категории мы будем иметь выйгрыш в скорости и в какой-то мере возможно снизим нагрузку на БД.

 

О том как это сделать:

 

Найдите в Boards.php

$DB->query("SELECT f.*, c.id as cat_id, c.position as cat_position....

Вставьте перед ним строки:

        if ( $ibforums->input['c'] ) $ibforums->input['c'] = intval($ibforums->input['c']);

$cat = ( $ibforums->input['c'] ) ? " and c.id='".$ibforums->input['c']."'" : "";

Чуть ниже находим

WHERE c.id=f.category
и исправляем на

WHERE c.id=f.category{$cat}

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Косяк №12.

Индекса в таблице ibf_contacts.

Как выяснилось таблица почти не индексирована. И БД перебирает её при работе с личными сообщениями например.

Чтобы добавить индекс выполните следующий запрос:

ALTER TABLE ibf_contacts ADD INDEX member_id (member_id, contact_id)

Ссылка на комментарий
Поделиться на других сайтах

house

Косяк №5.

Разработчики форума версии 1.3 для удаления юзера из

Добавлено в [mergetime]1110207920[/mergetime]

Косяк №13.

Аналогично косяку №5 (функция удаления одиночного аккаунта) также недобросовестно написана фукнция удаления многих юзеров. Не все данные удаляются и при регистрации выводится ошибка дублирования PRIMARY ключа.

 

Заменить функцию doprune() из файла ad_member.php на:

 

function doprune() {
global $IN, $INFO, $DB, $SKIN, $ADMIN, $std, $MEMBER, $GROUP;

//-----------------------------
// Make sure we have *something*
//------------------------------

$query = trim(urldecode($std->txt_stripslashes($IN['query'])));

$query = str_replace( "<", "<", $query );
$query = str_replace( ">", ">", $query );

if ($query == "")
{
 $ADMIN->error("Ошибка запроса удаления. Нет запроса на удаление.");
}

//-----------------------------
// Get the member ids...
//------------------------------

$ids = array();

$DB->query("SELECT id FROM ibf_members WHERE ".$query);

if ( $DB->get_num_rows() )
{
 while ($i = $DB->fetch_row())
 {
  $ids[] = $i['id'];
 }
}
else
{
 $ADMIN->error("Не найдено ни одного пользователя, соответствующего введённым критериям.");
}

$id_string = implode( "," , $ids );

$id_count = count($ids);

// Convert their posts and topics into guest postings..

$DB->query("UPDATE ibf_posts SET author_id='0' WHERE author_id IN(".$id_string.")");

$DB->query("UPDATE ibf_topics SET starter_id='0' WHERE starter_id IN(".$id_string.")");

// Delete member...

$DB->query("DELETE from ibf_members WHERE id IN(".$id_string.")");

$DB->query("DELETE from ibf_pfields_content WHERE member_id IN(".$id_string.")");

$DB->query("DELETE from ibf_member_extra WHERE id IN(".$id_string.")");
// Delete member messages...

$DB->query("DELETE from ibf_messages WHERE member_id IN (".$id_string.")");
$DB->query("DELETE from ibf_contacts WHERE member_id IN (".$id_string.") or contact_id IN (".$id_string.")");

// Delete member subscriptions.

$DB->query("DELETE from ibf_tracker WHERE member_id IN (".$id_string.")");
$DB->query("DELETE from ibf_forum_tracker WHERE member_id IN (".$id_string.")");
$DB->query("DELETE from ibf_warn_logs WHERE wlog_mid IN (".$id_string.")");

// Delete from validating..

$DB->query("DELETE FROM ibf_validating WHERE member_id IN (".$id_string.")");

// Set the stats DB straight.

$DB->query("SELECT id, name FROM ibf_members WHERE mgroup <> '".$INFO['auth_group']."' ORDER BY joined DESC LIMIT 0,1");

$memb = $DB->fetch_row();

$DB->query("SELECT COUNT(id) as members from ibf_members WHERE mgroup <> '".$INFO['auth_group']."'");
$r = $DB->fetch_row();
// Remove "guest" account...
$r['members']--;
$r['members'] < 1 ? 0 : $r['members'];

$DB->query("UPDATE ibf_stats SET ".
              "MEM_COUNT={$r['members']}, ".
              "LAST_MEM_NAME='" . $memb['name'] . "', ".
              "LAST_MEM_ID='"   . $memb['id']   . "'");
              
// Blow me melon farmer

$ADMIN->save_log("Удаление $id_count пользователей");

if ( USE_MODULES == 1 )
{
 $this->modules->register_class(&$this);
 $this->modules->on_delete($ids);
}

$ADMIN->done_screen("Пользователи удалены", "Управление пользователями", "act=mem&code=edit" );

}

Ссылка на комментарий
Поделиться на других сайтах

Косяк №14

 

в регулярном выражении "чистки" $HTTP_POST_VARS.

При употреблении в посте строки угл.скобкаSCRIPTугл. скобка она заменяется в маленький регистр, хотя совершенно голословно, постивший этого не заказывал.

Тест на данном форуме: <script> (при оформлении поста писалось большими буквами).

Не совсем правильно написано регулярное выражение.

Вообще оно даже не совсем нужно и оставлено в целях ещё одной проверки для безопасности, дабы не допустить постинг пользовательских скриптов. Как говорится "на всякий случай".

 

Файл functions.php

 

Находим функцию clean_value($val)

В ней находим строчку

     $val = preg_replace( "/<script/i"  , " 60;script"   , $val );

и заменяем на

$val = preg_replace( "/<(script)/i"  , " 60;\\1"   , $val );

 

Примечание: " 60;" пробела быть не должно.

 

Добавлено в [mergetime]1110391766[/mergetime]

ну как я и говорил :D

здесь тоже этот "баг" есть.

Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Косяк №15

 

с фантастикой в коде.

Файлы post_reply_post.php, post_q_reply_post.php

 

Находим кодим:

  if ($this->topic['poll_state'] == 'closed' and $ibforums->member['g_is_supadmin'] != 1)
 {
	 $std->Error( array( LEVEL => 1, MSG => 'no_replies') );
 }

 

Вообще очень интересно, что такое g_is_supadmin.

Это вообще неизвестный мне зверь :D

Поэтому этот кусок нужно немного видоизменить на такой:

  if ( !$this->topic['approved'] or $this->topic['poll_state'] == 'closed' )
 {
	 $std->Error( array( LEVEL => 1, MSG => 'no_replies') );
 }

 

наверно всё же это задумывалось, чтобы оставить лазейку для ответов в закрытые голосования главным модераторам, но

1) ошиблись в написании

2) и мы не будем им давать спуску ;)

Ссылка на комментарий
Поделиться на других сайтах

Косяк №16

 

Когда удаляем пользователя - удаляем его ПМ-ки, НО не удаляются те ПМ-ки которые он отправлял. Все хорошо, но ПМ-ки удаленных пользователей не отображаются, и пишет не точное количество отображаемых ПМ-ок. В результате ПМ-ки теряются и никто их не удалит и не просмотрит... (там дело в том что делается взаимное соответствие между ПМ-кой и отправителем, а не сначала берем ПМ-ку а потом достаем инфу об отправителе)

 

 

Решение. Файл messenger.php

 

Вариант 1: (Song)

 

if ($this->vid == 'sent')
               {
                       $ibforums->lang['message_from'] = $ibforums->lang['message_to'];

                       $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m, ibf_members mp WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' and mp.id=m.recipient_id ORDER BY $sort_key LIMIT $start, $p_end");

               }
               else
               {
                       $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m, ibf_members mp WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' and mp.id=m.from_id ORDER BY $sort_key LIMIT $start, $p_end");
               }

 

на

if ( $this->vid == 'sent' )
		{
			$ibforums->lang['message_from'] = $ibforums->lang['message_to'];

			$DB->query("SELECT m.*, IFNULL(mp.name,'Unknown member') as from_name FROM ibf_messages m 
			    LEFT JOIN ibf_members mp ON (mp.id=m.recipient_id) 
			    WHERE m.member_id='".$this->member['id']."' AND m.vid='".$this->vid."'
			    ORDER BY $sort_key LIMIT $start, $p_end");
		} else
		{
			$DB->query("SELECT m.*, IFNULL(mp.name,'Unknown member') as from_name FROM ibf_messages m 
			    LEFT JOIN ibf_members mp ON (mp.id=m.from_id) 
			    WHERE m.member_id='".$this->member['id']."' AND m.vid='".$this->vid."'
			    ORDER BY $sort_key LIMIT $start, $p_end");
		}

 

Вариант 2: (Hostem)

 

Заменить это:

                 if ($this->vid == 'sent')
                {
                        $ibforums->lang['message_from'] = $ibforums->lang['message_to'];

                        $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m, ibf_members mp WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' and mp.id=m.recipient_id ORDER BY $sort_key LIMIT $start, $p_end");

                }
                else
                {
                        $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m, ibf_members mp WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' and mp.id=m.from_id ORDER BY $sort_key LIMIT $start, $p_end");
                }

 

На это:

                 
                if ($this->vid == 'sent')
                {
                        $ibforums->lang['message_from'] = $ibforums->lang['message_to'];

                        $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m LEFT JOIN ibf_members mp ON (mp.id=m.recipient_id) WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' ORDER BY $sort_key LIMIT $start, $p_end");

                }
                else
                {
                        $DB->query("SELECT m.*, mp.name as from_name FROM ibf_messages m LEFT JOIN ibf_members mp ON (mp.id=m.from_id) WHERE member_id='".$this->member['id']."' AND vid='".$this->vid."' ORDER BY $sort_key LIMIT $start, $p_end");
                }

 

Ищем (чуть ниже предыдущего кода):

                                 if ($this->vid != 'sent')
                                {
                                        $row['add_to_contacts'] = "[ <a href='{$ibforums->base_url}act=Msg&CODE=02&MID={$row['from_id']}'>{$ibforums->lang[add_to_book]}</a> ]";
                                }
                                else
                                {
                                        $row['from_id'] = $row['recipient_id'];
                                }

 

Добавляем после:

                        
                                 if (!$row['from_name'])
                                {
                                   $row['from_name']="Unknown User";
                                   $row['add_to_contacts']="";
                                }

 

В результате ПМ-ка будет отображаться, а в поле "Отправитель" будет написано "Unknown User" без ссылки добавить в контакты.

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...

Косяк №17

файл Topics.php

 

Это я вообще кроме как бредом (то что здесь написано) назвать не могу:

  if ( ! $DB->get_num_rows() )
 {
	 if ($first >= $ibforums->vars['display_max_posts'])
	 {
   // Get the correct number of replies...
   
   $newq = $DB->query("SELECT COUNT(pid) as pcount FROM ibf_posts p, ibf_members m WHERE p.topic_id=".$this->topic['tid']." and p.queued !=1 AND p.author_id=m.id");
   $pcount = $DB->fetch_row($newq);
   
   $pcount['pcount'] = $pcount['pcount'] > 0 ? $pcount['pcount'] - 1 : 0;
   
   // Update the post table...
   
   if ($pcount['pcount'] > 1)
   {
  	 $DB->query("UPDATE ibf_topics SET posts=".$pcount['pcount']." WHERE tid='".$this->topic['tid']."'");
   }
   
   $std->boink_it($ibforums->base_url."act=ST&f={$this->forum['id']}&t={$this->topic['tid']}&view=getlastpost");
   exit();
	 }
 }

 

Этот кусок кода надо заменить на

	if ( !$DB->get_num_rows() and $this->first >= $ibforums->vars['display_max_posts'] )
{
 $DB->query("SELECT COUNT(pid) as pcount FROM ibf_posts WHERE topic_id='".$this->topic['tid']."' and queued != 1");

 $pcount = $DB->fetch_row();

 $pcount['pcount'] = ( $pcount['pcount'] ) ? $pcount['pcount'] - 1 : 0;
	 
 $DB->query("UPDATE ibf_topics SET posts='".$pcount['pcount']."' WHERE tid='".$this->topic['tid']."'");

 $std->boink_it($ibforums->base_url."showtopic=".$this->topic['tid']."&view=getlastpost");

 exit();
}

 

Сей глюк проявляется в том, что безпричинно пропадают страницы в топике, хотя на самом деле в БД посты присутствуют. "Портится" поле posts в таблице ibf_topics.

Ссылка на комментарий
Поделиться на других сайтах

Косяк №18

 

В админке ipb 1.3 редактирование шаблонов.

 

Апострофы там экранируются с помощью str_replace("'","\'",...); но если в шаблоне написать что-то вроде

var test = 't\'est';

то вылезет ошибка sql. Если же

var test = 't\\'est';

— то всё работает как и задумано.

 

Фиксим :D

Открываем sources/Admin/ad_templates.php.

 

Ищем:

  //+-------------------------------
 // Process my bits :o
 //+-------------------------------
 
 foreach( $ids as $id )
 {
 
	 $text = stripslashes($HTTP_POST_VARS['txt_'.$id]);
 
	 //+-------------------------------
	 // Sw(o|a)p back < & >
	 //+-------------------------------
	 
	 $text = preg_replace("/</", "<", $text);
	 $text = preg_replace("/>/", ">", $text);
	 $text = preg_replace("/&/", "&", $text);
	 
	 $text = str_replace( '\\n' , '\\\\\\n', $text );
	 
	 //+-------------------------------
	 // Convert \r to nowt
	 //+-------------------------------
	 
	 $text = preg_replace("/\r/", "", $text);
	 
	 $text = $this->unconvert_tags($text);
	 
	 //+-------------------------------
	 // Update the DB
	 //+-------------------------------
	 
	 $string = $DB->compile_db_update_string( array (
               'section_content' => $text,
               'updated'         => time(),
              )       );
	 
	 $DB->query("UPDATE ibf_skin_templates SET $string WHERE suid=$id");
 
 }

заменяем на:

  //+-------------------------------
 // Process my bits :o
 //+-------------------------------
 
 foreach( $ids as $id )
 {
 
	 $text = stripslashes($HTTP_POST_VARS['txt_'.$id]);
 
	 //+-------------------------------
	 // Sw(o|a)p back < & >
	 //+-------------------------------
	 
	 $text = preg_replace("/</", "<", $text);
	 $text = preg_replace("/>/", ">", $text);
	 $text = preg_replace("/&/", "&", $text);
	 
	 $text = str_replace( '\\n' , '\\\\\\n', $text );
	 
	 //+-------------------------------
	 // Convert \r to nowt
	 //+-------------------------------
	 
	 $text = preg_replace("/\r/", "", $text);
	 
	 $text = $this->unconvert_tags($text);
	 
	 //+-------------------------------
	 // Update the DB
	 //+-------------------------------
	 
	 $string = $DB->compile_db_update_string( array (
               'section_content' => str_replace("\'","'",mysql_escape_string($text)),
               'updated'         => time(),
              )       );
	 
	 $DB->query("UPDATE ibf_skin_templates SET $string WHERE suid=$id");
 
 }

Ссылка на комментарий
Поделиться на других сайтах

  • 4 недели спустя...

Косяк №19

 

NvG:

 

Поиском вроде не нашел, если не так, удалите пост

 

Вчера в очередной раз оптимизировал запросы и вышел на запрос, выдающий кол-во сообщений в темах с последнего визита

SELECT COUNT(DISTINCT(p.pid)) as posts, COUNT(DISTINCT(p.topic_id)) as topics FROM ibf_posts p WHERE p.post_date > 'NNNNNNNN' AND queued <> 1 AND forum_id IN ( 0,1,2,3,4,5,6,7,9,8,10,NN)

, который обрабатывался непозволительно долго - на локальной тачке время рендеринга страницы было до 3х секунд(после комментирования оного страница обрабатывалась 0,2 с.)

 

В итоге выяснилось, что проверка p.post_date > 'NNNNNNN' вызывает эти тормоза. В таблице присутствовал индекс forum_id (forum_id , post_date), но видать такого мало. После создания отдельного индекса по post_date

ALTER TABLE `ibf_posts` ADD INDEX ( `post_date` )

все нормализовалось ;)

 

Song, Hostem:

 

Также индекса и структура таблиц.

 

ibf_voters:

 

Поле member_id типа varchar(32), а не int!

 

+ только один индекс, хотя запросы делаются так:

SELECT member_id from ibf_voters WHERE member_id=2461 and tid=990

 

Добавить индекс и сменить тип поля:

ALTER TABLE ibf_voters MODIFY member_id mediumint(8) unsigned NOT NULL default 0, ADD INDEX (tid, member_id)

 

ibf_polls:

 

ALTER TABLE ibf_polls ADD UNIQUE KEY (tid)

 

ibf_topics:

ALTER TABLE ibf_topics DROP COLUMN rating, DROP COLUMN total_votes

Вот с полем типа TEXT они просчитались :) Это же не VARCHAR

Висит в таблице и не используется :)

 

ibf_members:

ALTER TABLE ibf_members DROP COLUMN misc

Правда, у себя я его не нашёл, видимо давно грохнул.

 

ibf_posts:

Ещё есть одно бесполезное поле в ibf_posts:

ALTER TABLE ibf_posts DROP COLUMN post_title

 

ibf_admin_sessions

С варчарами-то, оказалось, беда :D

Ещё некоторые запросы:

ALTER TABLE ibf_admin_sessions MODIFY MEMBER_ID mediumint(8) unsigned NOT NULL default 0

 

ibf_categories:

ALTER TABLE ibf_categories MODIFY state TINYINT(1) unsigned NOT NULL default 0

 

ibf_forumtracker:

ALTER TABLE ibf_forum_tracker MODIFY member_id mediumint(8) unsigned NOT NULL default 0

 

ibf_forums:

ALTER TABLE ibf_forums MODIFY status TINYINT(1) unsigned NOT NULL default 0

 

ibf_members:

ALTER TABLE ibf_members MODIFY hide_email TINYINT(1) unsigned NOT NULL default 0

 

Запросы по индексам:

-- лишний индекс:
ALTER TABLE ibf_forums DROP INDEX id

-- если смайлов много, может помочь:
ALTER TABLE ibf_emoticons ADD INDEX (clickable)

-- убыстрение функции "Слежение за письмами"
ALTER TABLE ibf_messages ADD INDEX (from_id)

 

Не говоря уж о том, что в ibf_posts почти все поля NULL, хотя должны быть NOT NULL default 0.

Но это я уже давно исправил, не помню запросы.

Изменено пользователем Song
Ссылка на комментарий
Поделиться на других сайтах

  • 1 месяц спустя...

Косяк №20

 

При отмене постов, находящихся на премодерации, в которых есть прикреплённые файлы, последние не удаляются.

 

Файл mod_cp.php

 

В функции

function domod_topics()

находим

  if ( count($delete_ids) > 0 )
 {
	 // Sort out the approved bit
	 
	 $tids = implode( ",", $delete_ids );
	 // Delete 'dem postings
	 
	 $DB->query("DELETE FROM ibf_topics WHERE tid IN ($tids)");
	 
	 $DB->query("DELETE FROM ibf_posts WHERE topic_id IN ($tids)");
	 
	 
 }

заменяем на

  if ( count($delete_ids) > 0 )
 {
	 $tids = implode(",", $delete_ids);
	 
	 //------------------------------------
	 // Remove the topics
	 //------------------------------------

	 $DB->query("DELETE FROM ibf_topics WHERE tid IN (".$tids.")");
	 
	 //------------------------------------
	 // Remove the attachments
	 //------------------------------------

	 $DB->query("SELECT pid, attach_id FROM ibf_posts WHERE topic_id IN (".$tids.") and attach_id != ''");

	 if ( $DB->get_num_rows() )
	 {
   while ( $r = $DB->fetch_row() )
   {
  	 if ( is_file($this->upload_dir."/".$r['attach_id']) )
  	 {
     @unlink($this->upload_dir."/".$r['attach_id']);
  	 }
   }
	 }

	 //------------------------------------
	 // Remove the posts
	 //------------------------------------

	 $DB->query("DELETE FROM ibf_posts WHERE topic_id IN (".$tids.")");

 }

 

В функции

function mod_domodposts()

 

Находим

  if ( count($delete_ids) > 0 )
 {
	 // Sort out the approved bit
	 
	 $pids = implode( ",", $delete_ids );
	 
	 // Delete 'dem postings
	 
	 $DB->query("DELETE FROM ibf_posts WHERE pid IN ($pids)");
	 
 }

и заменяем на

  if ( count($delete_ids) > 0 )
 {
	 // Sort out the approved bit
	 
	 $pids = implode(",", $delete_ids);
	 
	 $DB->query("SELECT attach_id FROM ibf_posts WHERE pid IN (".$pids.") and attach_id != ''");

	 if ( $DB->get_num_rows() )
	 {
   while ( $r = $DB->fetch_row() )
   {
  	 if ( is_file($this->upload_dir."/".$r['attach_id']) )
  	 {
     @unlink($this->upload_dir."/".$r['attach_id']);
  	 }
   }
	 }

	 // Delete 'dem postings
	 $DB->query("DELETE FROM ibf_posts WHERE pid IN (".$pids.")");

 }

Ссылка на комментарий
Поделиться на других сайтах

  • 3 недели спустя...

при просмотре топика в FF 1.0.6 (win) в JS косоли выдаёт:

Error: event is not defined

Source File: http://crimea-board.net/html/UBBC/ubbc.js Line: 430

там соотвественно:

/////////////////////////////
// Access Keys
//
 var keys = new Array('b','i','u','s','g','q','m','h','e','l','k');
 function checkKey() {
   if (event.ctrlKey) {
     for (i = 0; i < keys.length; i++) {
       if (String.fromCharCode(event.keyCode) == keys[i].toUpperCase()) {
         var found = keys[i]; break;
       }
     }
...

а надо скорее всего так:

/////////////////////////////
// Access Keys
//
 var keys = new Array('b','i','u','s','g','q','m','h','e','l','k');
 function checkKey(e) {
   if(!e){ e = window.event };
   if (e.ctrlKey) {
     for (i = 0; i < keys.length; i++) {
       if (String.fromCharCode(e.keyCode) == keys[i].toUpperCase()) {
         var found = keys[i]; break;
       }
     }
...

 

прав или не прав, бить или не бить ?

Ссылка на комментарий
Поделиться на других сайтах

  • 2 месяца спустя...

Song

Что-то не нашёл у себя файла ad_massive.php из косяка №5. Это откуда*? У меня 1.3

 

 

К пачке исправлений из Косяка №19

ibf_members:

 

ALTER TABLE ibf_members DROP COLUMN misc

 

Правда, у себя я его не нашёл, видимо давно грохнул.

 

А почему тогда идёт обращение к ней в базе при попытке залогиниться?

Соответственно выдаёт ошибку

 

mySQL query error: SELECT id, name, password, misc FROM ibf_members WHERE LOWER(name)='Логин-нейм'

 

mySQL error:

mySQL error code:

 

ibf_forums:

 

ALTER TABLE ibf_forums MODIFY status TINYINT(1) unsigned NOT NULL default 0

Сделав по рекомендации, все форумы приобрели статус "только чтение", причём обычным способом из админки вернуть их не удалось.

 

По умолчанию там стояло `status` varchar(10) default NULL всё было ок.

 

ibf_topics:

 

ALTER TABLE ibf_topics DROP COLUMN rating, DROP COLUMN total_votes

 

Вот с полем типа TEXT они просчитались  Это же не VARCHAR

Висит в таблице и не используется

На моём форуме видимо используется =)

 

mySQL query error: UPDATE ibf_topics SET poll_state='', last_vote='', total_votes='' WHERE tid='1029'

 

mySQL error: Unknown column 'total_votes' in 'field list'

mySQL error code:

Date:

 

ALTER TABLE `ibf_posts` ADD INDEX ( `post_date` )

 

все нормализовалось

и др. запросы к ibf_posts.

Было бы неплохо сразу предупредить, что если ibf_posts большой (у меня 35 метров) ждать придётся до зелёных веников.

(Думал что сглючило, запустил его три раза подряд)

Ссылка на комментарий
Поделиться на других сайтах

Что-то не нашёл у себя файла ad_massive.php из косяка №5. Это откуда*? У меня 1.3

У меня тоже нет.

В разных модификациях видимо по-разному.

Вероятно в 1.3.1 от Игорька.

 

А почему тогда идёт обращение к ней в базе при попытке залогиниться?

вообще перый раз слышу про такой запрос.

Просьба: посмотри дальше по тексту где-нить оно ещё используется или нет? Если нет, то смело удаляй из таблицы и из исходника.

 

Сделав по рекомендации, все форумы приобрели статус "только чтение", причём обычным способом из админки вернуть их не удалось.

По умолчанию там стояло `status` varchar(10) default NULL всё было ок.

 

ничего страшного.

Сделай

UPDATE ibf_forums SET status=1

 

На моём форуме видимо используется =)

это на моём форуме тоже есть.

Но это "использование" этим и ограничивается.

Убери из исходника эти ненужные запросы.

 

Было бы неплохо сразу предупредить, что если ibf_posts большой (у меня 35 метров)

ну эт разве большой :D

Ссылка на комментарий
Поделиться на других сайтах

  • 2 недели спустя...
Было бы неплохо сразу предупредить, что если ibf_posts большой (у меня 35 метров) ждать придётся до зелёных веников.

(Думал что сглючило, запустил его три раза подряд)

 

640 Mb - это большой, а у вас боюсь действительно сглючило.

 

Просьба:

 

Можно помечать в будущем для какой версии форума или хотя бы на какой версии форума все пробовалось ? Зная, конечно что товарищ Song в основном работает с 1.2-1.3 пришлось все равно сверять почти все совету в ветке на предмет совместимости или похожести на 2.0.х ...

 

оч. не удобно, но в целом многие вещи, особенно с оптимизацией БД и индексами подходят и для двойки

Ссылка на комментарий
Поделиться на других сайтах

Можно помечать в будущем для какой версии форума или хотя бы на какой версии форума все пробовалось ? Зная, конечно что товарищ Song в основном работает с 1.2-1.3 пришлось все равно сверять почти все совету в ветке на предмет совместимости или похожести на 2.0.х ...

 

Название темы прочитай !!!

Ссылка на комментарий
Поделиться на других сайтах

Присоединиться к обсуждению

Вы можете ответить сейчас, а зарегистрироваться позже. Если у вас уже есть аккаунт, войдите, чтобы ответить от своего имени.

Гость
Ответить в этой теме...

×   Вы вставили отформатированный текст.   Удалить форматирование

  Допустимо не более 75 смайлов.

×   Ваша ссылка была автоматически заменена на медиа-контент.   Отображать как ссылку

×   Ваши публикации восстановлены.   Очистить редактор

×   Вы не можете вставить изображения напрямую. Загрузите или вставьте изображения по ссылке.

Зарузка...
×
×
  • Создать...

Важная информация

Находясь на нашем сайте, вы соглашаетесь на использование файлов cookie, а также с нашим положением о конфиденциальности Политика конфиденциальности и пользовательским соглашением Условия использования.