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

Форум MySQL

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

 

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

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

тема: Приватные сообщения
 
 автор: sl1p   (02.10.2008 в 02:31)   письмо автору
 
 

Запутался однако.
таблица private:
ts int(11) //time();
nick_id int(11) //айди юзера которому принадлежит ящик
from_nick_id int(11) // айди юзера который пишет
msg text utf8_general_ci

<?php
$id 
$_SESSION['id'];
$limitcount mysql_result(mysql_query("SELECT COUNT(*) FROM private WHERE nick_id = '$id'"),0) - _PRIVATE_ROWS;
if(
$limitcount 0)mysql_query("DELETE FROM private WHERE nick_id = '$id' ORDER BY ts ASC LIMIT $limitcount");
$res mysql_query("SELECT * FROM (SELECT * FROM private WHERE nick_id = '$id' OR from_nick_id = '$id' ORDER BY ts DESC) as msg ORDER BY msg.ts ASC");
php?>


Получается нужно выводить все последние сообщения которые получил/отправил юзверь.
Если сообщений в ящике данного юзера больше чем _PRIVATE_ROWS то удаляем ранние.

Всё вроде бы круто, но проблема заключается в том что при удалении сообщений,так же пропадают и у того кто отправил, тоесть исчезают посреди сообщений.. Запутался как нормально реализовать...

  Ответить  
 
 автор: sl1p   (02.10.2008 в 22:00)   письмо автору
 
   для: sl1p   (02.10.2008 в 02:31)
 

хай как дела

  Ответить  
 
 автор: cheops   (03.10.2008 в 04:47)   письмо автору
 
   для: sl1p   (02.10.2008 в 02:31)
 

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

  Ответить  
 
 автор: sl1p   (03.10.2008 в 16:47)   письмо автору
 
   для: cheops   (03.10.2008 в 04:47)
 

да нет не жесткое)
ну единственное хотелось бы сделать чтобы юзер изменял _PRIVATE_ROWS по своему желанию.. но это в принципе не важно.

хм, а предложите тогда свой вариант с датой..
типа удалять всё что ниже сегодняшнего на столько-то?

  Ответить  
 
 автор: cheops   (04.10.2008 в 00:24)   письмо автору
 
   для: sl1p   (03.10.2008 в 16:47)
 

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

  Ответить  
 
 автор: sl1p   (04.10.2008 в 08:54)   письмо автору
 
   для: cheops   (04.10.2008 в 00:24)
 

Хм идея в принципе интересная, но это есть чат и такого будет не мало*2..
не загнётся ли бд?)

и ещё если цепляться за ваш вариант,то как сравнить 2 таймстампа не переводя его в "понимаемую" дату...?)Тоесть как узнать между ними нужную мне разницу?

  Ответить  
 
 автор: cheops   (04.10.2008 в 10:52)   письмо автору
 
   для: sl1p   (04.10.2008 в 08:54)
 

>Хм идея в принципе интересная, но это есть чат и такого будет не мало*2..
>не загнётся ли бд?)
Да не должна, иначе у вас двухкратный скачок посещаемости будет приводить к загибу :))) Обычно влияет, если увеличение объема или нагрузки возрастает на порядки, а в разы - это не страшно.

>и ещё если цепляться за ваш вариант,то как сравнить 2 таймстампа не переводя его в "понимаемую" дату...?)Тоесть как узнать между ними нужную мне разницу?
Здесь удобно воспользоваться функцией FROM_UNIXTIME(), которая переводит время из TIMESTAMP-формата в MySQL-представление. Например, следующий запрос удаляет все записи, которым больше 1 месяца
DELETE FROM private 
WHERE nick_id = '$id' AND FROM_UNIXTIME(ts) < NOW() - INTERVAL 1 MONTH

  Ответить  
 
 автор: Trianon   (04.10.2008 в 11:21)   письмо автору
 
   для: cheops   (04.10.2008 в 10:52)
 

Тогда уж лучше сосчитать границу средствами php
$range = strtotime('-1 month');
$sql = "DELETE FROM private WHERE nick_id = '$id' AND ts < $range";

  Ответить  
 
 автор: sl1p   (04.10.2008 в 12:09)   письмо автору
 
   для: sl1p   (02.10.2008 в 02:31)
 

всем огромнейшее спасибо!:)

  Ответить  
 
 автор: sl1p   (04.10.2008 в 12:31)   письмо автору
 
   для: sl1p   (04.10.2008 в 12:09)
 

упс забыл спросить:)
возможно ли както добавить 2 записи одним запросом?..

делаю так:
mysql_query("INSERT INTO `private` ( `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` ) VALUES('$ts','$whom_id','$whom_id','$from_id','$msg')");
mysql_query("INSERT INTO `private` ( `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` ) VALUES('$ts','$from_id','$whom_id','$from_id','$msg')");

не пишет изза одинакового поля ts /primary key
.. как вылечить?)

  Ответить  
 
 автор: cheops   (04.10.2008 в 13:42)   письмо автору
 
   для: sl1p   (04.10.2008 в 12:31)
 

Лучше введите сурогатный первичный ключ id (снабдив его атрибутом AUTO_INCREMENT), а ts сделайте обычным полем - иначе у вас в одно и то же время нельзя будет отправлять разные сообщения - только одно сообщение в секунду. Для добавления двух записей можно использовать многострочный INSERT
<?php
  $query 
"INSERT INTO `private` (`id`, `ts` , `owner_nick_id` , `whom_nick_id` , `from_nick_id` , `msg` ) 
VALUES(NULL, '
$ts','$whom_id','$whom_id','$from_id','$msg'), (NULL, '$ts','$whom_id','$whom_id','$from_id','$msg')";
?>

  Ответить  
 
 автор: sl1p   (04.10.2008 в 17:19)   письмо автору
 
   для: cheops   (04.10.2008 в 13:42)
 

Хм, спасибо.. я просто босюь этих авто_инкрементов ибо поле типа инт заканчивается когдато.. настораживает немного)

хух полегчало) сделал наконец) спасибо ещё раз)

  Ответить  
 
 автор: cheops   (04.10.2008 в 19:22)   письмо автору
 
   для: sl1p   (04.10.2008 в 17:19)
 

>Хм, спасибо.. я просто босюь этих авто_инкрементов ибо поле типа инт заканчивается когдато.. настораживает немного)
Используйте BIGINT - его исчерпать практически нереально. Я по крайней мере ещё не разу не сталкивался с ситуацией, когда он исчерпывался.

  Ответить  
 
 автор: sl1p   (04.10.2008 в 19:54)   письмо автору
 
   для: cheops   (04.10.2008 в 19:22)
 

так и сделал:) будем надеяться на лучшее :D

  Ответить  
 
 автор: BinLaden   (05.10.2008 в 10:41)   письмо автору
 
   для: cheops   (04.10.2008 в 19:22)
 

> Используйте BIGINT <...> Я по крайней мере ещё не разу не сталкивался с ситуацией, когда он исчерпывался.

А что, Вы встречались с ситуацией, когда INT не хватало? :)

  Ответить  
 
 автор: cheops   (05.10.2008 в 11:03)   письмо автору
 
   для: BinLaden   (05.10.2008 в 10:41)
 

Один раз было дело... не помню что за приложение было, но была необходимость очень часто вставлять и удалять записи. Ну а вообще да, в подавляющем большинстве случаев вполне достаточно типа INT.

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

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