Модераторы: skyboy, MoLeX, Aliance, ksnk

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Подскажите алгоритм Для чата(приватные сообщения) 
:(
    Опции темы
Alix36
Дата 3.12.2007, 23:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Идея такая
в базе записывается сообщения в поле msg если оно приватное то перед текстом самого сообщения идет prv[NIK1]prv[NIK2]...
В фрейме где выводятся сообщения нужно отобрать сообщения 
1) Имеющие prv[NIK_U] NIK_U ник данного юсера.
2) Не имеющие вообще записи prv[**]

Со вторым проблем нет просто проверяем на вхождение подфразу prv[ 
А вот с первым непонимаю как сделать..


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
kasmanaft
Дата 4.12.2007, 07:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 94
Регистрация: 16.11.2007

Репутация: 1
Всего: 2



Можно воспользоваться регулярными выражениями:
Код

<pre>
<?php
$text = "prv[NIK1]prv[NIK2] |~|~| сообщение";
preg_match_all("|prv\[([^\]]+)\]|", $text, $matches);
print_r($matches);
?>


PS в сообщение, наверное, добавьте разделитель, чтобы можно было легко отделять само сообщение от "системных команд". А потом explode(' |~|~| ', $text, 2).
PM MAIL   Вверх
skyboy
Дата 4.12.2007, 10:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


неОпытный
****


Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 75
Всего: 260



kasmanaft, выдирать из БД все подряд, а потом обрабатывать на стороне РНР  - не самое рациональное решение.
Alix36, укажи версию MySQL и приведи структуру таблицы(чтоб знать имена полей и писать запрос не "от балды").
PM MAIL   Вверх
Alix36
Дата 10.12.2007, 22:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Не мог ответит раньше...
Структура такая.
id|Autor|time|loc|tip|msg|zm
Autor-ник напечатавшего сообщение
time- время сообщения
loc- комната в которой сказано
tip- если сообщение администрации то tip=1
msg само сообщени
zm - колличество замечание пользователя.

Версия Базы 5.0.18 mysql



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Валерия
Дата 10.12.2007, 23:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 3
Всего: 8



Я когда делала чат, я сделала маленькое поле "кому", если оно пустое - то всем smile
И еще у меня одно поле было в базе, "to" и "private".
Затем была выборка:

SELECT * FROM `qwe` WHERE `to`='$mylogin' and `private`='1';
эти писались в нижний фрейм (приват)

SELECT * FROM `qwe` WHERE `private`='0';
а эти в верхний фрейм, тоесть общак smile

Хотя не знаю как ты хочешь что бы у тебя в чате было, мне, например, удобнее когда общак и приват раздельно.
PM MAIL   Вверх
Alix36
Дата 11.12.2007, 21:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Валерия, такое и щас существует.
Минусы
1.Нельзя группе приват написать, только одному человеку.
2.Сложный ввод. (Не все пользователи знают что таб переводит курсор в следущий инпут.)


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Feldmarschall
Дата 11.12.2007, 22:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок
****


Профиль
Группа: Участник
Сообщений: 2641
Регистрация: 11.12.2007

Репутация: 22
Всего: 32



Цитата(Alix36 @  3.12.2007,  23:11 Найти цитируемый пост)
 базе записывается сообщения в поле msg если оно приватное то перед текстом самого сообщения идет prv[NIK1]prv[NIK2]..

Мне кажется, автор не совсем понимает, что такое РСУБД. И использует её, как банальный текстовый файл с последовательным доступом.
Отсюда все проблемы.
PM   Вверх
Alix36
Дата 13.12.2007, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Feldmarschall, Может я конечно и не прав, но Ваше сообщение никакого отношения не имеет к теме, если вам хочется меня оскорбить, в ПМ.
Тут задают вопросы и принято на них отвечать, а не просто писать пустые сообщения имеющие неприятное для авторов тем содержание.

Цитата

как банальный текстовый файл с последовательным доступом.

Кто Вам это сказал?
Вопрос темы - рациональность того или иного способа. 
Я предложил такой. У Вас есть аргументы против, выскажите их.



--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
HotHead
Дата 13.12.2007, 19:52 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 26.10.2007

Репутация: 3
Всего: 4



В лоб можно решить через MySQL REGEXP или LIKE. Но такой метод будет очень тормозным. По хорошему разбор приватности сообщения надо делать до его попадания в БД, а не после. Ещё одно некрасивое, но быстрое решение - просмотреть начало сообщения на наличие prv[...] и для каждого встретившегося сделать свою запись в БД. Ещё придётся туда добавить поле 'to', как выше предлагала Валерия. При умеренной нагрузке такое решение терпимое, хотя и некрасивое.

Ну а по хорошему всё надо делать по классике жанра. Таблица юзеров с user_id, таблица сообщений с msg_id, таблица связей msg_to_user. В таблицу сообщений имеет смысл добавить флаг private и если сообщение не приватное, то и в таблицу связей ничего не писать.
PM MAIL   Вверх
Alix36
Дата 13.12.2007, 20:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



HotHead, мощно, спасибо попробую последний вариант.


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Alix36
Дата 16.12.2007, 16:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



HotHead, возник такой вопрос.
Если я записываю согласно структуре
Цитата(HotHead @  13.12.2007,  19:52 Найти цитируемый пост)
Ну а по хорошему всё надо делать по классике жанра. Таблица юзеров с user_id, таблица сообщений с msg_id, таблица связей msg_to_user. В таблицу сообщений имеет смысл добавить флаг private и если сообщение не приватное, то и в таблицу связей ничего не писать.

Как правильнее всего выбирать записи.

Я сделал так.
1.из таблицы id_msg выбираем все для данной комнаты (order by time ).
2. для каждого сообщения проверяем, если установлен приват, если установлен, делаем дополнительный запрос  в msg_to_user и если в таблице есть запись о том, что данное сообщение адресовано и этому пользователю, мы его выводим, в ином случае нет.

Можно ли сделать иначе?


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Валерия
Дата 16.12.2007, 16:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 3
Всего: 8



Поле to удобно очень тем, что когда с одним общаешься в привате, не нужно каждый раз по его нику клацать.
А если еще отправку приватных сообщений через ctrl + enter сделать то вообще очень удобно smile
PM MAIL   Вверх
Alix36
Дата 16.12.2007, 16:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



я с приватом так сделал, клацаешь по нику, устанавливается кукис с ником, и + отображается на панельке.
отправляешь с установленными куками - в приват, 
на панельке жмешь очистить приват , и шлешь сообщение - общее сообщение


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Валерия
Дата 16.12.2007, 16:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 3
Всего: 8



А кукис то зачем smile?
PM MAIL   Вверх
Alix36
Дата 16.12.2007, 16:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



Валерия, дабы с сервера можно быо сразу читать, а не писатьфункцию по извлечению из слоя на JS


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Валерия
Дата 16.12.2007, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 598
Регистрация: 10.3.2007

Репутация: 3
Всего: 8



Цитата(Alix36 @  16.12.2007,  16:24 Найти цитируемый пост)
Валерия, дабы с сервера можно быо сразу читать, а не писатьфункцию по извлечению из слоя на JS 

А разве поле to не передаеться одновременно с полем в которое сообщение?smile
Зачем так усложнять.
PM MAIL   Вверх
HotHead
Дата 16.12.2007, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 67
Регистрация: 26.10.2007

Репутация: 3
Всего: 4



Alix36, я бы просто сделал две выборки. Одну общую (где приват = 0), вторую приватную (приват = 1) и к ней сразу JOIN'ом присоединил записи с соответствующим msg_id и адресованных данному юзеру (user_id = его_id). Потом просто выводим результаты выборок в соответствующее окно.

Т.е. у меня получилось бы примерно следующее:
Код

SELECT * FROM messages WHERE private = 0

для обычных сообщений (+ ORDER и LIMIT, если нужно). И
Код

SELECT * FROM messages m INNER JOIN msg_to_user mtu ON (mtu.msg_id = m.msg_id)  
WHERE mtu.user_id = [id нашего юзера] AND m.private = 1

для приватных. В принципе проверку m.private = 1 можно не делать, т.к. в таблицу msg_to_user должны попадать только записи для приватных сообщений, но можно и попараноить на всякий случай.
PM MAIL   Вверх
Alix36
Дата 16.12.2007, 16:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 478
Регистрация: 6.11.2006

Репутация: 1
Всего: 3



HotHead, спасибо


--------------------
Наши лица как дым, И никто не узнает как мы победим. (С)Пикник.
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "PHP"
Aliance
IZ@TOP
skyboy
SamDark
MoLeX

Новичкам:

  • PHP редакторы собираются и обсуждаются здесь
  • Электронные книги по PHP, документацию можно найти здесь
  • Интерпретатор PHP, полную документацию можно скачать на PHP.NET

Важно:

  • Не брезгуйте пользоваться тегами [code=php]КОД[/code] для повышения читабельности текста/кода.
  • Перед созданием новой темы воспользуйтесь поиском и загляните в FAQ
  • Действия модераторов можно обсудить здесь

Внимание:

  • Темы "ищу скрипт", "подскажите скрипт" и т.п. будут переноситься в форум "Web-технологии"
  • Темы с именами: "Срочно", "помогите", "не знаю как делать" будут УДАЛЯТЬСЯ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, IZ@TOP, skyboy, SamDark, MoLeX, awers.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0980 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.