Registratie
ik ben bezig met een website en deze is bijna klaar, alleen krijg ik nog een fout met het registratieformulier. Nadat de persoon geregistreerd is, krijgt hij een unieke link toegezonden waar hij moet op klikken om zijn account te activeren, die link bevat een unieke code die ook in de database en deze code moet dus geverifeerd raken, alleen stopt hij een andere code in de database dan de code die hij meezend in de e-mail. Hoe kan ik dit probleem oplossen? Dit is mijn code
Registratiepagina:
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
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
<?php
include("header.php");
?>
<h2>Registreer</h2>
<?php
$ref="";
if (isset($_GET['ref'])) {
$ref=$_GET['ref'];
}
// Als het registratie formulier gepost is
if (isset($_POST['registreer'])) {
//gebruikersnaam, wachtwoord en email beveiligen voor hackers
$naam = protect ($_POST['naam']);
$voornaam = protect ($_POST['voornaam']);
$wachtwoord = protect ($_POST['wachtwoord']);
$bwachtwoord = protect ($_POST['bwachtwoord']);
$email = protect ($_POST['email']);
$bemail = protect ($_POST['bemail']);
//checken of iets is opengelaten
if ($naam == "" or $voornaam == "" or $email == "" or $bemail == "" or $wachtwoord == "" or $bwachtwoord == "") {
output("Vul alle velden in.");
}
else {
// data selecteren om te checken of gebruikersnaam en email al bezet zijn
$registreer1 = mysql_query("SELECT * FROM gebr WHERE email='$email'") or die(mysql_error());
if (mysql_num_rows($registreer1) > 0) {
output("Dit e-mailadres wordt al gebruikt.");
}
else {
//random bevestigingscode genereren
$code=md5(uniqid(rand()));
//testen of emailadressen en wachtwoorden juist zijn
if(($wachtwoord==$bwachtwoord)&&($email==$bemail)) {
//gegevens in tijdelijke tabel plaatsen
$ins1 = mysql_query("INSERT INTO tijd (code, naam, voornaam, email, wachtwoord, ref) VALUES ('$code', '$naam', '$voornaam', '$email','".md5($wachtwoord)."', '$ref')") or die(mysql_error());
$bericht = "Hallo $voornaam\n\nKlik hieronder op de bevestigingslink om je registratie af te ronden\nhttp://site.nl/php/te/bevestiging.php?code=$code\n\nMet vriendelijke groeten\nHet Site Team";
$header = "From: 'Site' <'[email protected]'>";
$sentemail=mail($email,'Registratie bevestigen',$bericht,$header);
//als de email succesvol is verzonden
if($sentemail) {
output("Een bevestigingslink werd naar je email gezonden. Klik op de bevestigingslink in deze email om je account te activeren.");
}
else {
output("We hebben je niet kunnen aanmelden, probeer opnieuw.");
}
}
else {
output("Jouw e-mailadressen en/of wachtwoorden komen niet overeen, probeer opnieuw.");
}
}
}
}
?>
<form action="" autocomplete="off" method="post">
<table><tr><td>Vooraam:</td><td><input type="text" name="voornaam" maxlength="50" /></td></tr>
<tr><td>Naam:</td><td><input type="text" name="naam" maxlength="50" /></td></tr>
<tr><td>E-mail:</td><td><input type="text" name="email" maxlength="100" /></td></tr>
<tr><td>Bevestig e-mail:</td><td><input type="text" name="bemail" maxlength="100" /></td></tr>
<tr><td>Wachtwoord:</td><td><input type="password" name="wachtwoord" maxlength="50" /></td></tr>
<tr><td>Bevestig wachtwoord:</td><td><input type="password" name="bwachtwoord" maxlength="50" /></td></tr></table>
<input type="submit" name="registreer" value="Registreer" />
</form>
<?php include("footer.php"); ?>
include("header.php");
?>
<h2>Registreer</h2>
<?php
$ref="";
if (isset($_GET['ref'])) {
$ref=$_GET['ref'];
}
// Als het registratie formulier gepost is
if (isset($_POST['registreer'])) {
//gebruikersnaam, wachtwoord en email beveiligen voor hackers
$naam = protect ($_POST['naam']);
$voornaam = protect ($_POST['voornaam']);
$wachtwoord = protect ($_POST['wachtwoord']);
$bwachtwoord = protect ($_POST['bwachtwoord']);
$email = protect ($_POST['email']);
$bemail = protect ($_POST['bemail']);
//checken of iets is opengelaten
if ($naam == "" or $voornaam == "" or $email == "" or $bemail == "" or $wachtwoord == "" or $bwachtwoord == "") {
output("Vul alle velden in.");
}
else {
// data selecteren om te checken of gebruikersnaam en email al bezet zijn
$registreer1 = mysql_query("SELECT * FROM gebr WHERE email='$email'") or die(mysql_error());
if (mysql_num_rows($registreer1) > 0) {
output("Dit e-mailadres wordt al gebruikt.");
}
else {
//random bevestigingscode genereren
$code=md5(uniqid(rand()));
//testen of emailadressen en wachtwoorden juist zijn
if(($wachtwoord==$bwachtwoord)&&($email==$bemail)) {
//gegevens in tijdelijke tabel plaatsen
$ins1 = mysql_query("INSERT INTO tijd (code, naam, voornaam, email, wachtwoord, ref) VALUES ('$code', '$naam', '$voornaam', '$email','".md5($wachtwoord)."', '$ref')") or die(mysql_error());
$bericht = "Hallo $voornaam\n\nKlik hieronder op de bevestigingslink om je registratie af te ronden\nhttp://site.nl/php/te/bevestiging.php?code=$code\n\nMet vriendelijke groeten\nHet Site Team";
$header = "From: 'Site' <'[email protected]'>";
$sentemail=mail($email,'Registratie bevestigen',$bericht,$header);
//als de email succesvol is verzonden
if($sentemail) {
output("Een bevestigingslink werd naar je email gezonden. Klik op de bevestigingslink in deze email om je account te activeren.");
}
else {
output("We hebben je niet kunnen aanmelden, probeer opnieuw.");
}
}
else {
output("Jouw e-mailadressen en/of wachtwoorden komen niet overeen, probeer opnieuw.");
}
}
}
}
?>
<form action="" autocomplete="off" method="post">
<table><tr><td>Vooraam:</td><td><input type="text" name="voornaam" maxlength="50" /></td></tr>
<tr><td>Naam:</td><td><input type="text" name="naam" maxlength="50" /></td></tr>
<tr><td>E-mail:</td><td><input type="text" name="email" maxlength="100" /></td></tr>
<tr><td>Bevestig e-mail:</td><td><input type="text" name="bemail" maxlength="100" /></td></tr>
<tr><td>Wachtwoord:</td><td><input type="password" name="wachtwoord" maxlength="50" /></td></tr>
<tr><td>Bevestig wachtwoord:</td><td><input type="password" name="bwachtwoord" maxlength="50" /></td></tr></table>
<input type="submit" name="registreer" value="Registreer" />
</form>
<?php include("footer.php"); ?>
Pagina waar je naartoe gaat, nadat je op de bevestigingslink hebt geklikt:
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
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
<?php
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL | E_STRICT);
//connectie maken + header
include('header.php');
//variable van email in script plaatsen
$code=$_GET['code'];
//alle data selecteren van de gebruiker
$inv1=mysql_query("SELECT * FROM tijd WHERE code='$code'") or die(mysql_error());
//als de query goed was
if($inv1) {
//aantal rijen die de code hebben
$count=mysql_num_rows($inv1);
//als de code in de databse is
if($count==1) {
//van de gegevens in de databse variabelen maken door ze in een array te plaatsen
$rows=mysql_fetch_array($inv1);
$naam=$rows['naam'];
$voornaam=$rows['voornaam'];
$email=$rows['email'];
$wachtwoord=$rows['wachtwoord'];
$ref1=$rows['ref'];
$inv4=mysql_query("SELECT * FROM gebr WHERE id='$ref1'") or die(mysql_error());
$rows2=mysql_fetch_array($inv4);
$ref2=$rows2['ref1'];
//gegevens in permanente database plaatsen
$inv2=mysql_query("INSERT INTO gebr (naam, voornaam, email, wachtwoord, ref1, ref2) VALUES ('$naam', '$voornaam', '$email', '$wachtwoord', '$ref1', '$ref2')") or die(mysql_error());
$inv3=mysql_query("INSERT INTO cred (saldo, totaal, refopbrengst, klikopbr, overig) VALUES (100, 100, 0, 0, 100)") or die(mysql_error());
//gegevens uit tijdelijke database verwijderen
$inv3=mysql_query("DELETE FROM tijd WHERE code='$code'") or die(mysql_error());
$bericht = "Hieronder vind je je gegevens, waarmee je kan inloggen op site.nl\n\nvoornaam: $voornaam\nnaam: $naam\ne-mailaders: $email\nwachtwoord: jouw zelf gekozen wachtwoord\n\nAls je deze gegevens zou willen veranderen, dan kan je dat doen onder 'instellingen'.\nMocht je je wachtwoord vergeten zijn, dan kan je een nieuw wachtwoord aanvragen op onze website: site.nl\n\nMet Vriendelijke Groeten\nHet Site Team";
$header = "From: 'Site' <'[email protected]'>";
$sentemail=mail($email,'Jouw gegevens',$bericht,$header);
//als de email succesvol is verzonden
if($sentemail) {
output("Je bent succesvol geregistreerd, je kan nu inloggen op onze website, met de door jouw ingegeven gegevens.");
}
else {
output("We hebben je niet kunnen aanmelden, probeer opnieuw");
}
}
else {
output("De bevestigingscode bevind zich niet in onze databse");
}
}
else {
output("We hebben geen data kunnen selecteren in onze databse.");
}
include('footer.php');
?>
ini_set('display_errors', 1); // 0 = uit, 1 = aan
error_reporting(E_ALL | E_STRICT);
//connectie maken + header
include('header.php');
//variable van email in script plaatsen
$code=$_GET['code'];
//alle data selecteren van de gebruiker
$inv1=mysql_query("SELECT * FROM tijd WHERE code='$code'") or die(mysql_error());
//als de query goed was
if($inv1) {
//aantal rijen die de code hebben
$count=mysql_num_rows($inv1);
//als de code in de databse is
if($count==1) {
//van de gegevens in de databse variabelen maken door ze in een array te plaatsen
$rows=mysql_fetch_array($inv1);
$naam=$rows['naam'];
$voornaam=$rows['voornaam'];
$email=$rows['email'];
$wachtwoord=$rows['wachtwoord'];
$ref1=$rows['ref'];
$inv4=mysql_query("SELECT * FROM gebr WHERE id='$ref1'") or die(mysql_error());
$rows2=mysql_fetch_array($inv4);
$ref2=$rows2['ref1'];
//gegevens in permanente database plaatsen
$inv2=mysql_query("INSERT INTO gebr (naam, voornaam, email, wachtwoord, ref1, ref2) VALUES ('$naam', '$voornaam', '$email', '$wachtwoord', '$ref1', '$ref2')") or die(mysql_error());
$inv3=mysql_query("INSERT INTO cred (saldo, totaal, refopbrengst, klikopbr, overig) VALUES (100, 100, 0, 0, 100)") or die(mysql_error());
//gegevens uit tijdelijke database verwijderen
$inv3=mysql_query("DELETE FROM tijd WHERE code='$code'") or die(mysql_error());
$bericht = "Hieronder vind je je gegevens, waarmee je kan inloggen op site.nl\n\nvoornaam: $voornaam\nnaam: $naam\ne-mailaders: $email\nwachtwoord: jouw zelf gekozen wachtwoord\n\nAls je deze gegevens zou willen veranderen, dan kan je dat doen onder 'instellingen'.\nMocht je je wachtwoord vergeten zijn, dan kan je een nieuw wachtwoord aanvragen op onze website: site.nl\n\nMet Vriendelijke Groeten\nHet Site Team";
$header = "From: 'Site' <'[email protected]'>";
$sentemail=mail($email,'Jouw gegevens',$bericht,$header);
//als de email succesvol is verzonden
if($sentemail) {
output("Je bent succesvol geregistreerd, je kan nu inloggen op onze website, met de door jouw ingegeven gegevens.");
}
else {
output("We hebben je niet kunnen aanmelden, probeer opnieuw");
}
}
else {
output("De bevestigingscode bevind zich niet in onze databse");
}
}
else {
output("We hebben geen data kunnen selecteren in onze databse.");
}
include('footer.php');
?>
Dus als je op de bevestigingslink klikt heeft hij soms deze error 'De bevestigingscode bevind zich niet in onze databse', terwijl hij het soms wel doet, heel raar, weten jullie misschien wat er fout is aan mijn code?
Alvast bedankt
Zet de code gewoon in een (nieuwe) kolom bij de gebruikers.
En zodra de code bevestigd is, verwijder je de code uit de kolom.
En je kan alleen inloggen als de code-kolom leeg is... veel eenvoudiger en minder kans op fouten.
Of wachtwoord kolom...dan kun je als de link geverifieerd is de gebruiker het wachtwoord invoeren :)
Eddy Erkelens op 04/01/2013 11:00:04:
Waarom de code met emailadres/wachtwoord etc in een tijdelijke tabel plaatsen?
Zet de code gewoon in een (nieuwe) kolom bij de gebruikers.
En zodra de code bevestigd is, verwijder je de code uit de kolom.
En je kan alleen inloggen als de code-kolom leeg is... veel eenvoudiger en minder kans op fouten.
Zet de code gewoon in een (nieuwe) kolom bij de gebruikers.
En zodra de code bevestigd is, verwijder je de code uit de kolom.
En je kan alleen inloggen als de code-kolom leeg is... veel eenvoudiger en minder kans op fouten.
Dat lijkt mij juist een hele goed manier, om dat apart op te slaan. Over het algemeen (!!) registrer je maar 1 keer en daarna zal die kolom dus altijd leeg blijven. Dat betekent dat je een kolom in je tabel hebt die voor 95% of meer leeg is, dat is nutteloos. Veel beter om dat in een aparte tabel op te slaan. Als het daarin staat weet je zeker dat het voor 100% gebruikt is, veel efficienter dus.
heb je wel een extra tabel die afhankelijk van de hoeveelheid users je verwacht dat er dagelijks gaan registreren vrijwel leeg staat...net zoiets als een tuinhuisje waar je af en toe even in gaat...
Toevoeging op 04/01/2013 11:23:18:
Henze Berkheij op 04/01/2013 11:19:51:
heb je wel een extra tabel die afhankelijk van de hoeveelheid users je verwacht dat er dagelijks gaan registreren vrijwel leeg staat...net zoiets als een tuinhuisje waar je af en toe even in gaat...
Beter een lege tabel, dan een tabel met duizenden records waar altijd 1 kolom leeg is.
@Erwin..true..maar toch liever bijv het password vakje gebruiken...moeten de gebruikers na het aanklikken van de link een wachtwoord invoeren :)
Yep, maar als je zo'n extra code tabel heb kan je die ook voor andere zaken gebruiken. Bijvoorbeeld de code die je opstuurt voor wanneer iemand zijn email adres wil wijzigen. Dat wil je ook verifieren, met zo'n code, waar sla jij die op?
@ Henze: kijk eens hoe Steam dat doet: die stuurt je 5 (of 6) tekens op die je even moet kopieren/plakken in het veld. Dus geen link oid. Gelijk doen is wel zo handig. De mailservers zijn snel genoeg.
@Erwin..zit wat in :)
Ja het is echt beter.
1) 1 record ophalen uit een tabel met 1 record, of uit een tabel met 10.000 records
2) 1 record verwijderen uit een tabel met 1 record, of een update uitvoeren op een tabel met 10.000 records
Dit kan je wel weer verbeteren op die grote tabel met een extra index, maar indexen kosten je dan weer performance bij insert en updates.
Overigens is het hebben van een kolom die in feite altijd leeg is ook een teken dat de database niet goed genormaliseerd is.
Is het een doodzonde om het toch in die users tabel te doen? Nee, natuurlijk niet. Zeker bij kleinere omgevingen zal je niet merken dat het beter dan wel slechter is, bij grotere omgevingen zou ik altijd kolommen proberen te vermijden waarvan je weet dat ze voor het merendeel leeg blijven.
Bedankt iedereen voor de vele tips, maar het was een domme fout. Het type van de tabel stond op int in plaats van varchar, nu werkt alles weer.