Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как правильно организовать в чате приват?
 
 автор: Arconas   (15.04.2010 в 12:37)   письмо автору
 
 

Замучился с организацией в чате приватных сообщений. Не могли бы вы мне помочь добрым советом как правильно все это дело построить?
Задача состоит в том, чтобы в общем списке сообщений отображать приватные для конкретного человека и скрывать соответственно эти сообщения от других =). В базе есть таблица 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`овый, опенсурсный. Там приват каким-то хитрым образом строится на основе генерации уникального числа. Число присваивается пользователю, а вот что делается дальше я так и не понял. Чат навороченный, куча классов, методов и что откуда берется понять сложно.

  Ответить  
 
 автор: serenya1983   (15.04.2010 в 14:51)   письмо автору
 
   для: Arconas   (15.04.2010 в 12:37)
 

Может когда человек отправил приватное сообщение, то в начале этого сообщения поставить какой-нить признак этого, например идентификатор того кому он его отправил, а при выводе проверять выводить всем или только определённому клиенту!!!
например, написали сообщение "Примет", в BD сохранить "id012345 Привет",
где id012345 идентификатор того кто должен получить!!!

  Ответить  
 
 автор: Arconas   (15.04.2010 в 16:33)   письмо автору
 
   для: serenya1983   (15.04.2010 в 14:51)
 

С идентификатором идея крайне хорошая, но вот как именно выводить только определенному клиенту? В этом как бы и весь затор. Хотя логика мне теперь более-менее понятно. Надо поиграться с запросами и идентификаторами...

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 15:26)   письмо автору
 
   для: 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.

  Ответить  
 
 автор: Arconas   (15.04.2010 в 16:42)   письмо автору
 
   для: bab-nike   (15.04.2010 в 15:26)
 

Попробую поиграться с запросами, спасибо за совет.

> при активном чикбоксе -нужен привт, а значит id_from и id_to принимают значение кому и от кого соответсвенно.

То есть если стоит галочка, то запросы в базу идут по логике "Выводить мне все сообщения, где id_from равняется моему id, а id_to равняется id моего приятеля, которому я этот приват пишу"?

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 16:47)   письмо автору
 
   для: Arconas   (15.04.2010 в 16:42)
 

я from и for перепутал, сейчас объясну логику

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 16:52)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:47)
 

пускай поля будут priv1 и priv2
1) Я пишу ДРУГУ, priv1=МОЙ_ИД priv2=ИД_ДРУГА
в итоге он читает все сообщения, + те, где priv1 или priv2 =ИД_ДРУГА
я читаю все сообщеня, + те, где priv1 или priv2 =МОЙ_ИД
2)ДРУГ пишет МНЕ, priv1=ИД_ДРУГА priv2=МОЙ_ИД
в итоге я читаю все сообщеня, + те, где priv1 или priv2 =МОЙ_ИД
он читает все сообщения, + те, где priv1 или priv2 =ИД_ДРУГА

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:05)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:52)
 

Благодарю. Как раз именно то, что мне необходимо. Завтра обязательно опробую способ и поправлю запросы. Сегодня уже не успеваю =(

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:01)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:47)
 

=) Я заметил, но это не так критично, ход мысли я понял.

  Ответить  
 
 автор: Arconas   (15.04.2010 в 16:52)   письмо автору
 
   для: 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; } 


Вот он код вывода...

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 16:54)   письмо автору
 
   для: Arconas   (15.04.2010 в 16:52)
 

это код вывода, а не запрос,

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:03)   письмо автору
 
   для: bab-nike   (15.04.2010 в 16:54)
 

Запросы я пока не правил. До конца рабочего дня 15 минут осталось. Не успею уже сделать и потестировать. Я вот сейчас завалился на том, что подобный вывод позволяет пропускать теги чего не следует делать...

  Ответить  
 
 автор: Trianon   (15.04.2010 в 17:13)   письмо автору
 
   для: Arconas   (15.04.2010 в 17:03)
 

>До конца рабочего дня 15 минут осталось.

Кошмар.

>Не успею уже сделать и потестировать.

Ужас и кошмар.

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:15)   письмо автору
 
   для: Trianon   (15.04.2010 в 17:13)
 

Сам в шоке =(

  Ответить  
 
 автор: Trianon   (15.04.2010 в 17:19)   письмо автору
 
   для: Arconas   (15.04.2010 в 17:15)
 

...работал Сковородник старательно, однако в азарт не входил. Стоило кому-нибудь всерьез или в шутку крикнуть: «Шабаш!», как Сковородник тут же закидывал багор на плечо, и уж никто не мог заставить его спихнуть лежащее на пути бревно. Мужики говорили, что, если у Сковородника загорится изба и он возьмется тушить ее, надо крикнуть: «Шабаш!», и он туг же перестанет лить воду...

Виктор Астафьев. Перевал.

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:26)   письмо автору
 
   для: Trianon   (15.04.2010 в 17:19)
 

=) Да я понял что за камни в моём саду, но сие не мой случай. Просто дома надо быть пораньше. Видимо там и продолжу мучить своё бедное приложение.

  Ответить  
 
 автор: bab-nike   (15.04.2010 в 17:04)   письмо автору
 
   для: Arconas   (15.04.2010 в 16:52)
 

а проверка правильности ввода данных уже делается отдельно, и не зависит от того кто кому написал, и это приват или нет:)

  Ответить  
 
 автор: Arconas   (15.04.2010 в 17:11)   письмо автору
 
   для: bab-nike   (15.04.2010 в 17:04)
 

Просто я по молодости и неопытности своей думал, что htmlspecialchar хватит всем... но видимо я ошибался. Когда вывод был обычный (text\html), то такого не было. А сейчас видимо теги в тегах... придётся, как вы правильно подметили, проводить ППВД отдельно.

  Ответить  
 
 автор: Красная_шляпа   (16.04.2010 в 09:33)   письмо автору
 
   для: Arconas   (15.04.2010 в 17:11)
 

Сделай таблицу приват ид ид_адресата ид_отправителя сообщение, что-то совсем тупая тема

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования