registratie werkt niet meer
Maar nu werkt het niet meer en ik weet niet waarom.
Zou de oorzaak misschien zou kunnen zijn aan het feit dat een paar dagen geleden per ongeluk mijn database waar dit script in stond had verwijderd uit Wamp, iets wat ik me eigelijk niet kan vorstellen, want ik heb de zelfde database weer terug gezet die ik in data.sql heb staan.
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
<?php
//session_start();
include('../includes/configdb.php');
if(isset($_POST['registreer']))
{
//controleerd of de gebruikersnaam is ingevuld
if($_POST['username'] == '')
{
$_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
}
//controleerd of het email adres is ingevuld
if($_POST['email'] == '')
{
$_SESSION['error']['email'] = "E-mail is verplicht.";
}
else
{
//conteroleerd of de indeling van de e-mail juist is
if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email']))
{
//als het het juiste formaat controleerd of de e-mail al bestaat
$email= $_POST['email'];
$sql1 = "SELECT * FROM user WHERE email = '$email'";
$result1 = mysqli_query($mysqli,$sql1) or die(mysqli_error($mysqli));
if (mysqli_num_rows($result1) > 0)
{
$_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
}
}
//else
{
//Deze fout wordt ingesteld als de e-mail-formaat niet correct is
$_SESSION['error']['email'] = "Uw e-mailadres is niet geldig.";
}
}
//controleerd of het wachtwoord is ingevuld
if($_POST['password'] == '')
{
$_SESSION['error']['password'] = "Wachtwoord is verplicht.";
}
//Als de fout bestaat, gaan we naar registratieformulier
if(isset($_SESSION['error']))
{
header("Location: index.php");
exit;
}
else
{
$username = $_POST['username'];
$email = $_POST['email'];
$password = sha1($_POST['password']);
$com_code = md5(uniqid(rand()));
$sql2 = "INSERT INTO user (username, email, password, com_code) VALUES ('$username', '$email', '$password', '$com_code')";
$result2 = mysqli_query($mysqli,$sql2) or die(mysqli_error());
if($result2)
{
$to = $email;
$subject = "Biljartclub";
$header = "Biljartclub: Bevestiging van Biljartclub";
$message = "Hallo $username hier is een bevestiging dat jij je hebt geregistreerd op de site van onze vereniging hier onder staat een link waar je op moet klikken om je registatie te activeren.";
$message ="http://localhost/biljartstanden/members/confirm.php?passkey=$com_code";
$sentmail = mail($to,$subject,$message,$header);
if($sentmail)
{
echo "Er is een bevestiging met acticatie-code verzonden naar uw e-mailadres.";
}
else
{
echo "Kan geen bevestigingslink naar uw e-mailadres verzenden";
}
}
}
}else
{
?>
<div id="content">
<table width="330" align="center" cellpadding="0" cellspacing="1" border="0px solid black">
<tr>
<form action="register.php" method="POST">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong><center>Registreren</center></strong></td>
</tr>
<tr>
<td width="150" align="left">Gebruikersnaam</td>
<td width="3"><b>:</b></td>
<td width="150" align="left"><input name="username" type="text"></td>
</tr>
<tr>
<td align="left">E-mailadres</td>
<td><b>:</b></td>
<td align="left"><input name="email" type="text"></td>
</tr>
<tr>
<td align="left">Wachtwoord</td>
<td><b>:</b></td>
<td align="left"><input name="password" type="text"></td>
</tr>
<tr>
<td colspan="3" align="left"><input type="submit" name="register" value="Aanmelden">
</tr>
</table>
</td>
</form>
</tr>
</table>
<?php
}
?>
//session_start();
include('../includes/configdb.php');
if(isset($_POST['registreer']))
{
//controleerd of de gebruikersnaam is ingevuld
if($_POST['username'] == '')
{
$_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
}
//controleerd of het email adres is ingevuld
if($_POST['email'] == '')
{
$_SESSION['error']['email'] = "E-mail is verplicht.";
}
else
{
//conteroleerd of de indeling van de e-mail juist is
if(preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9._-]+)+$/", $_POST['email']))
{
//als het het juiste formaat controleerd of de e-mail al bestaat
$email= $_POST['email'];
$sql1 = "SELECT * FROM user WHERE email = '$email'";
$result1 = mysqli_query($mysqli,$sql1) or die(mysqli_error($mysqli));
if (mysqli_num_rows($result1) > 0)
{
$_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
}
}
//else
{
//Deze fout wordt ingesteld als de e-mail-formaat niet correct is
$_SESSION['error']['email'] = "Uw e-mailadres is niet geldig.";
}
}
//controleerd of het wachtwoord is ingevuld
if($_POST['password'] == '')
{
$_SESSION['error']['password'] = "Wachtwoord is verplicht.";
}
//Als de fout bestaat, gaan we naar registratieformulier
if(isset($_SESSION['error']))
{
header("Location: index.php");
exit;
}
else
{
$username = $_POST['username'];
$email = $_POST['email'];
$password = sha1($_POST['password']);
$com_code = md5(uniqid(rand()));
$sql2 = "INSERT INTO user (username, email, password, com_code) VALUES ('$username', '$email', '$password', '$com_code')";
$result2 = mysqli_query($mysqli,$sql2) or die(mysqli_error());
if($result2)
{
$to = $email;
$subject = "Biljartclub";
$header = "Biljartclub: Bevestiging van Biljartclub";
$message = "Hallo $username hier is een bevestiging dat jij je hebt geregistreerd op de site van onze vereniging hier onder staat een link waar je op moet klikken om je registatie te activeren.";
$message ="http://localhost/biljartstanden/members/confirm.php?passkey=$com_code";
$sentmail = mail($to,$subject,$message,$header);
if($sentmail)
{
echo "Er is een bevestiging met acticatie-code verzonden naar uw e-mailadres.";
}
else
{
echo "Kan geen bevestigingslink naar uw e-mailadres verzenden";
}
}
}
}else
{
?>
<div id="content">
<table width="330" align="center" cellpadding="0" cellspacing="1" border="0px solid black">
<tr>
<form action="register.php" method="POST">
<td>
<table width="100%" border="0" cellpadding="3" cellspacing="1" bgcolor="#FFFFFF">
<tr>
<td colspan="3"><strong><center>Registreren</center></strong></td>
</tr>
<tr>
<td width="150" align="left">Gebruikersnaam</td>
<td width="3"><b>:</b></td>
<td width="150" align="left"><input name="username" type="text"></td>
</tr>
<tr>
<td align="left">E-mailadres</td>
<td><b>:</b></td>
<td align="left"><input name="email" type="text"></td>
</tr>
<tr>
<td align="left">Wachtwoord</td>
<td><b>:</b></td>
<td align="left"><input name="password" type="text"></td>
</tr>
<tr>
<td colspan="3" align="left"><input type="submit" name="register" value="Aanmelden">
</tr>
</table>
</td>
</form>
</tr>
</table>
<?php
}
?>
Gewijzigd op 27/05/2014 09:56:31 door Niek Kasius
die() is geen foutafhandeling!
Het beste kun je geen * gebruiken in je select, maar de velden invullen die je wilt hebben. Dit is in eerste instantie sneller (ja, ook als je ze allemaal alsnog invult) en ten tweede veel overzichtelijker welke velden je tot je beschikking hebt.
Je code is verder ook wat onoverzichtelijk en een formulier in een table?? Maar dat was je vraag niet :-)
foutafhandeling
Edit:
Ik zie trouwens dat je wel controleert of results1/2 true is. Krijg je wel een e-mail? Of een error?
I.p.v. de preg_match op regel 19 kun je beter filter_var gebruiken
Ik zie trouwens dat je wel controleert of results1/2 true is. Krijg je wel een e-mail? Of een error?
I.p.v. de preg_match op regel 19 kun je beter filter_var gebruiken
Gewijzigd op 27/05/2014 10:07:38 door Michael -
Verder zie ik een hele sloot aan mogelijkheden tot SQL-injection!!
Ik krijg niks, nada, nothing.
Ik heb de form er al uit gehaald en apart gedaan zodat die word door gestuurd naar register.php.
Maar krijg niks nadat ik op aanmelden klik gaat die terug naar de index waar die link voor registreren staat.
Zet hier en daar wat dump informatie. echo voor en na elk if statement. Kijk of je uberhaubt iets terug krijgt en ga zo langzaamaan je gehele script door om op te sporen waar het mis gaat.
je zegt dat je script gewerkt heeft. Dus het script an sich was kennelijk goed (goed als in "deed zijn werk", niet als in "is de ideale manier van scripten, want zie boven")
Er is dus iets aan de omstandigheden waarin het script moet werken, verandert:
- server instellingen.
- database structuur
- database connectie gegevens
- tabel "vol" als in : id als tiny int. opgeslagen en je zit aan de 127 records
- etc
Je zult dus bij veel acties moeten nagaan of iets gelukt is.
En dan denk ik met name aan foutmeldingen van mysql.
Maar zet ook eens neer in je script als iets wel gelukt is, wat het antwoord was.
--
en commmenteer regel 46 eens uit.
Alles wat er aan meldingen op het scherm komt, wil je niet direct wissen door een redirect (neem even aan dat je output buffering aan hebt staan)
Maar door die foutafhandelingen die ik er heb gezet, zijn de regel nummer veranderd.
Ik heb dit gedaan:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
if($_POST['username'] == '')
{
echo "Query mislukt. Foutmelding: " . mysqli_error();
}
else
{
$_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
}
?>
{
echo "Query mislukt. Foutmelding: " . mysqli_error();
}
else
{
$_SESSION['error']['username'] = "Gebruikersnaam is verplicht.";
}
?>
En dat overal gedaan, ook bij regel 57 = nu 68, Maar daar krijg ik op regel 59 = 70 deze foutmelding:
mysqli_error() expects exactly 1 parameter, 0 given in C:\wamp\www\biljart\members\register.php on line 71
En asl ik daar dan $com of $sql2 of $result2 in zet dan geeft die: Undefined variable: con in C:\wamp\www\biljart\members\register.php on line 70
Ik snap het niet het heeft altijd goed gewerkt zolang ik het heb.
Quote:
Er is dus iets aan de omstandigheden waarin het script moet werken, verandert:
- server instellingen.
- database structuur
- database connectie gegevens
- tabel "vol" als in : id als tiny int. opgeslagen en je zit aan de 127 records
- etc
- server instellingen.
- database structuur
- database connectie gegevens
- tabel "vol" als in : id als tiny int. opgeslagen en je zit aan de 127 records
- etc
geen van alle naar ik weet
regel 46 moet zijn header('Refresh: 1; url=index1.php'); exit;
Code (php)
1
2
3
4
2
3
4
if($_POST['username'] == '')
{
echo "Query mislukt. Foutmelding: " . mysqli_error();
}
{
echo "Query mislukt. Foutmelding: " . mysqli_error();
}
Of een post leeg is heeft niks met een query te maken. Een query kan ook fout gaan als een post wel gevuld is.
Zoals Ivoo zei, comment alle headers e.d. want deze voorkomen dat jij de errors kunt zien. Je zou dan in ieder geval een foutmelding moeten krijgen waar je iets mee kunt.
mysqli_error verwacht een parameter inderdaad: string mysqli_error ( mysqli $link ) : php.net/mysqli_error.
Je roept deze functie nu aan op het moment dat je eer post waarde mist en nog helemaal geen aanroep naar de database hebt gemaakt.
Code (php)
Je fouten van de formulier velden, zal je echt op een andere manier moeten oplossen:
Code (php)
o.i.d.. Succes!
En die echo "Query mislukt. Foutmelding: " . mysqli_error(); bij if($_POST['username'] == '') en email zijn inderdaad nutteloos want als zij leeg zijn post die niet.
Maar wat zet ik nu bij echo "Query mislukt. Foutmelding: " . mysqli_error(); want die blijft wel zichtbaar nu, ook nu het wel werkt
Code (php)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<?php
sql1 = "
SELECT
email
FROM
user
WHERE
email = '" . mysqli_real_escape_string($email) . "'
";
$result1 = mysqli_query($mysqli,$sql1);
if($result1) {
if (mysqli_num_rows($result1) > 0) {
$_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
}
} else {
echo "Query mislukt. Foutmelding: " . mysqli_error($mysqli);
}
?>
sql1 = "
SELECT
FROM
user
WHERE
email = '" . mysqli_real_escape_string($email) . "'
";
$result1 = mysqli_query($mysqli,$sql1);
if($result1) {
if (mysqli_num_rows($result1) > 0) {
$_SESSION['error']['email'] = "Dit e-mailadres is al gebruikt.";
}
} else {
echo "Query mislukt. Foutmelding: " . mysqli_error($mysqli);
}
?>
http://localhost/www/biljart/members/confirm.php?passkey=$com_code";
Als ik confirm.php gewoon open dan staat er in de adres balk
http://localhost/biljart/members/confirm.php\
maar omdat de map in de www staat moet ik ook localhost/www voor een link die van buiten af komt toch.
En aks ik een Hotmail adres invoer krijg ik geen aanklikbare link wel in oulook expres.
Ik ruik SQL-injections...
en XSS