Avatar billede Frederik Nybegynder
12. juli 2011 - 21:22 Der er 18 kommentarer og
1 løsning

Hjælp til validering af E-mail samt kontrol om E-mail allerede findes i databasen

Hej

Jeg har et script der sender nogle data på en bruger til en mysql database.

Som overskriften beskriver, mangler jeg hjælp til at kontrollere om brugerens email allerede er oprettet (hvilket den ikke må være) og om email adressen er valid.

Jeg håber I kan hjælpe!
Avatar billede webweaver Praktikant
12. juli 2011 - 21:35 #1
Checker om mail valid ved brug af regex:

<?php

define("PATTERN_EMAIL", "/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/");

$email = $_POST["email"];

if (!preg_match(PATTERN_EMAIL, $email)) {
echo "Ugyldig mail";
} else {
echo "Mail er godkendt";
}           

?>


For at checke om mailen er i databasen i forvejen:

<?php

$email = $_POST["email"];

$query = mysql_query("SELECT mail FROM table WHERE mail = '$email' LIMIT 1") or die (mysql_error());

$count = mysql_num_rows($query);

if ($count > 1) {
echo "Mailen findes allerede";
} else {
echo "Mailen er godkendt";
}

?>
Avatar billede webweaver Praktikant
12. juli 2011 - 21:40 #2
Lige en tastefejl. Gik lige hurtigt nok.

if ($count > 1) {


skal være

if ($count >= 1) {
Avatar billede Frederik Nybegynder
12. juli 2011 - 21:49 #3
Tak for det hurtige svar!
Jeg har fået e-mailfunktionen til at virke - SUPER!

Men jeg kan ikke rigtig gennemskue hvor jeg skal flette den anden kode ind i min egen kode.

her er et udpluk af min kode:
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db);
mysql_query("insert into brugergruppe (fornavn, efternavn, adresse, alder, koen, email, tlfnr) values ('$fornavn', '$efternavn', '$adresse', '$alder', '$koen', '$email', '$tlfnr')")
or die(mysql_error());
print "Kære <b>\"$fornavn $efternavn\"</b> tak for din henvendelse. Du er nu oprettet som bruger.";

Kan du gennemskue hvor kontrollen af, om emailen allerede eksisterer skal tilføjes?
Avatar billede webweaver Praktikant
12. juli 2011 - 22:14 #4
Det skal du have forinden du smider noget i databasen.
Udfra nogle if sætninger, afgøres det så om du må smide det i databasen eller ej.

Noget i stil med,

<?php

if (isset($_POST["sendt"]) { // Checker om der er klikket submit

define("PATTERN_EMAIL", "/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/");

$email = $_POST["email"];

if (!preg_match(PATTERN_EMAIL, $email)) {
$error = "<p>Ugyldig mail.</p><br>";
}

// Du connecter til MySQL her ...

$query = mysql_query("SELECT mail FROM table WHERE mail = '$email' LIMIT 1") or die (mysql_error());

$count = mysql_num_rows($query);

if ($count >= 1) {
$error .= "<p>Mailen eksisterer i forvejen.</p><br>";
}
         
if (!$error) {

mysql_query("insert into brugergruppe (fornavn, efternavn, adresse, alder, koen, email, tlfnr) values ('$fornavn', '$efternavn', '$adresse', '$alder', '$koen', '$email', '$tlfnr')")
or die(mysql_error());
print "Kære <b>\"$fornavn $efternavn\"</b> tak for din henvendelse. Du er nu oprettet som bruger.";

} else {

echo $error;

}


}

?>


Sådan. Så har du en helt simpel løsning, der først validerer dine data. Hvis der er fejl, viser den fejlene og hvis der ikke er nogen, smider den data i databasen.
Avatar billede NielsErikP Mester
12. juli 2011 - 22:11 #5
Hej..
Lytter lige med :-)
Avatar billede Frederik Nybegynder
12. juli 2011 - 22:35 #6
Jeg har nu forsøgt at flette de to stykker kode sammen og er nået frem til:

<?php
require("config.php");
$add = &$HTTP_POST_VARS['add'];
if(empty($add)) {
  ?>
  <br><a href="index.php?pageid=2">Fejl! Alle felterne skal udfyldes. Tryk her for at blive sendt til oprettelsesformularen.</a>
  <?php
  } else {
define("PATTERN_EMAIL", "/^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$/");
$fornavn = &$HTTP_POST_VARS['fornavn'];
$efternavn = &$HTTP_POST_VARS['efternavn'];
$adresse = &$HTTP_POST_VARS['adresse'];
$alder = &$HTTP_POST_VARS['alder'];
$koen = &$HTTP_POST_VARS['koen'];
$email = &$HTTP_POST_VARS['email'];
$tlfnr = &$HTTP_POST_VARS['tlfnr'];
$accept = &$HTTP_POST_VARS['accept'];

if(empty($accept)) {
    echo '<font color="red"><b>Fejl!</b></font><br>Du skal acceptere vilkårene for at blive tilknyttet systemet.<br><br>
<a href="index.php?pageid=2"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>';}
else if(!preg_match(PATTERN_EMAIL, $email)) {
echo '<font color="red"><b>Fejl!</b></font><br>Du skal angive en gyldig e-mail.<br><br>
<a href="index.php?pageid=2"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>';
}         
else if(empty($fornavn) OR empty($efternavn) OR empty($adresse) OR empty($alder) OR empty($koen) OR empty($email) OR empty($tlfnr)) {
    echo '<font color="red"><b>Fejl!</b></font><br>Alle felterne skal udfyldes.<br><br>
<a href="index.php?pageid=2"><b>Tryk her for at blive sendt til oprettelsesformularen</b></a>';}

else {
mysql_connect($mysql_host, $mysql_user, $mysql_pw);
mysql_select_db($mysql_db);

$query = mysql_query("SELECT mail FROM table WHERE mail = '$email' LIMIT 1") or die (mysql_error());

$count = mysql_num_rows($query);

if ($count >= 1) {
$error .= "<p>Mailen eksisterer i forvejen.</p><br>";
}
         
if (!$error) {

mysql_query("insert into brugergruppe (fornavn, efternavn, adresse, alder, koen, email, tlfnr) values ('$fornavn', '$efternavn', '$adresse', '$alder', '$koen', '$email', '$tlfnr')")
or die(mysql_error());
print "Kære <b>\"$fornavn $efternavn\"</b> tak for din henvendelse. Du er nu oprettet som bruger.";
} else {

echo $error;

}
?>
<br>
Gå til <a href="index.php?pageid=1"><b>Tilbage til forsiden</b></a><br>
Gå til <a href="index.php?pageid=4"><b>Brugeroversigt</b></a>
<?php
}
}
?>










Når jeg forsøger at oprette en bruger, får jeg fejlen:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'table WHERE mail = 'test@test.com' LIMIT 1' at line 1

Kan du se, hvor problemet ligger?
Avatar billede NielsErikP Mester
12. juli 2011 - 23:25 #7
Hej..



$query = mysql_query("SELECT mail FROM table WHERE mail = '$email' LIMIT 1") or die (mysql_error());



Skal du ikke skrive "navnet" på den tabel du har indholdende oplysningerne i din database, istedet for bare "table".
Avatar billede webweaver Praktikant
12. juli 2011 - 23:40 #8
Jo, du skal huske at erstatte de navne jeg har givet dem til dine rigtige ... Det skal være navnet på din tabel i databasen, samt navnet på det felt i tabellen du har din email stående i ...
Avatar billede Slettet bruger
13. juli 2011 - 00:04 #9
Test af om en email er valid - når det hele skal med (der er ekstremt vide grænser for hvordan en email kan se ud og stadig være valid):

$emailFilter = /^(("[\w-\s]+")|([\w-]+(?:\.[\w-]+)*)|("[\w-\s]+")([\w-]+(?:\.[\w-]+)*))(@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$)|(@\[?((25[0-5]\.|2[0-4][0-9]\.|1[0-9]{2}\.|[0-9]{1,2}\.))((25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\.){2}(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[0-9]{1,2})\]?$)/i;

Man sku' tro det var løgn ikk'

I stedet for at bøvle med SÅ onde "serbokroatiske" regular ekspressions så brug PHP's indbyggede Email-validerings-funktion:

if (!filter_var($_POST['email'], FILTER_VALIDATE_EMAIL))
    exit("Din email er ugyldig, fjols.");


Og husk at konvertere det indtastede til lowercase inden du slår op/gemmer i databasen:
$_POST['email'] = strtolower($_POST['email']);
Avatar billede NielsErikP Mester
13. juli 2011 - 00:28 #10
Hej...
Eller send folk en Email på den angivne Email adresse med et link de kan aktivere, for at validere at Emailen er korrekt.
Avatar billede Frederik Nybegynder
13. juli 2011 - 17:35 #11
typisk at lave sådan en fejl :P Havde set mig blind på det :-/
Det ser ud til at virke nu :)

Den mail-validering der allerede er postet i #1, giver den ikke samme resultat som #9 og #10?
Avatar billede webweaver Praktikant
13. juli 2011 - 18:57 #12
I bund og grund det samme som i #9 jo, men der er forskellige udformninger af, hvordan en valid mail ser ud. Så derfor er der små forskelle. Den jeg gav dig, virker fint for langt de fleste og gængse mailadreser.

Forslaget i #10 er en helt anden måde at gøre det på, hvor den faktisk slet ikke checker om mailen er valid eller ej .. Den sender bare et aktiveringslink i den oplyste mail, som der skal klikkes på ...

Jeg smider et svar, nu hvor du har fået det til at virke :)
Avatar billede webweaver Praktikant
13. juli 2011 - 18:58 #13
Havde sørme smidt et i forvejen kan jeg se ...
Avatar billede Frederik Nybegynder
13. juli 2011 - 19:48 #14
Jeg takker for svaret :)
Avatar billede Slettet bruger
13. juli 2011 - 20:58 #15
Droppede du min filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) ?

Den er bedre at bruge, medmindre du selv VIL vedligeholde regexp-mareridtet - løbende...

Min regexg i #9 er den mest korrekte, lige NU. Men hvergang der sker ændringer i .domæne strukturerne ændrer disse regler sig. Med filter_var() lægger du dét besvær over til PHP(versionen)
Avatar billede NielsErikP Mester
13. juli 2011 - 21:33 #16
Hej..
Og skippede du aktiverings linket i #10, man kan jo sætte en restriktion på 48 timer til at aktivere linket, eller oprettede bruger slettes igen.
Avatar billede webweaver Praktikant
13. juli 2011 - 22:35 #17
#15 Så vidt jeg husker, virker dette kun fra PHP 5.xx versionen og frem. Så hvis han sidder med PHP 4, duer det ikke. Udover det, har jeg ikke benyttet mig af den, da jeg har hørt omkring flere tilfælde, hvor den faktisk ikke virker særlig godt. Det har det med at drille, når der er tal i mailen og så videre .. Det kan der evt. også læses lidt om ved en søgning på Google :-)

#16 Ikke rigtig nogen grund til at lave det, når der er validering på mailen. Det tager noget længere tid, hvis man først skal vente på en mail, før man kan gøre oprettelsen færdig. Det er mere nyttigt, hvis man vil sikre sig at det ikke er spambotter der "opretter sig som brugere" og så videre ... :-)
Avatar billede NielsErikP Mester
13. juli 2011 - 22:54 #18
Hej..
#17: point taken... Lytter til erfaringen!!!
Avatar billede webweaver Praktikant
14. juli 2011 - 01:31 #19
Men det er en god måde, hvis man vil sikre sig lidt bedre, at den person som registrerer sig, også er en person rent faktisk og en som har "gode" intentioner. Bruger det selv diverse steder :-)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester