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

Для тех, у кого личных сообщений -X


Master

Вопрос

Временно прикрепляю тему, так как баг у всех в 2.2.2 версии.

Выполнить sql запрос:

ALTER  TABLE  `ibf_members`  CHANGE `new_msg`  `new_msg` TINYINT( 2  )  UNSIGNED NULL DEFAULT  '0';

 

 

Архар . 6.12.2007

В версии 2.2.2 после установки этого фикса при выполнении действий в последовательности, указанной в сообщении

http://www.ibresource.ru/forums/index.php?...st&p=300053

проскакивает число "255 сообщений". Почему это происходит, сказано здесь: http://www.ibresource.ru/forums/index.php?...st&p=300034

 

Решение.

./sources/lib/func_msg.php

найти

	 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid}" ) );
 			$this->ipsclass->DB->simple_exec();

заменить на

	 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid} AND new_msg>0" ) );
 			$this->ipsclass->DB->simple_exec();

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

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

  • 0
Временно прикрепляю тему, так как баг у всех в 2.2.2 версии.

Выполнить sql запрос:

ALTER  TABLE  `ibf_members`  CHANGE `new_msg`  `new_msg` TINYINT( 2  )  UNSIGNED NULL DEFAULT  '0';

 

Запрос прошёл успешно, но теперь когда удаляешь не прочитанное сообщение новых сообщений 255

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

  • 0
Временно прикрепляю тему, так как баг у всех в 2.2.2 версии.

Выполнить sql запрос:

ALTER  TABLE  `ibf_members`  CHANGE `new_msg`  `new_msg` TINYINT( 2  )  UNSIGNED NULL DEFAULT  '0';

 

Здравствуйте, у меня такой вопрос, выполнил SQL запрос, теперь у пользователей иногда появляется 255 сообщений, вопрос: это нормально ?

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

  • 0

помогите

Временно прикрепляю тему, так как баг у всех в 2.2.2 версии.

Выполнить sql запрос:

ALTER  TABLE  `ibf_members`  CHANGE `new_msg`  `new_msg` TINYINT( 2  )  UNSIGNED NULL DEFAULT  '0';

не помогает сообшения всё рввно не отпраляются

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

  • 0

выше уже написали почему.

Или потому что у кого-то было отрицительное число или потому что было у кого-то больше 99 сообщений новых.

 

Сделайте

UPDATE ibf_members SET new_msg=0 WHERE new_msg < 0 or new_msg = 255

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

  • 0
А кто сказал что это помогает от белой страницы? Если белая страница в ПМ, то скорее всего недостаток памяти. смотрите тему в форуме FAQ про это.
Ссылка на комментарий
Поделиться на других сайтах

  • 0

Здравствуйте все!

В ручную эту ошибку с 255 править можно... Но, почему она возникает?

 

Вот структура:

new_msg   tinyint(3)   UNSIGNED   NULL = Да   Default = 0

 

А расклад стандартный:

 

У пользователя было 0 сообщений, пришло 1.

Пользователь удаляет его - сообщений 255.

Обновляет страницу - сообщений 0.

 

Никто не знает где копать? Я PHP знаю, так что достаточно сказать где искать...

Ибо в коде форума довольно сложно разбираться.

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

  • 0
сообщений 255

тут надо знать не пхп, а дополнительные коды, с помощью которых в машине идет представление отрицательных чисел

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

оно спасает от глюка "-1", но делает глюк "255"

 

почему так

потому знаковое отрицательное число -1 в машине представляется как

11111111 (это 1 байт - 8 бит)

если сделать инверсию этого числа получим

00000000

чтобы получить реальное число из дополнительного кода, надо к полученному прибавить 1

00000001

 

значит мы получили "-1"

 

но если мы зададим параметр unsigned

то

11111111 = 1*128+1*64+1*32+1*16+1*8+1*4+1*2+1*1=255

 

почему unsigned?

по правилу представления отрицательных чисел, если в самом левом бите еденица, то число отрицательное и компьютер переводит его из доп кода и мы видим -1

таким образом в 1 байте можно представить числа

либо от 0 до 255

либо от -128 до 127 (точно нижнюю границу не помню)

 

так почему 0 - 1 = 11111111 ?

потому что 11111111+1=100000000

а 9-ая 1 (первая слева) переходит в следующий байт

а в текущем остается 00000000 = 0

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

  • 0

Arhar, спасибо! По крайней мере теперь понятно из-за чего...

 

При удалении сообщения если их и так ноль из нуля вычитается единица.

Если в базе не указано "unsigned" то получается -1, если указано - 255.

Это получается из-за того что если перевести -1 из десятичной системы в бинарную получится 11111111, а при обратном переводе - 255.

 

В каком файле находятся функции работы с ПМ? Может перед тем как вычитать заставить его проверить что в базе не ноль...

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

  • 0

в принципе проблема появляется когда юзер удаляет сам свое сообщение? тогда решение можно попробовать такое

 

./sources/action_public/messenger.php

 

найти (в function delete)

 

 		//-----------------------------------------
		// Delete it from the DB
		//-----------------------------------------

		$this->msglib->delete_messages( $this->ipsclass->input['MSID'], $this->ipsclass->member['id'] );

		$this->msglib->rebuild_dir_count( $this->ipsclass->member['id'],
									  $this->ipsclass->member['vdirs'],
									  $this->lib->vid,
									  $this->ipsclass->member['dir_data'][ $this->lib->vid ]['count'] - 1,
									  'save',
									  "msg_total=msg_total-1"
									);

 

заменить на

 

 		//-----------------------------------------
		// Delete it from the DB
		//-----------------------------------------

		$this->msglib->delete_messages( $this->ipsclass->input['MSID'], $this->ipsclass->member['id'] );

	$extra = ($this->ipsclass->member['msg_total']-1<0)?"":"msg_total=msg_total-1";

		$this->msglib->rebuild_dir_count( $this->ipsclass->member['id'],
									  $this->ipsclass->member['vdirs'],
									  $this->lib->vid,
									  $this->ipsclass->member['dir_data'][ $this->lib->vid ]['count'] - 1,
									  'save',
									  $extra
									);

 

там еще есть одно место, где уменьшается счетчик, это при удалении с использованием "галочки"

надо найти способ имитировать эту ошибку, тогда можно точно будет установить ее источник

 

в том же файле найти

 					$this->msglib->rebuild_dir_count( $this->ipsclass->member['id'],
											   $this->ipsclass->member['vdirs'],
											   $this->lib->vid,
											   $this->ipsclass->member['dir_data'][ $this->lib->vid ]['count'] - $affected_ids,
											   'save',
											   "msg_total=msg_total-$affected_ids"
											 );

заменить на

					$extra = ($this->ipsclass->member['msg_total']-$affected_ids<0)?"msg_total=0":"msg_total=msg_total-$affected_ids";
					$this->msglib->rebuild_dir_count( $this->ipsclass->member['id'],
											   $this->ipsclass->member['vdirs'],
											   $this->lib->vid,
											   $this->ipsclass->member['dir_data'][ $this->lib->vid ]['count'] - $affected_ids,
											   'save',
											   $extra
											 );

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

  • 0

Мне пожаловался пользователь, сказал что "так и так", ошибку я повторил за пол минуты:

 

1. Личных сообщений: 0 - ссылка вверху страницы, нажал. (Папка с сообщениями пустая вобще)

 

2. Новое личное сообщение -> Написал письмо самому себе, текст банальное "123", заголовок - то же "123"

 

3. Отправил, дальше стандартная страница переадресации "Ваше сообщение с заголовком «123» успешно отправлено..."

 

4. Опять нахожусь в Личных Сообщениях. "Личных сообщений: 1"

Если сообщение сначала прочитать - почему-то ошибка не повторяется, или я не уловил связи.

 

5. Выделяю сообщение галочкой, жму кнопку "Удалить"

 

6. Страница обновляется и я вижу - пустая папка и текст вверху форума - "Личных сообщений: 255", обновляю страницу и всё нормально - "Личных сообщений: 0"

 

Затем создал ещё одного пользователя, отправил сообщение ему.

Начиная с пункта 5 всё повторяется. Я об ошибке, на в абсолютно новом форуме, и узнал потому что написал ЛС пользователю, и он сказал мне что вот такое дело.

 

Проверка поля msg_total не помогла... Да и почему msg_total? Не new_msg разве? Ведь вверху форума рядом со словами "Личных сообщений" указывается количество новых, а не всех?

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

  • 0

Версия форума - IPB 2.2.2, русский...

Нет, "Сохранить в отправленных" не стоит.

 

Если галочку поставить ошибка сохраняется... Более того - после удаления копии из "Отправленных" вместо 0 снова проскакивает 255.

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

  • 0

знаешь что попробуй

 

...

 

а, нет, вру

 

это я смотрю 231

 

5 сек

 

все равно никак не получается имитировать ошибку

 

такой вопрос

когда заходишь в папку с сообщениями, но не открываешь их, счетчик сбрасывается?

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

  • 0

давай в icq 253969361

 

пробуй

./sources/lib/func_msg.php

найти

	 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid}" ) );
 			$this->ipsclass->DB->simple_exec();

заменить

	 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid} AND new_msg-{$cnt}>=1" ) );
 			$this->ipsclass->DB->simple_exec();
 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=0, show_popup=0", 'where' => "id={$mid} AND new_msg-{$cnt}<1" ) );
 			$this->ipsclass->DB->simple_exec();

 

конечный вариант решения в первом сообщении темы

также если хотите, чтобы сообщение оставалось в статусе непрочитанного не до тех пор, пока откроется папка с новыми сообщениями, а до тех пор, пока не откроется само сообщение, в файле

./sources/action_public/messenger.php

найти и удалить/закомментировать

 		if ($this->ipsclass->member['current_id'] == 'in' and $this->ipsclass->member['new_msg'] > 0 )
		{
			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => 'new_msg=0', 'where' => 'id='.$this->ipsclass->member['id'] ) );
			$this->ipsclass->DB->simple_exec();
		}

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

  • 0
	 			$this->ipsclass->DB->simple_construct( array( 'update' => 'members', 'set' => "new_msg=new_msg-{$cnt}, show_popup=0", 'where' => "id={$mid} AND new_msg>0" ) );
 			$this->ipsclass->DB->simple_exec();

Тоже сначала так хотел сделать, потом подумал, что даже при new_msg>0 кол-во удаляемых непрочитанных сообщений ($cnt) может быть больше текущего new_msg и, опять же, такой запрос загонит его в минус :D

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

  • 0
Если ты выполнишь то что написано в начале топика то в минус не загонит никак.
Ссылка на комментарий
Поделиться на других сайтах

Гость
Эта тема закрыта для публикации сообщений.
×
×
  • Создать...

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

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