Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Newsletter, przechowywanie listy odbiorców
Forum PHP.pl > Forum > PHP
grzegory
Witajcie,
Mam taki o to problem. Mianowicie jestem w trakcie pisania newslettera/mailingu. Ma on być dość rozbudowany, wiadomości będą rozsyłane do firm pobieranych z bazy według roznego typu kryteriow (czas obecnosci w bazie, slowo kluczowe, grupa itd), akurat to nie jest najważniejsze.

Do tej pory pisząc mniejsze mailingi robiłem to dość prosto, formularz zawierał checkboxy z adresami i sie zaznaczało do kogo mają być wysłane maile.

Korzystałem przy tym z dwóch tabel:
Tabela: mailing = id | tytul | tresc | (...dodatkowe kolumny typu załączniki)
Tabela: mailing_send = id | id_mailing | email
Nastepnie robiłem:
SELECT `mailing`.*, `mailing_send`.* FROM `mailing`.`id`=`mailing_send`.`id_mailing`
Po pomyślnym wysłaniu rekord był kasowany... Proste i bardzo skuteczne. Zbyt proste.

Sprawdzało się to przy małej ilości adresów do rozesłania. W przypadku newslettera o którym teraz piszę, będzie zachodzić potrzeba wysłania 50-150tys maili. Nie wyobrażam sobie zbytnio ładowania wszystkich wybranych według kryteriów adresów. Chyba, że jest na to jakiś szybki sposob. Zrobiłbym to w pętli while jak przy normalnym pobieraniu kolejnych rekordów z bazy.

Co mi chodzi po głowie.
Co zrobić aby optymalnie przygotować listę adresów email do których mają zostać wysłane wiadomości? Przeznaczenie pod 50-150tys rekordów. Należy zaznaczyć, że w tym samym czasie może być rozsyłanych kilka róznych newsletterów z różną listą odbiorców.
mike
Co masz na myśli pisząc "ładowania"?

A odnośnie tematu, to jeśli maile są personalizowane to nie pozostaje Ci nic innego jak wysyłać pojedynczo. Jeśli natomiast każdy otrzymuje identycznego maila to możesz je wysyłać w paczkach, powiedzmy po 100 (100 adresów w polu bcc). I taka paczka co jakiś czas. pół minuty czy ileśtam sekund.

A odnośnie obciążenia bo chyba o to Ci chodzi to 150tys rekordów dla bazy to śmieszne pierdnięcie. Jakbyś ich miał klika(naście) milionów to można sie zastanawiać, ale przy tej ilości to pikuś.
grzegory
Przez załadowanie mówię tu o skopiowaniu odpowiednich adresów do przykładowej tabeli mailing_send (takiej jak w temacie.

Czy 150tys rekordów to piardniecie? Niesądzę, żeby PHP poradziło sobie z czyms takim lekko:
  1. <?php
  2. $q = mysql_query("SELECT * FROM ....... WHERE [tu warunki]");
  3. while($row = mysql_fetch_assoc($q))
  4.  {
  5. mysql_query("INSERT ........");
  6.  }
  7. ?>
mike
Cytat(grzegory @ 7.06.2008, 23:29:56 ) *
Niesądzę, żeby PHP poradziło sobie z czyms takim (...)
No staaaary, ale takie rzeczy to sie robi jednym zapytaniem.
INSERT ... SELECT Syntax
grzegory
Wiem o tym. Tak planowałem postąpić. Jednak...

Przykładowo, masz dwie tabele:
test1: id, grupa, mail
test2: id, mail

Wykonanie zapytania:
  1. <?php
  2. INSERT INTO `test2` SELECT `mail`, `grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>

Spowoduje to wstawienie w `test2`.`mail` wartosci z `test1`.`grupa`... A nie o to chodzi... Chyba ze masz na to jakies rozwiazanie, bo moze cos w tym zapytaniu robię zle poprostu?
mike
Cytat(grzegory @ 7.06.2008, 23:43:21 ) *
Spowoduje to wstawienie w `test2`.`mail` wartosci z `test1`.`grupa`... A nie o to chodzi... Chyba ze masz na to jakies rozwiazanie, bo moze cos w tym zapytaniu robię zle poprostu?
Dam linka jeszcze raz: INSERT ... SELECT Syntax. Przeanalizuj dokładniej wszystkie możliwości składni INSERT ... SELECT tongue.gif
grzegory
Albo sie nie rozumiemy, albo zle kombinuje i rozumuje.
Wiem, że chodzi Ci o przykład z komentarzy w manualu:
  1. <?php
  2. INSERT newtable (user,age,os) SELECT table1.user,table1.age,table2.os FROM table1,table2 WHERE table1.user=table2.user;
  3. ?>



Jednak gdy robię takie zapytanie:
  1. <?php
  2. INSERT INTO `test2`(`mail`) SELECT `test1`.`mail`, `test1`.`grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>


To zwraca błąd - kolumna nieistnieje...
Zas gdy dam tak:
  1. <?php
  2. INSERT INTO `test2`(`id`, `mail`) SELECT `test1`.`mail`, `test1`.`grupa` FROM `test1` WHERE `grupa`='2'
  3. ?>

To w `test2`.`mail` umieszcza mi `test1`.`grupa`...

Z tego wynika, że ilość kolumna które są wypełniane, musi być równa ilości kolumn z pobieranego zapytania. Nie o to chodzi. Zapytanie SELECT będzie miało wiele warunków, pewnie będą połączenia, dziwne rzeczy.. może być ich nawet kilkanaście. Zaś w tabeli `test2` zawsze bedzie mialo dwie kolumny id, mail. Czyli -według moich testów - niezadziała.
mike
Owszem zapytanie SELECT będzie miało wiele warunków ale koniec końców niezależnie od warunków zapytania powinieneś wyciągać dwie informacje - id i mail. Bo tylko to wstawiasz. Bo co Ci wyciągać grupę?

Jeśli wyciągniesz tylko id i mail to ilość pól w zbiorze wyników SELECT i w tabeli test2 będzie taka sama:
  1. INSERT INTO `test2`(`id`, `mail`) SELECT `test1`.`id`, `test1`.`mail` FROM `test1` WHERE `test1`.`grupa`='2'
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.