Script wat in mysql db checkt of email adressen vaild zijn
Ik heb een database met daarin een lijst met email naw gegevens incl email adresse.
Nu is het zo dat er een aantal email adressen in de lijst zijn waar bv geen @ of .nl/com enzl achter staat. Ik heb iets nodig dat de gehele database doorloopt en checkt of de email adressen kloppen. Zou iemand me hier mee kunnen helpen alvast bedankt!
GR O_R
Het gaat om een regex voor email (google) dan vind je genoeg resultaten om te kunnen controleren of het een email adres is.
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
edit: even regex opgezocht.
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
$start=$_GET['start'];
$end=$_GET['end'];
include( '../db.inc.php' );
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM $table LIMIT $start,$end";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close();
$i=0;
while ($i < $num) {
$veld0=mysql_result($result,$i,"id");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
if(!eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $veld5)){
##############
#Print tabel en daarin de gebruikers code heb ik al maar is anders beetje veel om hier te zetten
##############
}else{
#niks doen
}
++$i;
}
?>
$start=$_GET['start'];
$end=$_GET['end'];
include( '../db.inc.php' );
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM $table LIMIT $start,$end";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close();
$i=0;
while ($i < $num) {
$veld0=mysql_result($result,$i,"id");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
if(!eregi("^[a-zA-Z0-9_]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$]", $veld5)){
##############
#Print tabel en daarin de gebruikers code heb ik al maar is anders beetje veel om hier te zetten
##############
}else{
#niks doen
}
++$i;
}
?>
ik heb nu het bovenstaande,maar dit werkt niet.
Gewijzigd op 01/01/1970 01:00:00 door OMEGA_ReD
bovendien kan je scriptt niet eens, je sluit mysql en vraagt daarna weer resultaten aan
maar dan kan ik toch niet me hele database door lopen en alle mail adressen controlleren. en ik moet ook de informatie uit de database halen (naam id)
Nu geeft hij een niet valid terwijl het adres wel klopt.
Het kan zijn dat ik het script verkeerd begrijp.
Code (php)
Gewijzigd op 01/01/1970 01:00:00 door OMEGA_ReD
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
<?
function check_email_mx($email)
{
if((preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)))
{
$host = explode('@', $email);
if(checkdnsrr($host[1].'.', 'MX') ) return true;
if(checkdnsrr($host[1].'.', 'A') ) return true;
if(checkdnsrr($host[1].'.', 'CNAME') ) return true;
}
return false;
}
if(!function_exists('checkdnsrr'))
{
function checkdnsrr($host, $type = '')
{
if(!empty($host))
{
if($type == '') $type = "MX";
@exec("nslookup -type=$type $host", $output);
while(list($k, $line) = each($output))
{
if(eregi("^$host", $line))
{
return true;
}
}
return false;
}
}
}
?>
MAAK TABEL AAN (ROW'S WORDEN BENEDEN TOEGEVOEGD)
<?
$start=$_GET['start'];
$end=$_GET['end'];
include( '../db.inc.php' );
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM $table LIMIT $start,$end";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close();
$i=0;
while ($i < $num) {
$veld0=mysql_result($result,$i,"id");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
if(!check_email_mx($veld5)){
?>
VUL TABEL MET EEN ROW (ENTRY WAARVAN EMAIL NIET KLOPT, TABEL WORDT BOVEN AANGEMAAKT)
<?
}
++$i;
}
?>
function check_email_mx($email)
{
if((preg_match('/(@.*@)|(\.\.)|(@\.)|(\.@)|(^\.)/', $email)) || (preg_match('/^.+\@(\[?)[a-zA-Z0-9\-\.]+\.([a-zA-Z]{2,3}|[0-9]{1,3})(\]?)$/',$email)))
{
$host = explode('@', $email);
if(checkdnsrr($host[1].'.', 'MX') ) return true;
if(checkdnsrr($host[1].'.', 'A') ) return true;
if(checkdnsrr($host[1].'.', 'CNAME') ) return true;
}
return false;
}
if(!function_exists('checkdnsrr'))
{
function checkdnsrr($host, $type = '')
{
if(!empty($host))
{
if($type == '') $type = "MX";
@exec("nslookup -type=$type $host", $output);
while(list($k, $line) = each($output))
{
if(eregi("^$host", $line))
{
return true;
}
}
return false;
}
}
}
?>
MAAK TABEL AAN (ROW'S WORDEN BENEDEN TOEGEVOEGD)
<?
$start=$_GET['start'];
$end=$_GET['end'];
include( '../db.inc.php' );
mysql_connect($host,$username,$password);
@mysql_select_db($database) or die( "Unable to select database");
$query="SELECT * FROM $table LIMIT $start,$end";
$result=mysql_query($query);
$num=mysql_num_rows($result);
mysql_close();
$i=0;
while ($i < $num) {
$veld0=mysql_result($result,$i,"id");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
if(!check_email_mx($veld5)){
?>
VUL TABEL MET EEN ROW (ENTRY WAARVAN EMAIL NIET KLOPT, TABEL WORDT BOVEN AANGEMAAKT)
<?
}
++$i;
}
?>
Gewijzigd op 01/01/1970 01:00:00 door OMEGA_ReD
Code (php)
1
2
3
2
3
CREATE DOMAIN emailaddress
AS varchar
CONSTRAINT emailaddress_check CHECK (((VALUE)::text ~ E'^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([.-][a-z0-9]+)*)+\\.[a-z]{2,}$'::text));
AS varchar
CONSTRAINT emailaddress_check CHECK (((VALUE)::text ~ E'^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([.-][a-z0-9]+)*)+\\.[a-z]{2,}$'::text));
Vervolgens maak je een tabel aan waarin je ook een kolom van het datatype 'emailaddress'. Hierin zet je alle emailadressen en klaar ben je. Geef je een ongeldig emailadres op, zal de database keurig een foutmelding geven op de query.
Gewijzigd op 01/01/1970 01:00:00 door Frank -
Quote:
$veld0=mysql_result($result,$i,"id");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
$veld1=mysql_result($result,$i,"veld1");
$veld2=mysql_result($result,$i,"veld2");
$veld3=mysql_result($result,$i,"veld3");
$veld4=mysql_result($result,$i,"veld4");
$veld5=mysql_result($result,$i,"veld5"); #email adres
$veld6=mysql_result($result,$i,"veld6");
$veld7=mysql_result($result,$i,"veld7");
$veld8=mysql_result($result,$i,"veld8");
$veld9=mysql_result($result,$i,"veld9");
$veld10=mysql_result($result,$i,"veld10");
$veld11=mysql_result($result,$i,"veld11");
Dit slaat gewoon nergens op.
edit:
gogo frank Postgres promotie.. Dadelijk gaan we nog denken dat je klanten probeert te werven voor Postgres :P
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Frank schreef op 16.03.2007 13:24:
Gebruik i.p.v. MySQL een database die zélf controleert of een emailadres wel een emailadres is. In bv. PostgreSQLkun je zelf een datatype aanmaken:
Vervolgens maak je een tabel aan waarin je ook een kolom van het datatype 'emailaddress'. Hierin zet je alle emailadressen en klaar ben je. Geef je een ongeldig emailadres op, zal de database keurig een foutmelding geven op de query.
Code (php)
1
2
3
2
3
CREATE DOMAIN emailaddress
AS varchar
CONSTRAINT emailaddress_check CHECK (((VALUE)::text ~ E'^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([.-][a-z0-9]+)*)+\\.[a-z]{2,}$'::text));
AS varchar
CONSTRAINT emailaddress_check CHECK (((VALUE)::text ~ E'^[a-z0-9]+([_\\.-][a-z0-9]+)*@([a-z0-9]+([.-][a-z0-9]+)*)+\\.[a-z]{2,}$'::text));
Vervolgens maak je een tabel aan waarin je ook een kolom van het datatype 'emailaddress'. Hierin zet je alle emailadressen en klaar ben je. Geef je een ongeldig emailadres op, zal de database keurig een foutmelding geven op de query.
Hoort zoiets niet in de code zélf te gebeuren, in plaats van dat je de logica op de database afschuift ? Omgekeerde wereld lijkt me.
Ben er wel benieuwd naar, kan ik van leren :>
Bedankt!!
edit:
Als je er van wil leren zou ik eerst maar eens in basisfuncties gaan verdiepen zoals eenvoudige tellers, en als dat lukt iets van nieuwsystemen gevolgd door loginsystemen.
Als je dat allemaal snapt komt je hier moeiteloos uit denk ik zo. mijn code dat ik gemaakt hebt(Niet getest!) heb ik zo ff in 2 minuten getypt.
Gewijzigd op 01/01/1970 01:00:00 door Jurgen assaasas
Waarom roep je met een datum wel dat je dit in een DATE moet opslaan en niet in een VARCHAR, maar zeg je met een emailadres dat dit gewoon in een VARCHAR moet komen? Dát lijkt mij pas de omgekeerde wereld.
Dat jij zelf een datatype aanmaakt, doet niets af aan de vorm van de data. Zo zou je bv. ook een datatype 'postcode_nl' kunnen maken om nederlandse postcodes in op te slaan. Je weet dan 100% zeker dat daar een code in komt te staan die valide is. Of de postcode bestaat is een ander verhaal, dát is een check die je elders uitvoert, dat heeft namelijk niets te maken met het datatype.
Voordeel is ook dat wanneer meerdere systemen van dezelfde database gebruik maken, er helemaal niemand is die corrupte data in de database kan wegschrijven. Een emailaddress is een emailaddress en een postcode_nl is een postcode_nl. Ongeacht wat de programmeurs van de diverse systemen in gedachten hebben.
Jurgen schreef op 16.03.2007 13:37:
Eigenlijk niet. De database is veel beter in het controleren van zijn velden dan PHP.
edit:
Als je er van wil leren zou ik eerst maar eens in basisfuncties gaan verdiepen zoals eenvoudige tellers, en als dat lukt iets van nieuwsystemen gevolgd door loginsystemen.
Als je dat allemaal snapt komt je hier moeiteloos uit denk ik zo. mijn code dat ik gemaakt hebt(Niet getest!) heb ik zo ff in 2 minuten getypt.
edit:
Als je er van wil leren zou ik eerst maar eens in basisfuncties gaan verdiepen zoals eenvoudige tellers, en als dat lukt iets van nieuwsystemen gevolgd door loginsystemen.
Als je dat allemaal snapt komt je hier moeiteloos uit denk ik zo. mijn code dat ik gemaakt hebt(Niet getest!) heb ik zo ff in 2 minuten getypt.
Oke begrijp ik maar ik zou wel willen weten hoe ik mijn mysql dmv een query moet zeggen dat hij velden met niet corecte email adressen moet selecteren.
Ik gebruik normaal ook query's om dit soort dingen te doen, maar in dit geval weet ik geen andere oplossing.
Mijn script geeft een deelse oplossing dit is PHPhulp en niet PHPkauwmijcodevoor dus zou je zelf ook wel beetje moeten gaan stoeien met de code.
Jurgen schreef op 16.03.2007 16:47:
Mijn script geeft een deelse oplossing dit is PHPhulp en niet PHPkauwmijcodevoor dus zou je zelf ook wel beetje moeten gaan stoeien met de code.
ja dat snap ik ook, ik waardeer het ook enorm dat jij/jullie me gehoplen heb(ben).
Maar uiteindelijk heb ik toch door zoeken en zelf coden een oplossing gevonden. (uiteraard met jullie hulp) En ik heb ook echt lang met codes geklooid geoof me haha.
En jij zegt uiteindelijk dat wat ik gemaakt heb een "lelijke oplossing" is. Dan maak je mij en misschien andere die deze post lezen natuurlijk nieuwschierig naar jouw oplossing. En van jouw oplossing kan ik en misschien andere leren.
bedankt!
Gewijzigd op 01/01/1970 01:00:00 door OMEGA_ReD
de check of een email adres valid is kan mysql ook uitvoeren. kijk hiervoor in de handleiding bij REGEXP
Code (php)
1
SELECT * FROM `table_name` WHERE Email REGEXP '^[A-Z0-9._%-]+@[A-Z0-9.-]+\.[A-Z]{2,4}$')
Toch is het wel mooi dat het php script kijkt of de domein namen bestaan, duurt even maar werkt wel!
Het is weinig zinvol om eerst een query naar de database te sturen die controleert of de input correct is en op basis van dit resultaat een andere query naar de database sturen om de data ook op te gaan slaan. Wanneer je het op deze manier aanpakt, ben je wel verplicht om een functie in MySQL te schrijven (geen probleem, ik doe in PostgreSQL niet anders) maar desondanks blijft het erg eenvoudig om de data te vernaggelen. Je kunt namelijk altijd met een INSERT INTO de hele boel om zeep helpen. Dat is in PostgreSQL met het gebruik van een check-constraint onmogelijk.
PostgreSQL is dus in staat om de data op de juiste manier te beschermen. En dat is precies wat je verwacht van een dbms!