Usuniecie maili onetu z bazy


(1q2w3e4r) #1

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:

$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.

$result = mysql_query("SELECT email FROM maile");

		while($r = mysql_fetch_array($result)) 

		{

			foreach($maile_onet as $kay=>$wartosc)

			{

				$pos = strpos($r['email'], $wartosc);

				if ($pos !== false) 

				{

					echo $r['email'].'
';

				}

			}

		}

Proszę o jakiś lepszy przykład tych dwóch moich problemów.


(Kacper B Zuk) #2

Zmień zapytanie na coś w stylu:

SELECT email FROM maile WHERE email LIKE '%@onet.pl' OR email LIKE '%@op.pl' OR ...


(1q2w3e4r) #3

Próbowałem tez tak, żeby było od razu na bazie:

$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');


$query = "SELECT * FROM maile WHERE ";

		$a = 0;

		foreach($maile_onet as $kay=>$wartosc)

		{

			if($a == 0)

			{

				$query .= "email NOT LIKE '%@$wartosc'";

			}

			else

			{

				$query .= " OR email NOT LIKE '%@$wartosc'";

			}

			$a++;

		}

		//echo $query;


 	$result = mysql_query($query);

		while($r = mysql_fetch_array($result)) 

		{

			$mails = $r['email'];

			echo $mails.'
';

		}

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


(adpawl) #4

AND nie OR :wink: