|
|
|
| Замучился с организацией в чате приватных сообщений. Не могли бы вы мне помочь добрым советом как правильно все это дело построить?
Задача состоит в том, чтобы в общем списке сообщений отображать приватные для конкретного человека и скрывать соответственно эти сообщения от других =). В базе есть таблица private c id, user_from, user_to, pmessage, data.
Чат базируется на AJAX, PHP, MySQL. Ответ от сервера приходит в виде XML. Чат пишется полностью мною. За основу взята глава из книги "Ajax + PHP".
Как обычно организовывается приват в чатах? Поиск по форумам и рунету даёт к сожалению мало информации. Можно ли обойтись без дополнительной таблицы привата в базе? Не очень хочется писать еще 1 функцию, которая будет по таймеру проверять если ли новые сообщения для адресата с заданным ID. В чате и так уже висят два таймера. Один на онлайн пользователей, второй на сообщения. Была идея отсылать скрипту флаг типа "SendPrivate". Флаг бы этот означал, что необходимо по иному построить XML ответ с тегом приват <private from="user_id_from" to="user_id_to">само сообщение</private>. А вот как его скрыть в общем поле сообщений от посторонних глаз я не так и не придумал =((
Недавно раскопал чат Ajax`овый, опенсурсный. Там приват каким-то хитрым образом строится на основе генерации уникального числа. Число присваивается пользователю, а вот что делается дальше я так и не понял. Чат навороченный, куча классов, методов и что откуда берется понять сложно. | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 12:37)
| | Может когда человек отправил приватное сообщение, то в начале этого сообщения поставить какой-нить признак этого, например идентификатор того кому он его отправил, а при выводе проверять выводить всем или только определённому клиенту!!!
например, написали сообщение "Примет", в BD сохранить "id012345 Привет",
где id012345 идентификатор того кто должен получить!!! | |
|
|
|
|
|
|
|
для: serenya1983
(15.04.2010 в 14:51)
| | С идентификатором идея крайне хорошая, но вот как именно выводить только определенному клиенту? В этом как бы и весь затор. Хотя логика мне теперь более-менее понятно. Надо поиграться с запросами и идентификаторами... | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 12:37)
| | попробуйте так, в таблице chat просто добавьте два поля, скажем id_from и id_to, для обычных сообщений когда чикбокс приват не активен эти поля принимают значение 0, при активном чикбоксе -нужен привт, а значит id_from и id_to принимают значение кому и от кого соответсвенно, а при чтении чата в запрос примерно так
$query_all = "SELECT * FROM `chat`
WHERE id_from='$id_to' or id_to='$id_to' or id_from='0' or id_to='0'
ORDER BY id_msg DESC";
|
или так
$query_all = "SELECT * FROM `chat`
WHERE `id_from` IN ( '".$id_to."', '0' )
AND `$id_to` IN ( '".$id_to."', '0' )";
|
таким оброзом читается все сообщения у которых обе id=0, и все приватные написанные и направленные для текущего id_to. | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 15:26)
| | Попробую поиграться с запросами, спасибо за совет.
> при активном чикбоксе -нужен привт, а значит id_from и id_to принимают значение кому и от кого соответсвенно.
То есть если стоит галочка, то запросы в базу идут по логике "Выводить мне все сообщения, где id_from равняется моему id, а id_to равняется id моего приятеля, которому я этот приват пишу"? | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 16:42)
| | я from и for перепутал, сейчас объясну логику | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 16:47)
| | пускай поля будут priv1 и priv2
1) Я пишу ДРУГУ, priv1=МОЙ_ИД priv2=ИД_ДРУГА
в итоге он читает все сообщения, + те, где priv1 или priv2 =ИД_ДРУГА
я читаю все сообщеня, + те, где priv1 или priv2 =МОЙ_ИД
2)ДРУГ пишет МНЕ, priv1=ИД_ДРУГА priv2=МОЙ_ИД
в итоге я читаю все сообщеня, + те, где priv1 или priv2 =МОЙ_ИД
он читает все сообщения, + те, где priv1 или priv2 =ИД_ДРУГА | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 16:52)
| | Благодарю. Как раз именно то, что мне необходимо. Завтра обязательно опробую способ и поправлю запросы. Сегодня уже не успеваю =( | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 16:47)
| | =) Я заметил, но это не так критично, ход мысли я понял. | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 16:42)
| | Тут вот еще какая бага вылезла. Ответ формируется в виде XML. Перед отправкой сообщения в базу происходят соответствующие проверки и есть функция htmlspecialchars, которая должна экранировать теги.
JS-скрипты она конечно не пускает, но теги типа <b>,<i>,<s>,<hr>. А этого бы очень не хотелось....
$response = '<?xml version="1.0" encoding="UTF-8" standalone="yes"?>';
$response .= '<response>';
if(mysql_num_rows($result) > 0){
while($row = mysql_fetch_array($result)){
$id_message = $row['id_chat'];
$name = $row['user_name'];
$time = $row['post_on'];
$message = $row['message'];
$response .= '<id value="'. $id_message .'">'. $id_message .'</id>';
$response .= '<name>'. $name .'</name>';
$response .= '<time>'. $time .'</time>';
$response .= '<message>'. $message .'</message>';
}
}
$response .= '</response>';
print $response; }
|
Вот он код вывода... | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 16:52)
| | это код вывода, а не запрос, | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 16:54)
| | Запросы я пока не правил. До конца рабочего дня 15 минут осталось. Не успею уже сделать и потестировать. Я вот сейчас завалился на том, что подобный вывод позволяет пропускать теги чего не следует делать... | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 17:03)
| | >До конца рабочего дня 15 минут осталось.
Кошмар.
>Не успею уже сделать и потестировать.
Ужас и кошмар. | |
|
|
|
|
|
|
|
для: Trianon
(15.04.2010 в 17:13)
| | Сам в шоке =( | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 17:15)
| | ...работал Сковородник старательно, однако в азарт не входил. Стоило кому-нибудь всерьез или в шутку крикнуть: «Шабаш!», как Сковородник тут же закидывал багор на плечо, и уж никто не мог заставить его спихнуть лежащее на пути бревно. Мужики говорили, что, если у Сковородника загорится изба и он возьмется тушить ее, надо крикнуть: «Шабаш!», и он туг же перестанет лить воду...
Виктор Астафьев. Перевал. | |
|
|
|
|
|
|
|
для: Trianon
(15.04.2010 в 17:19)
| | =) Да я понял что за камни в моём саду, но сие не мой случай. Просто дома надо быть пораньше. Видимо там и продолжу мучить своё бедное приложение. | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 16:52)
| | а проверка правильности ввода данных уже делается отдельно, и не зависит от того кто кому написал, и это приват или нет:) | |
|
|
|
|
|
|
|
для: bab-nike
(15.04.2010 в 17:04)
| | Просто я по молодости и неопытности своей думал, что htmlspecialchar хватит всем... но видимо я ошибался. Когда вывод был обычный (text\html), то такого не было. А сейчас видимо теги в тегах... придётся, как вы правильно подметили, проводить ППВД отдельно. | |
|
|
|
|
|
|
|
для: Arconas
(15.04.2010 в 17:11)
| | Сделай таблицу приват ид ид_адресата ид_отправителя сообщение, что-то совсем тупая тема | |
|
|
|