С Новым годом! Форум программистов, компьютерный форум, киберфорум
PHP: базы данных
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.57/49: Рейтинг темы: голосов - 49, средняя оценка - 4.57
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625

Диалоги между пользователями

07.02.2014, 12:33. Показов 12859. Ответов 58

Студворк — интернет-сервис помощи студентам
Добрый день. Помогите пожалуйста решить логическую задачу. У себя пытаюсь реализовать что-то наподобие диалогов между пользователями. Примерно как вконтакте. Итак, сделал две таблицы. Одну для диалогов, другую для сообщений. Таблица для сообщений, представлена на рисунке. Вопрос. Как построить таблицу для диалогов? Какие поля там должны быть?
Миниатюры
Диалоги между пользователями  
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
07.02.2014, 12:33
Ответы с готовыми решениями:

Перевод между пользователями
Доброго времени суток! Есть простенький личный кабинет(авторизация, регистрация) как добавить поля допустим для виртуальной валюты...

Сообщения между пользователями, в теории
Привет, друзья.) Меня интересует вопрос, относительно баз данных, для хранения сообщений пользователей. Каким образом, реализуют такие...

Передача данных между БД с разными пользователями
Имеется две базы данных, доступ к обоим из под разных пользователей. Нужно 4 поля из таблицы первой базы данных скопировать в таблицу...

58
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
09.02.2014, 21:43
Лучший ответ Сообщение было отмечено stashappy как решение

Решение

Студворк — интернет-сервис помощи студентам
Цитата Сообщение от stashappy Посмотреть сообщение
Представьте такую ситуацию. Я переписываюсь с собеседником, а затем удаляю свой диалог. В один прекрасный момент, я снова пишу ему сообщение и у меня создается новый диалог с новым id. Теперь, если учесть представленный выше вариант, мой собеседник больше не увидит мои сообщения, так как id моего диалога поменялся. Этот момент мне непонятен. Как правильно подставить данные в выборку?
Да, вы правы, я не правильно составил таблицу, нужно так:
dialogs:
id user1_id user2_id deleted

messages:
id dialog_from_id dialog_to_id

Тогда при новом сообщении от user_id = 1 to user_id = 2
Вы создаете две записи в dialogs
SQL
1
2
3
id user2_id user2_id del
1  1          2          0
2  2          1          0
т.е. для каждого из переписчиков по диалогу

и вставляется запись в messages
SQL
1
2
id dialog_from_id dialog_to_id
1  1                  2
тогда для выбора сообщений пользователю user_id = 1 (диалог с user_id = 2) нужно
найти диалог, где user1_id =1 and user2_id = 2 (это dialog_id = 1),
затем выбираем из messages все записи с dialog_from_id или dialog_to_id = 1 (dialog_id),
по тому какое поле совпало dialog_from_id или dialog_to_id мы понимаем исходящее это сообщение или входящее. Мы нашли message id = 1 dialog_from_id = 1 dialog_to_id = 2,
по полю dialog_from_id - т.е. для user_id = 1 это исходящее сообщение.
Для пользователя user_id = 2 это сообщения найдется по полю dialog_to_id => оно для него входящее.
Далее если кто-то из них удалит переписку, н-р user_id = 1, то находится его диалог с user_id = 2,
это dialog_id = 1 и ставится deleted = 1, тогда для user_id = 1, для показа сообщений с user_id = 2, мы не найдем диалог => сообщения не выводятся(для user_id = 2 найдется диалог 2 и по нему сообщения найдутся).
Если user_id = 1 возобновит переписку или user_id = 2 снова напишет user_id = 1, то создается новый диалог
для user_id = 1, для user_id = 2 найдется старый(не удаленный):
SQL
1
2
3
4
id user2_id user2_id del
1  1          2          1
2  2          1          0
3  1          2          0
И новые сообщения между ними (например от user_id = 2 to user_id = 1)
будут записываться с другим номером диалога для user_id = 1, и старым для user = 2:
SQL
1
2
3
id dialog_from_id dialog_to_id
1  1                  2
2  2                  3
Тогда user_id = 2 будет видеть все сообщения, а user_id = 1 - только новые.
2
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
09.02.2014, 22:30
Цитата Сообщение от esculap_ra Посмотреть сообщение
самый большой файл - города России весит 96 кил
вы смеетесь что ли? Города России
По итогам Всероссийской переписи населения 2010 года статус города имеют 1100 населённых пунктов
Вы правда считаете, что база на 1100 населенных пунктов - это здоровая БД, запросы к которой будут тормозить? Конечно, при таком сравнении все будет шустро донельзя.
Цитата Сообщение от esculap_ra Посмотреть сообщение
последовательный перебор пользователем списка стран создаст 218 запросов
Вы вообще, хоть раз, с БД работали? Какие еще 218 запросов? Один запрос, все. Получили указатель на результат запроса, и все, хоть закрывай соединение. Обработали одну запись, сдвинули указатель на следующий. Обработали еще одну запись, сдвинули указатель на следующий. Соединение с БД вообще можно закрыть. Запустите такой код (данные для подключения и запрос укажите свои)
PHP
1
2
3
4
5
6
7
8
9
<?php
mysql_connect('server', 'user', 'pass');
mysql_select_db('test');
mysql_set_charset('utf8');
 
$res = mysql_query('SHOW TABLES');
mysql_close(); //Как видно, соединение с БД закрыли
while($row = mysql_fetch_array($res, MYSQL_NUM))
    echo $row[0], PHP_EOL; //все нормально выводится
Откуда вы взяли 218 запросов?
Цитата Сообщение от esculap_ra Посмотреть сообщение
и так для каждого пользователя
Да. А JSON, наверное, на всех один, общий?
Цитата Сообщение от esculap_ra Посмотреть сообщение
крупные социальные сети могут позволить себе такую роскошь
Любой нормально спроектированный сайт может позволить себе такую мелочь.
Цитата Сообщение от esculap_ra Посмотреть сообщение
постоянные обращения к БД
Это явно не тот случай, когда происходят постоянные обращения к БД. Если только в вашем понимании.
Цитата Сообщение от esculap_ra Посмотреть сообщение
в моих же разработках на первом плане - уменьшение запросов к серверу и БД
Не используйте в своих разработках вообще БД - никто не против. Но не надо это возводить в статус "единственное и априори верное решение", доказывая при этом то, в чем, по-видимому (судя из 218 запросов), совершенно не разбираетесь. Это не упрек или что-то в этом духе, это констатация факта.
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
10.02.2014, 00:44  [ТС]
zebulun. Ох мой друг. Спасибо вам душевное большое. Спасибо за помощь и поддержку.

Добавлено через 22 минуты
Один запрос, все. Получили указатель на результат запроса, и все, хоть закрывай соединение.
Да, по идее. Нет никаких 218 запросов. Есть только один запрос и один массив, в который мы засовываем результат выборки. А дальше используем простой цикл для извлечения из массива. А 218 запросов.., разве что так можно умудриться:
PHP
1
2
3
4
5
for($i = 0; $i < 218; $i++) {
  mysql_query("SELECT `field` FROM `table`");
}
// вот и будет 218 запросов к БД
// :-)
Вы правда считаете, что база на 1100 населенных пунктов - это здоровая БД, запросы к которой будут тормозить? Конечно, при таком сравнении все будет шустро донельзя.
В моей БД, по России и США, где-то примерно 6000 городов. И 120 регионов и штатов. Выборка производится очень просто и нужен для этого всего один запрос к БД.
0
 Аватар для esculap_ra
462 / 265 / 55
Регистрация: 22.08.2010
Сообщений: 1,204
Записей в блоге: 4
10.02.2014, 01:06
Цитата Сообщение от KOPOJI Посмотреть сообщение
Вы вообще, хоть раз, с БД работали? Какие еще 218 запросов? Один запрос, все.
вот неправильно выразился (...в чем, по-видимому (судя из 218 запросов), совершенно не разбираетесь... ), и тут сразу уцепились за слова. только 218 запросов к серверу + 218 запросов к БД (на 1 страну 2 запроса - сервер и БД). и да, файл для всех общий (на 1 стрвну - 1 файл с городами). и этот файл слхранится в кэше, поэтому вторичный выбор этого же селекта уже не потребует получения файла, так как указано время истечения действия. но вы при желании можете конечно получать каждый раз эти же данные из БД - никто не возбраняет. так "гибче и рациональнее", и это укладывается в догму.

на 1100 населенных пунктов - это не здоровая БД, но если представить гипотетически одновременные запросы от 1000 пользователей, от 10 тыс. и при этом еще учесть кучу запросов на получение технических файлов - скрипты и стили. вот поэтому большинтсво сайтов по скорости загрузки оставляют желать лучшего.

спасибо за приведенный код. но эти все действия у меня выполняет класс для работы с БД и неплохо с этим спарвляется.

трудно разговаривать с прожженными консерваторами. и это тоже констатация факта....
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
10.02.2014, 09:55
Цитата Сообщение от esculap_ra Посмотреть сообщение
но вы при желании можете конечно получать каждый раз эти же данные из БД
я уже говорил про memcached. Он как раз для этого.
Цитата Сообщение от esculap_ra Посмотреть сообщение
и тут сразу уцепились за слова
Не уцепился, а увидел, что вы говорите, извиняюсь, чушь. Вот откуда вы это взяли:
Цитата Сообщение от esculap_ra Посмотреть сообщение
только 218 запросов к серверу + 218 запросов к БД
Можете рассказать ваше понимание того, как устроена связь между СУБД - PHP - Клиент ? А то, видимо, все (в том числе и сами разрабы) ничего не понимают в устройстве трехуровневой архитектуры. И многие сайты используют БД, наверное, потому, что не понимают, что вы, как истинный профессионал, решительно утверждаете, что эта архитектура - туфта, и обычная архитектура клиент-сервер в 100 раз лучше. Да, у нее есть и минусы, как и у любой другой - но в вебе, зачастую, она куда более предпочтительна. Почитайте, что ли, хоть что это такое Трехуровневая архитектура Клиент-сервер
Цитата Сообщение от esculap_ra Посмотреть сообщение
на 1100 населенных пунктов - это не здоровая БД, но если представить гипотетически одновременные запросы от 1000 пользователей, от 10 тыс. и при этом еще учесть кучу запросов на получение технических файлов - скрипты и стили. вот поэтому большинтсво сайтов по скорости загрузки оставляют желать лучшего.
Еще раз:
Цитата Сообщение от KOPOJI Посмотреть сообщение
JSON, наверное, на всех один, общий?
Обращение к файлу будет также производиться от каждого пользователя. Напомнить расшифровку JSON ?
Цитата Сообщение от esculap_ra Посмотреть сообщение
трудно разговаривать с прожженными консерваторами
Трудно разговаривать со слабо разбирающимися, но убежденными в своей правоте. И да, я далеко не консерватор, скорее наоборот.

Добавлено через 8 минут
В общем, esculap_ra, если у вас нет ничего, кроме "мое лучшее имхо", то просьба ничего не писать.. Или предоставьте доказательства или хотя бы корректное утверждение того, что ваша идея лучше, или успокойтесь и хватит кидаться на всех с "консерватор"
0
 Аватар для esculap_ra
462 / 265 / 55
Регистрация: 22.08.2010
Сообщений: 1,204
Записей в блоге: 4
10.02.2014, 10:11
1. В связанных селектах города-страны 218 стран(первичный селект)
2. В файле 1 раз записывается данные по городам для страны (для россии, например, это будет файл 1.json). по сути это тот же кэш полученных единожды данных и сериализированных данных. их то все равно необходимо сериализовать для передачи по сети.
3. Если такой файл еще не создавался, то клиент передает запрос на обработчик (скрипт geo.php): 1 раз для америки, 2-ой раз для россии, 3-тий раз для украины и т.д., в зависимости от выбираемого пункта. При этом сервер создает 1 запрос к БД чтобы получить эту инфу. Если же файл уже существует, то он просто скачивается минуя скрипт обработчика методом get в ассинхронном запросе и кэшируется на стороне клиента. И полученные данные (все города для конкретной страны) появятся во втором селекте.

Эту фразу "JSON, наверное, на всех один, общий?" я понял неправильно, и говоря что общий имел в виду один для списка городов по каждой стране.

И давайте заканчивать беспредметную полемику.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
10.02.2014, 10:31
Цитата Сообщение от esculap_ra Посмотреть сообщение
1.
один запрос.
Цитата Сообщение от esculap_ra Посмотреть сообщение
2.
В двух таблицах 1 раз записываются города и страны
countries
country_idcountry
cities
city_idcountry_idcity
Цитата Сообщение от esculap_ra Посмотреть сообщение
3
Если такой запрос еще не был выполнен, то он выполняется, данные кэшируются. С учетом использования индексов - запрос выполняется ~0.01 секунд для 1000 записей. Может, меньше, не знаю. При этом сервер создает 1 запрос к БД с JOIN-ом, чтобы получить эту инфу. Если уже есть информация в кэше - он берет информацию оттуда.
Цитата Сообщение от esculap_ra Посмотреть сообщение
И давайте заканчивать беспредметную полемику.
И правда, сначала почитайте что-нибудь по этой теме, потом можно будет поговорить.
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
12.02.2014, 15:40  [ТС]
zebulun. Я что-то явно делаю неправильно. Когда отправляю пользователю сообщение(диалог возобновляется), я отправляю ему свой старый dialog_id(=1) и его dialog_id(=2). А как я увижу это своё отправленное сообщение? Ведь делаю выборку у себя в кабинете по другим данным: dialog_id=2 и dialog_id=3.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.02.2014, 20:01
А зачем вообще разделять на "диалоги-сообщения", если хотите "как в вконтакте" ? Вроде, там такого разделения нет.

Добавлено через 57 секунд
Цитата Сообщение от stashappy Посмотреть сообщение
Когда отправляю пользователю сообщение(диалог возобновляется)
Когда наступает тот период, что диалог не должен возобновляться?
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
12.02.2014, 20:06  [ТС]
Когда наступает тот период, что диалог не должен возобновляться?
Сначала удаляю свой имеющийся диалог. А затем, когда снова пишу этому же пользователю, диалог возобновляется.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.02.2014, 20:10
stashappy, ну вот, смотрите. Есть стопка сообщений
я: привет
она: привет
я:....
она:...
____________
прошло полгода
я:.....
она:.....
я:.....
она:.....
прошло полгода
я:.....
она:.....
Я удаляю диалог. Какие сообщения у меня удалятся? Все? Если да - то какой смысл от лишней таблицы "диалоги" ?
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
12.02.2014, 20:14  [ТС]
я: привет
она: хай
я: пока
// здесь я удалил свой диалог
//через пол года пишу ей опять и диалог возобновляется
я: привет
она: hi
В итоге. После того, как я удалил свой диалог и после того, как я снова возобновил его, я буду видеть только новые сообщения. А она, должна видеть все сообщения(так как её диалог не был никем удалён).
0
12.02.2014, 20:15

Не по теме:

stashappy, ну лично я вижу мало смысла на разделение с таблицей диалоги в таком случае.. Хотя как знаете сами.

0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
12.02.2014, 20:17  [ТС]
лично я вижу мало смысла на разделение с таблицей диалоги
KOPOJI. А у вас есть вариант получше этого? Я как-то помнится тоже пробовал обойтись всего одной таблицей, но ничего не получилось.
0
Почетный модератор
Эксперт HTML/CSSЭксперт PHP
 Аватар для KOPOJI
16844 / 6724 / 880
Регистрация: 12.06.2012
Сообщений: 19,967
12.02.2014, 20:21
Например, использовать не таблицу диалоги, а таблицу с удаленными сообщениями. Или в одной таблице все оставлять

Добавлено через 53 секунды
Просто, в моем понимании, создавать разделение на диалоги только для того, чтобы удалять сообщения с одной стороны - это как-то неправильно. Хотя, может, конечно, я и ошибаюсь
0
 Аватар для stashappy
42 / 42 / 13
Регистрация: 21.08.2011
Сообщений: 625
12.02.2014, 20:35  [ТС]
Какие сообщения у меня удалятся? Все?
Сообщения, сами по себе, они не удаляются. Они всё так-же продолжают сидеть в БД. Но при удалении и последующем возобновлении диалога, просто меняется его dialog_id. И старые сообщения, которые не соответствуют этому dialog_id, не будут показываться для меня. Но всё ещё должны показываться для моего собеседника, до тех пор, пока он не удалит свой диалог.
0
71 / 71 / 13
Регистрация: 01.09.2011
Сообщений: 379
13.02.2014, 01:47
Цитата Сообщение от stashappy Посмотреть сообщение
Когда отправляю пользователю сообщение(диалог возобновляется), я отправляю ему свой старый dialog_id(=1) и его dialog_id(=2). А как я увижу это своё отправленное сообщение? Ведь делаю выборку у себя в кабинете по другим данным: dialog_id=2 и dialog_id=3.
Во-первых вы, как пользователь, диалоги не отправляете, а только сообщения.
Во-вторых, когда пользователь отправил кому-либо сообщение, в таблице dialogs ищутся две записи,
одна для того чтобы привязать это сообщение к отправителю, другая к получателю по условию:
user1_id=id пользователя к которому привязывается сообщение(повторяю привязывается к отправителю и получателю,у меня там опечатка в описании dialogs, два раза написал user2_id в названиях столбцов, первый из них это user1_id)
AND
user2_id = id второго участника диалога AND deleted = 0, если такого совпадения не нашлось для кого-то из переписчиков(н-р отправитель удалил переписку(когда он удалил переписку со вторым пользователем, то запись в dialogs, где user1_id=id того кто удалил, user2_id = id того с кем была переписка помечается как удаленная)), то для того для кого не нашлось записи в dialogs, создается новая запись с новым id в таблице dialogs, но значения user1_id и user2_id не меняются, поэтому когда вы ищете сообщения, которые нужно показывать, вы находите запись в dialogs, где user2_id = id того, с кем переписка,и по id этой записи, ищете все сообщения в messages. Получается, пока юзер не удалил переписку, id его диалога не поменяется, и те сообщения, которые уже не видны, тому, из двух кто удалил переписку останутся видны, тому кто не удалял.
Почему вы не увидите свое новое сообщение, после возобновления диалога?
1
1178 / 1128 / 94
Регистрация: 31.05.2012
Сообщений: 3,060
13.02.2014, 02:37

Не по теме:

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



Добавлено через 12 минут
первое, что бросилось в глаза, это зачем в таблице диалогов, делать две связи, в обе стороны?
второе, зачем два юзера в таблице мессагес?

Добавлено через 6 минут
subjects
id, [user_id,] [title,] [time,] [flags]
по сути главное id
флаги могут быть, закрыта, приватная, общая... вообщем всё на что фантазии хватит и бит в поле
можно хранить в юзер ид - создателя диалога, или убрать поле

dialogs
subject_id, user_id, flags
первичный ключ по 2 полям
флаги могут для конкретного юзера быть, например подписаться, оповещать, удалить...

messages
id, subject_id, user_id, time
собственно ид дилаога для которого сообщение
и ид юзера который отправил.

чем не устраивает такой подход?
1
tommy13
25.03.2014, 03:23
Доброй ночи, почитал вашу дискуссию..)

есть схожая задача - диалоги

структуру БД прикрепил

возникла сложность, как выбрать "последние диалоги" (собственно, как в вконтакте)?
можно, конечно, "перебрать" по пользователям, но думается есть способ правильнее и проще

по функционалу - только переписка между двумя пользователями, нет удаления сообщений. всего пользователей до 20
Миниатюры
Диалоги между пользователями  
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.03.2014, 03:23
Помогаю со студенческими работами здесь

Организация чат-общения между 2 пользователями
Вообщем возник вопрос, как организовать общение на сайте (подобие диалогов вконтакте), между 2 пользователями? Сам сайт на php и мускул,...

Общение в виде чата между пользователями на сайте
есть ли готовые сервисы для общения зарегистрированных пользователей между собой? наподобие krible.ru zopim.com olark.com ...

Работа с пользователями
Давно витает мысль написать компоненты по работе с юзерами, а также затем оформить бандл для Symfony2 :) на данный момент начал...

Слежка за пользователями
Решил написать простую слежку за пользователями: class ViewStats { private static $stats_base = 'stats.log'; private static...

Контроль над пользователями.
Для того, чтобы запрещать доступ к сайту различным &quot;вредителям&quot;, необходима регистрация, для того, чтобы в случаи необходимости отказать во...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
59
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru