| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > PHP: Общие вопросы > Подскажите алгоритм Для чата(приватные сообщения) |
| Автор: Alix36 3.12.2007, 23:11 |
| Идея такая в базе записывается сообщения в поле msg если оно приватное то перед текстом самого сообщения идет prv[NIK1]prv[NIK2]... В фрейме где выводятся сообщения нужно отобрать сообщения 1) Имеющие prv[NIK_U] NIK_U ник данного юсера. 2) Не имеющие вообще записи prv[**] Со вторым проблем нет просто проверяем на вхождение подфразу prv[ А вот с первым непонимаю как сделать.. |
| Автор: kasmanaft 4.12.2007, 07:24 | ||
Можно воспользоваться регулярными выражениями:
PS в сообщение, наверное, добавьте разделитель, чтобы можно было легко отделять само сообщение от "системных команд". А потом explode(' |~|~| ', $text, 2). |
| Автор: skyboy 4.12.2007, 10:30 |
| kasmanaft, выдирать из БД все подряд, а потом обрабатывать на стороне РНР - не самое рациональное решение. Alix36, укажи версию MySQL и приведи структуру таблицы(чтоб знать имена полей и писать запрос не "от балды"). |
| Автор: Alix36 10.12.2007, 22:54 |
| Не мог ответит раньше... Структура такая. id|Autor|time|loc|tip|msg|zm Autor-ник напечатавшего сообщение time- время сообщения loc- комната в которой сказано tip- если сообщение администрации то tip=1 msg само сообщени zm - колличество замечание пользователя. Версия Базы 5.0.18 mysql |
| Автор: Валерия 10.12.2007, 23:02 |
| Я когда делала чат, я сделала маленькое поле "кому", если оно пустое - то всем И еще у меня одно поле было в базе, "to" и "private". Затем была выборка: SELECT * FROM `qwe` WHERE `to`='$mylogin' and `private`='1'; эти писались в нижний фрейм (приват) SELECT * FROM `qwe` WHERE `private`='0'; а эти в верхний фрейм, тоесть общак Хотя не знаю как ты хочешь что бы у тебя в чате было, мне, например, удобнее когда общак и приват раздельно. |
| Автор: Alix36 11.12.2007, 21:50 |
| Валерия, такое и щас существует. Минусы 1.Нельзя группе приват написать, только одному человеку. 2.Сложный ввод. (Не все пользователи знают что таб переводит курсор в следущий инпут.) |
| Автор: Alix36 13.12.2007, 18:20 | ||
| Feldmarschall, Может я конечно и не прав, но Ваше сообщение никакого отношения не имеет к теме, если вам хочется меня оскорбить, в ПМ. Тут задают вопросы и принято на них отвечать, а не просто писать пустые сообщения имеющие неприятное для авторов тем содержание.
Кто Вам это сказал? Вопрос темы - рациональность того или иного способа. Я предложил такой. У Вас есть аргументы против, выскажите их. |
| Автор: HotHead 13.12.2007, 19:52 |
| В лоб можно решить через MySQL REGEXP или LIKE. Но такой метод будет очень тормозным. По хорошему разбор приватности сообщения надо делать до его попадания в БД, а не после. Ещё одно некрасивое, но быстрое решение - просмотреть начало сообщения на наличие prv[...] и для каждого встретившегося сделать свою запись в БД. Ещё придётся туда добавить поле 'to', как выше предлагала Валерия. При умеренной нагрузке такое решение терпимое, хотя и некрасивое. Ну а по хорошему всё надо делать по классике жанра. Таблица юзеров с user_id, таблица сообщений с msg_id, таблица связей msg_to_user. В таблицу сообщений имеет смысл добавить флаг private и если сообщение не приватное, то и в таблицу связей ничего не писать. |
| Автор: Alix36 13.12.2007, 20:47 |
| HotHead, мощно, спасибо попробую последний вариант. |
| Автор: Alix36 16.12.2007, 16:10 | ||
| HotHead, возник такой вопрос. Если я записываю согласно структуре
Как правильнее всего выбирать записи. Я сделал так. 1.из таблицы id_msg выбираем все для данной комнаты (order by time ). 2. для каждого сообщения проверяем, если установлен приват, если установлен, делаем дополнительный запрос в msg_to_user и если в таблице есть запись о том, что данное сообщение адресовано и этому пользователю, мы его выводим, в ином случае нет. Можно ли сделать иначе? |
| Автор: Валерия 16.12.2007, 16:15 |
| Поле to удобно очень тем, что когда с одним общаешься в привате, не нужно каждый раз по его нику клацать. А если еще отправку приватных сообщений через ctrl + enter сделать то вообще очень удобно |
| Автор: Alix36 16.12.2007, 16:21 |
| я с приватом так сделал, клацаешь по нику, устанавливается кукис с ником, и + отображается на панельке. отправляешь с установленными куками - в приват, на панельке жмешь очистить приват , и шлешь сообщение - общее сообщение |
| Автор: Валерия 16.12.2007, 16:23 |
| А кукис то зачем |
| Автор: Alix36 16.12.2007, 16:24 |
| Валерия, дабы с сервера можно быо сразу читать, а не писатьфункцию по извлечению из слоя на JS |
| Автор: Валерия 16.12.2007, 16:32 | ||
А разве поле to не передаеться одновременно с полем в которое сообщение? Зачем так усложнять. |
| Автор: HotHead 16.12.2007, 16:42 | ||||
| Alix36, я бы просто сделал две выборки. Одну общую (где приват = 0), вторую приватную (приват = 1) и к ней сразу JOIN'ом присоединил записи с соответствующим msg_id и адресованных данному юзеру (user_id = его_id). Потом просто выводим результаты выборок в соответствующее окно. Т.е. у меня получилось бы примерно следующее:
для обычных сообщений (+ ORDER и LIMIT, если нужно). И
для приватных. В принципе проверку m.private = 1 можно не делать, т.к. в таблицу msg_to_user должны попадать только записи для приватных сообщений, но можно и попараноить на всякий случай. |
| Автор: Alix36 16.12.2007, 16:54 |
| HotHead, спасибо |