Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: usuniecie maili onetu z bazy
Forum PHP.pl > Forum > PHP
1q2w3e4r
Potrzebuję efektywnego rozwiązania, które będzie szybko działać na dużej ilości danych.
Mam np. bazę maili, z której potrzebuje:
1. wydobyć maile onetu we wszystkich domenach
2. przefiltrowanie tej bazy aby nie zawierała maili z onetu
Tablica:
  1. $maile_onet = array('onet.pl', 'op.pl', 'poczta.onet.pl', 'onet.eu', 'onet.com.pl', 'vp.pl', 'spoko.pl', 'vip.onet.pl', 'autograf.pl', 'opoczta.pl', 'buziaczek.pl', 'adres.pl', 'amorki.pl', 'poczta.onet.eu');

Można to zrobić za pomocą strpos() ale wydaje mi się, że nie jest to wydajne.
  1. $result = mysql_query("SELECT email FROM maile");
  2. while($r = mysql_fetch_array($result))
  3. {
  4. foreach($maile_onet as $kay=>$wartosc)
  5. {
  6. $pos = strpos($r['email'], $wartosc);
  7. if ($pos !== false)
  8. {
  9. echo $r['email'].'<br />';
  10. }
  11. }
  12. }


Proszę o jakiś lepszy przykład tych dwóch moich problemów.
IProSoft
Sprawdź testowo preg_match, sprawdza się dopiero przy dużej ilości danych do przetworzenia ale działa wtedy szybciej od strpos.
Różnica w czasie 2-3ms na 20k wyników, przynajmniej u mnie ale miałem trochę inne dane.
phpion
Podczas wykonywania zapytania do bazy możesz użyć chociażby NOT LIKE by pozbyć się niechcianych rekordów. Jak? Poszukaj sam.
tehaha
jeżeli to nie jest jednorazowa operacja, tylko działanie na bierząco to określaj domenę przy dodawaniu wiadomości w dodatkowej kolumnie tabeli, wtedy pobieranie będzie bardzo wydajne bo nic nie będzie trzeba filtrować
1q2w3e4r
Próbowałem tez tak, żeby było od razu na bazie:
  1. $maile_onet = array('onet.pl', 'op.pl', 'poczta.onet.pl', 'onet.eu', 'onet.com.pl', 'vp.pl', 'spoko.pl', 'vip.onet.pl', 'autograf.pl', 'opoczta.pl', 'buziaczek.pl', 'adres.pl', 'amorki.pl', 'poczta.onet.eu');
  2.  
  3. $query = "SELECT * FROM maile WHERE ";
  4. $a = 0;
  5. foreach($maile_onet as $kay=>$wartosc)
  6. {
  7. if($a == 0)
  8. {
  9. $query .= "email NOT LIKE '%@$wartosc'";
  10. }
  11. else
  12. {
  13. $query .= " OR email NOT LIKE '%@$wartosc'";
  14. }
  15. $a++;
  16. }
  17. //echo $query;
  18.  
  19. $result = mysql_query($query);
  20. while($r = mysql_fetch_array($result))
  21. {
  22. $mails = $r['email'];
  23. echo $mails.'<br />';
  24. }


Aby wykluczyć z listy wszystkie maile z onetu i dalej się pojawiają. Dlaczego?
k_@_m_i_l

  1. $maile_onet = array('onet.pl', 'op.pl', 'poczta.onet.pl', 'onet.eu', 'onet.com.pl', 'vp.pl', 'spoko.pl', 'vip.onet.pl', 'autograf.pl', 'opoczta.pl', 'buziaczek.pl', 'adres.pl', 'amorki.pl', 'poczta.onet.eu');
  2.  
  3. $query = "SELECT * FROM maile WHERE ";
  4. $where = array();
  5. foreach($maile_onet as $kay=>$wartosc)
  6. {
  7. $where[] = "email NOT LIKE '%@$wartosc'";
  8.  
  9. }
  10. //echo $query;
  11. $query .= implode(' AND ',$where);
  12. $result = mysql_query($query);
  13. while($r = mysql_fetch_array($result))
  14. {
  15. $mails = $r['email'];
  16. echo $mails.'<br />';
  17. }
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.