Перейти к содержимому


Фотография

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

Форумы IBResource

  • Закрытая тема Тема закрыта
Сообщений в теме: 52
Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

сообщений 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

WARpholomey
  • Участники
  • Cообщений: 6

Отправлено

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

При удалении сообщения если их и так ноль из нуля вычитается единица.
Если в базе не указано "unsigned" то получается -1, если указано - 255.
Это получается из-за того что если перевести -1 из десятичной системы в бинарную получится 11111111, а при обратном переводе - 255.

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

Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

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

./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
												 );


WARpholomey
  • Участники
  • Cообщений: 6

Отправлено

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

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

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

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

4. Опять нахожусь в Личных Сообщениях. "Личных сообщений: 1"
Если сообщение сначала прочитать - почему-то ошибка не повторяется, или я не уловил связи.

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

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

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

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

Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

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

так, а галочка "сохранить в отправленных" стоит?

WARpholomey
  • Участники
  • Cообщений: 6

Отправлено

Версия форума - IPB 2.2.2, русский...
Нет, "Сохранить в отправленных" не стоит.

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

Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

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

...

а, нет, вру

это я смотрю 231

5 сек

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

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

WARpholomey
  • Участники
  • Cообщений: 6

Отправлено

Да, если я захожу в папку где есть новые сообщения, то счётчик сбрасывается даже если я их не читал.

Arhar
  • Команда форума
  • Cообщений: 5 631

Отправлено

давай в 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();
 		}


2rough4u
  • Участники
  • Cообщений: 118

Отправлено

$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

Song
  • Участники
  • Cообщений: 9 552
  • http://www.sysman.ru
  • Город:Кострома
  • Интересы:Программирование, плаванье

Отправлено

Если ты выполнишь то что написано в начале топика то в минус не загонит никак.

Lord_Style
  • Участники
  • Cообщений: 2

Отправлено

Скажите, пожалуйста, как можно организовать статистику: кто из пользователей скачал определенный файл? версия: Форум IP.Board 2.3.5

Sannis
  • Команда форума
  • Cообщений: 11 877
  • http://sannis.ru
  • Город:Москва
  • Интересы:Фотография, физика, высокопроизводительные системы, прикладное программирование, спортивный туризм.

Отправлено

Скажите, пожалуйста, как можно организовать статистику: кто из пользователей скачал определенный файл? версия: Форум IP.Board 2.3.5

Название темы вам ничего не говорит?

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




Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных