|
|
|
|
|
для: ZetRider
(04.04.2012 в 22:40)
| | кстати эта логика больше похожа на чат, чем на обычные личные сообщения
но это смотря как оформить, если проводить инициацию разговора каждый раз - то это личка, если только для начала разговора с новым пользователем, то что-то типа лички/мгновенных сообщений, если позволить присоединяться к разговору, то это чат
___
добавил еще столбец to_id для идентификатора пользователя
но это уже больше для чата нужно, для отправки приватных сообщений | |
|
|
|
|
 2.6 Кб |
|
|
для: ZetRider
(04.04.2012 в 22:40)
| | сделал dump так проще таблицы сделать | |
|
|
|
|
|
|
|
для: ZetRider
(04.04.2012 в 22:40)
| | по поводу удаления сообщений (из другой вашей темы)
если это реализовывать при моем варианте, то нужно удалить строку из таблицы ac_post где есть сопоставление идентификатора пользователя идентификатору разговора (естественно запомнив этот идентификатор разговора) и проверить встречается ли этот идентификатор в таблице еще раз после удаления т.е имеет ли кто нибудь еще разрешение на просмотр этой переписки
и тут уже по обстоятельствам и желанию
можно удалить все сообщения из таблицы post которые имеют только что удаленный идентификатор
ну или перенести в архив это все, в общем на что хватит фантазии
___
это как раз наглядный пример организации таблиц в БД
вы поставили задачу, а у меня уже готовое решение :) | |
|
|
|
|
|
|
|
для: Valick
(04.04.2012 в 22:37)
| | Да конечно! Спасибо, так будет проще понять | |
|
|
|
|
 5.5 Кб |
|
|
для: ZetRider
(04.04.2012 в 22:31)
| | мне проще сюда прикрепить :)
там по ходу разберетесь какие таблицы создать | |
|
|
|
|
|
|
|
для: Valick
(04.04.2012 в 22:29)
| | буду очень благодарен zetrider[@]bk.ru | |
|
|
|
|
|
|
|
для: ZetRider
(04.04.2012 в 22:21)
| | если хотите могу скинуть вам свои наброски, там конечно не готовый код а только тот минимум который нужен для проверки логики | |
|
|
|
|
|
|
|
для: Valick
(04.04.2012 в 22:14)
| | Спасибо! Вы правы, верно пока пользователь будет писать сообщение, в новом диалоге между другими пользователями может оказаться тот же unique ))
Буду разбирать Ваш алгоритм. | |
|
|
|
|
|
|
|
для: ZetRider
(04.04.2012 в 21:35)
| | ничего хорошего не могу сказать про ваш код
например
"SELECT msg_unique FROM messages_list ORDER BY msg_unique DESC LIMIT 1";
это верёвочная лестница над пропастью
не забывайте в реальных приложениях доступ к бд одновременно имеет большое количество пользователей, и логика изначально должна это подразумевать
сам уже запутался, но вроде все работает.
это плохо что запутались :) | |
|
|
|
|
|
|
|
для: Valick
(30.03.2012 в 22:35)
| | Valick, большое спасибо, очень интересно и познавательно но слишком сложно для решения моей задачки. Хотя может зря так считаю.
Ваш вариант алгоритма очень хорош, но я пошел немного другим путем, что Вы скажите на это вариант?:
Создаем таблицу messages_list:
id,
msg_unique,
user_id,
user_to,
messages,
date,
reply (default = 0)
Создаем функции (примеры):
<?php
/* Проверяем есть ли переписка между пользователями */
function check_unique($user_ID, $user_to) {
$res = "SELECT msg_unique FROM messages_list WHERE ((user_id = '$user_ID' AND user_to = '$user_to') OR (user_id = '$user_to' AND user_to = '$user_ID')) ORDER BY date DESC";
if(count($res) == 0) {
$unique = max_unique(); // чуть ниже
} else {
foreach ($res as $row) {
$unique = $row->msg_unique;
}
}
return $unique;
}
/* Получаем максимальный unique */
function max_unique() {
$query_unique = "SELECT msg_unique FROM messages_list ORDER BY msg_unique DESC LIMIT 1";
if (empty($query_unique)) {
$unique = "1";
} else {
foreach ($query_unique as $query_unique_row) {
$unique = $query_unique_row->msg_unique + 1;
}
}
return $unique;
}
/* ID последнего сообщения при записи */
function last_reply_msg($msg_unique='') {
$msg_unique = intval($msg_unique);
$res = "SELECT * FROM messages_list WHERE msg_unique = '$msg_unique' ORDER BY date DESC LIMIT 1";
if(count($res) == 0) {
return false;
} else {
foreach ($res as $row) {
return $row->id;
}
}
}
?>
|
Допустим в таблице уже есть запись:
id | msg_unique | user_id | user_to | messages | date | reply
1 | 1 | 1(катя) | 2(вася) | text | .... | 0
|
Когда Вася пишет Маше сообщение мы проверяем был ли у них диалог ( check_unique() ), если да то присваиваем его номер, если нет то присваиваем новый максимальный ( max_unique() )
Так же перед постом нового сообщения у предыдущего то есть пока что последнего мы ставим статус в столбец reply 1, что означает на него есть ответ.
Таблица принимает следующий вид:
id | msg_unique | user_id | user_to | messages | date | reply
1 | 1 | 1(катя) | 2(вася) | text | .... | 1
2 | 1 | 2(вася) | 1(катя) | text | .... | 0
|
Теперь как же вывести лист последних сообщений:
<?php
$res = "SELECT * FROM messages_list WHERE (user_id = '$user_ID' OR user_to = '$user_ID') AND reply = '0' GROUP BY `msg_unique` ORDER BY `date` DESC");
?>
|
так мы получили последнее сообщение на которое нет ответа.
сам уже запутался, но вроде все работает. | |
|
|
|
|