Изпращане на масово съобщение до потребителите на сайта?

streleca_stz

Registered
Здравейте! Искам да ви попитам как би изглеждала заявката ако искам да изпратя 1 съобщение до всички регистрирани потребители? Напимер ако искам да съобщя нещо на всеки и да не го пиша по страниците на сайта? :)
 
Това ще стане с цикъл. Първо изпълняваш заявка, с която извличаш ID-тата на всички регистрирани потребители и после с цикъл ще си структурираш заявката, като имаш проверка дали си запълнил максилния брой редове и ако си изпращаш завката и започваш структурирането на нова заявка :)
PHP:
$sql=mysql_query("SELECT `ID` FROM `users` WHERE `active`=1");
$i=0;
while($row=mysql_fetch_assoc($sql)){
  $id=$row[ID];
  if($i>=2000){
    mysql_query($msg);
    $i=0;
  }elseif($i<2000){
     $msg.=" ,('1','$id','Syob6tenie')";
  }
if($i==0){
     $msg="INSERT INTO `messages`(`from`,`to`,`msg`) VALUES 
             ('1','$id','Syob6tenie')";
  }
$i++;
}
if($i!=0){
   mysql_query($msg);
}
 
И кво? Така ако в сайта му има 500 потребители, ти за всяко ново масово съобщение ще правиш 500 записа в базата данни?
 
tedo96 каза:
И кво? Така ако в сайта му има 500 потребители, ти за всяко ново масово съобщение ще правиш 500 записа в базата данни?
Ако иска всеки да го получи на лично съобщение. И не мога да разбера каккъв е проблема със записите в базата данни ?
 
HerpaMoTeH каза:
tedo96 каза:
И кво? Така ако в сайта му има 500 потребители, ти за всяко ново масово съобщение ще правиш 500 записа в базата данни?
Ако иска всеки да го получи на лично съобщение. И не мога да разбера каккъв е проблема със записите в базата данни ?
Този вариант е тотално неоптимизиран! Ако на 5 дни пуска такива съобщения? Тоест на месец да кажем ще пусне по 6. Това са ти 6масови съобщения x 500потребителя = 3 000реда в базата данни. Това е само за един месец...
При всяко влизане на даден потребител ще трябва да се обходят тези 3 000 реда.
 
tedo96 каза:
HerpaMoTeH каза:
tedo96 каза:
И кво? Така ако в сайта му има 500 потребители, ти за всяко ново масово съобщение ще правиш 500 записа в базата данни?
Ако иска всеки да го получи на лично съобщение. И не мога да разбера каккъв е проблема със записите в базата данни ?
Този вариант е тотално неоптимизиран! Ако на 5 дни пуска такива съобщения? Тоест на месец да кажем ще пусне по 6. Това са ти 6масови съобщения x 500потребителя = 3 000реда в базата данни. Това е само за един месец...
При всяко влизане на даден потребител ще трябва да се обходят тези 3 000 реда.
Амм.. тогава друг начин има ли? :idea:
 
tedo96 каза:
HerpaMoTeH каза:
tedo96 каза:
И кво? Така ако в сайта му има 500 потребители, ти за всяко ново масово съобщение ще правиш 500 записа в базата данни?
Ако иска всеки да го получи на лично съобщение. И не мога да разбера каккъв е проблема със записите в базата данни ?
Този вариант е тотално неоптимизиран! Ако на 5 дни пуска такива съобщения? Тоест на месец да кажем ще пусне по 6. Това са ти 6масови съобщения x 500потребителя = 3 000реда в базата данни. Това е само за един месец...
При всяко влизане на даден потребител ще трябва да се обходят тези 3 000 реда.
Много зависи с каква заявка обхождаш. Имам база данни с над 2 милиона реда и я обхождам без какъвто и да е проблем за под половин секунда. Сървъра не е на хостинг и не е много мощен :) Така че все още не мога да разбера какъв е проблема ?
 
За оптимизиране може да се направи и следното(ако трябва да се избегнат много записи в базата данни): правиш една колона massive, която да приема само 1 и 0, и ако е 1 правиш проверка в самия скрипт и изкарваш съобщението.
 
Не е много ясно каква е системата и дали съобщенията ще се изпращат или ще се показват в страницата, но аз бих използвал приблизително схемата на Relax4o, но по следния начин:

Правя си таблица със съобщенията messages:
id, message

Имам си таблица с потребителите, в която добавям едно поле LastMessage int.

Когато трябва да изпратя съобщения правя нещо такова

за всички потребители:
select * from users u, messages m where u.LastMessage<m.id

само за логнатия потребител:
select * from users u, messages m where u.LastMessage<m.id and u.id=$_SESSION['UserID']


и след като събера потребителите и съобщенията правя
update users set LastMessage=(select id from messages order by id desc limit 1)
или ако е само за логнатия потребител с where
update users set LastMessage=(select id from messages order by id desc limit 1) where id=$_SESSION['UserID']

Не вярвам това да отнеме кой-знае какъв ресурс.
 
'що просто не направиш една таблица само за масови съобщения? И в друга да се записват ид-тата на хората, който са го прочели. Така правиш само един запис към базата.

Друг вариант е/които не е удачен/:

PHP:
$admin = "admin";
$result = mysql_query("SELECT * FROM `users`;");
while ($row = mysql_fetch_array($result)) {
mysql_query("INSERT INTO `pm` ( `title` , `message` , `touser` , `from` , `unread` , `date` ) VALUES ('$title', '$text', '" . $row['username'] . "', '$admin', 'unread', NOW())");
}

П.П. предполагам колегите по-горе може и да са ти дали по-добро решение.
 

Горе