Inlog & Registratie Peter Kassenaar
Ik heb het boek PHP applicatieontwikkeling gekocht van Peter Kassenaar. Bij het aanklikken van het formulier bij registreren of inloggen verschijnt er een witte pagina en geen enkele foutmelding. Alleen bij het inloggen ontvang ik een foutmelding wanneer ik de inputboxen leeghoud. Zou het aan de instellingen van de server van mijn webhoster kunnen liggen? Ik heb de config en functions.php goed ingesteld.
Anders dan dat kan ik je aanraden boven elke pagina:
te zetten, dit geeft alle foutmeldingen weer. Beste rinus, ik denk dat je even met peter moet bellen, of de code even plaatsen.
functions.php
confirm.php
config.php
register.php
http://www.stud.hro.nl/0769902/php.zip
alvast bedankt voor de moeite!
mvg,
rinus Ik heb hier de code van de volgende files ingezet:
Zip file groote: 0KB
Fout: Archief heeft onbekend formaat of is bescahdigd. Ik heb:
Zoals Arend al aangaf, geef een stukje relavante code. Dus geen boekwerk want dat gaat niemand doorspitten. Codes downloaden is niet mijn ding.
http://www.scvoorne.nl/php.zip
Ik wil wel relevante code geven maar heb geen idee wat er mis is. Dus misschien leest het dan ook makkelijker met de gehele files. oeps foutje met uploaden
Register:
Functions:
Config:
Confirm:
voor SanThe:
Anders dan dat kan ik je aanraden boven elke pagina:
te zetten, dit geeft alle foutmeldingen weer.
functions.php
confirm.php
config.php
register.php
http://www.stud.hro.nl/0769902/php.zip
alvast bedankt voor de moeite!
mvg,
rinus
Zip file groote: 0KB
Fout: Archief heeft onbekend formaat of is bescahdigd.
Zoals Arend al aangaf, geef een stukje relavante code. Dus geen boekwerk want dat gaat niemand doorspitten.
http://www.scvoorne.nl/php.zip
Ik wil wel relevante code geven maar heb geen idee wat er mis is. Dus misschien leest het dan ook makkelijker met de gehele files.
Register:
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
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
<?php
// bestanden insluiten
include_once('yapa_config.php');
include_once('yapa_functions.php');
// controleren of de pagina zichzelf heeft aangeroepen
if(isset($_POST['verzonden'])){
// initialisatie
$fout_bericht = '';
$member_naam = safe_text($_POST['naam']);
$member_email = safe_text($_POST['email']);
$member_wachtwoord = safe_text($_POST['wachtwoord']);
$member_datum = safe_text($_POST['datum']);
$member_code = create_regcode(); // random 32-bits registratiecode genereren
// de database openen
$db = safe_db_open($host, $gebruiker, $wachtwoord, $database);
// een reeks controles uitvoeren:
// eerst controleren of het e-mailadres al bestaat in de database
// (dubbele vermeldingen mogen niet voorkomen)
$query = "SELECT * FROM yapa_members WHERE email='$member_email'";
$result = safe_query($db, $query);
if (mysqli_num_rows($result) > 0){
// e-mailadres bestaat al in de database, foutmelding tonen
$fout_bericht .= "Dit e-mailadres (<b>$member_email</b>) bestaat al!<br />";
}
elseif(!check_field($member_email, T_EMAIL)){
$fout_bericht .= "U hebt geen geldig e-mailadres opgegeven";
}
elseif(!check_field($member_wachtwoord, T_PASSWORD)){
$fout_bericht .= "U hebt geen geldig wachtwoord opgegeven (minimaal 4, maximaal 8 tekens) <b />";
}
elseif(!send_confirmation($member_email, $member_code)){;
// e-mailadres OK, query opbouwen en mailtje met
// bevestigingscode verzenden
$fout_bericht .="Het verzenden van de bevestigingsmail is mislukt";
}
if($fout_bericht){
echo $fout_bericht . "<br/>";
echo "<a href=\"$deze_pagina\">Opnieuw registreren</a>";
}
else{
// alles is goed gegaan, query opbouwen en gegevens in de database plaatsen
// wachtwoord versleutelen
$member_wachtwoord = safe_password($member_wachtwoord);
$query = "INSERT yapa_members (id, naam, email, wachtwoord, datum, reg_code) VALUES
('', '$member_naam', '$member_email', '$member_wachtwoord', '$member_datum', '$member_code');";
safe_query($db, $query);
mysqli_close($db);
// gebruiker doorsturen naar de bevestigingspagina
header ("Location: yapa_confirm.php");
}
}
else{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YAPA - registratie</title>
</head>
<body>
<h2>YAPA: Registratie</h2>
Registreer nu bij Yet Another Photo Album!
<ul>
<li>Als inlognaam wordt uw e-mailadres gebruikt. </li>
<li>Na ontvangst van uw aanmelding ontvangt u een e-mail om uw account te activeren.</li>
<li>Alle velden zijn verplicht.</li>
</ul>
<hr>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<pre>
Naam: <input name="naam" type="text" size="30 " />
E-mailadres: <input name="email" type="text" size="30 " />
Wachtwoord: <input name="wachtwoord" type="password" size="30" /> (minimaal 4, maximaal 8 tekens)
<input type="hidden" name="verzonden" value="1" />
<input type="hidden" name="datum" value="<?php echo date("YmdHis"); ?>" />
</pre>
<input type="submit" name="Submit" value="Registreren" />
<input type="reset" name="Reset" value="Leegmaken" />
</form>
</body>
</html>
<?php
} // else-blok afsluiten
?>
// bestanden insluiten
include_once('yapa_config.php');
include_once('yapa_functions.php');
// controleren of de pagina zichzelf heeft aangeroepen
if(isset($_POST['verzonden'])){
// initialisatie
$fout_bericht = '';
$member_naam = safe_text($_POST['naam']);
$member_email = safe_text($_POST['email']);
$member_wachtwoord = safe_text($_POST['wachtwoord']);
$member_datum = safe_text($_POST['datum']);
$member_code = create_regcode(); // random 32-bits registratiecode genereren
// de database openen
$db = safe_db_open($host, $gebruiker, $wachtwoord, $database);
// een reeks controles uitvoeren:
// eerst controleren of het e-mailadres al bestaat in de database
// (dubbele vermeldingen mogen niet voorkomen)
$query = "SELECT * FROM yapa_members WHERE email='$member_email'";
$result = safe_query($db, $query);
if (mysqli_num_rows($result) > 0){
// e-mailadres bestaat al in de database, foutmelding tonen
$fout_bericht .= "Dit e-mailadres (<b>$member_email</b>) bestaat al!<br />";
}
elseif(!check_field($member_email, T_EMAIL)){
$fout_bericht .= "U hebt geen geldig e-mailadres opgegeven";
}
elseif(!check_field($member_wachtwoord, T_PASSWORD)){
$fout_bericht .= "U hebt geen geldig wachtwoord opgegeven (minimaal 4, maximaal 8 tekens) <b />";
}
elseif(!send_confirmation($member_email, $member_code)){;
// e-mailadres OK, query opbouwen en mailtje met
// bevestigingscode verzenden
$fout_bericht .="Het verzenden van de bevestigingsmail is mislukt";
}
if($fout_bericht){
echo $fout_bericht . "<br/>";
echo "<a href=\"$deze_pagina\">Opnieuw registreren</a>";
}
else{
// alles is goed gegaan, query opbouwen en gegevens in de database plaatsen
// wachtwoord versleutelen
$member_wachtwoord = safe_password($member_wachtwoord);
$query = "INSERT yapa_members (id, naam, email, wachtwoord, datum, reg_code) VALUES
('', '$member_naam', '$member_email', '$member_wachtwoord', '$member_datum', '$member_code');";
safe_query($db, $query);
mysqli_close($db);
// gebruiker doorsturen naar de bevestigingspagina
header ("Location: yapa_confirm.php");
}
}
else{
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YAPA - registratie</title>
</head>
<body>
<h2>YAPA: Registratie</h2>
Registreer nu bij Yet Another Photo Album!
<ul>
<li>Als inlognaam wordt uw e-mailadres gebruikt. </li>
<li>Na ontvangst van uw aanmelding ontvangt u een e-mail om uw account te activeren.</li>
<li>Alle velden zijn verplicht.</li>
</ul>
<hr>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']?>">
<pre>
Naam: <input name="naam" type="text" size="30 " />
E-mailadres: <input name="email" type="text" size="30 " />
Wachtwoord: <input name="wachtwoord" type="password" size="30" /> (minimaal 4, maximaal 8 tekens)
<input type="hidden" name="verzonden" value="1" />
<input type="hidden" name="datum" value="<?php echo date("YmdHis"); ?>" />
</pre>
<input type="submit" name="Submit" value="Registreren" />
<input type="reset" name="Reset" value="Leegmaken" />
</form>
</body>
</html>
<?php
} // else-blok afsluiten
?>
Functions:
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
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
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
<?php
/**
* Configuratiebestand invoegen.
*
*/
include_once 'yapa_config.php';
/**
* function safe_query ()
* Algemene functie om queries safe uit te voeren, inclusief
* error-nummers. Schakel DEBUG_QUERY uit in config.php voor productiesites!
*
* @return resource
*/
function safe_query($db, $query){
global $ERRORS; // globale array met foutmeldingen
$result = '';
if (empty($query) || empty($db) || !is_string($query) || !is_object($db)){
// er zijn geen geldige parameters meegegeven
return false;
}
else{
if (DEBUG_MODE){
// uitgebreide debugging-mode, met meldingen voor de programmeur
if (!$result = @mysqli_query($db, $query)){
die ("{$ERRORS['QUERY_ERROR_ADMIN']}
<br> uitgevoerde query: $query .
<br> MySQL-foutnummer: " . mysqli_errno($db) .
"<br> MySQL-melding: " . mysqli_error($db));
}
else {
return $result;
}
}
else{
// geen debug-mode, eindgebruiker krijgt beperkte foutmelding te zien
if (!$result = @mysqli_query($db, $query)){
die ($ERRORS ['QUERY_ERROR_USER']);
}
else {
return $result;
}
}
}
}// einde functie safe_query()
/**
* Function safe_text()
* Biedt de formuliergegevens eerst aan aan de functie safe_text().
* hierin worden HTML-tags uitgefilterd en (eventueel) speciale tekens
* als ', ", &, < en > omgezet naar tekst. Het binnensmokkelen van script
* in de database is dan al een stuk lastiger geworden.
* <p>Er wordt gebruik gemaakt van strip_tags() om ongewenste HTML-tags
* uit de invoer te weren. De tekst wordt eerst van spaties en andere whitespaces
* ontdaan via trim().
*
* @return string
*/
function safe_text($tekst='', $toegestane_tags=''){
$tekst = trim($tekst);
if(!get_magic_quotes_gpc()){
$tekst = addslashes($tekst);
}
return strip_tags($tekst, $toegestane_tags);
}// einde functie safe_text()
/**
* function get_docroot()
* Haal %DOCUMENT_ROOT% op, onafhankelijk van de gebruikte webserver.
* Werkt zowel voor Apache als voor IIS
*
* @return string
*/
function get_docroot(){
// twee variabelen inlezen
$docroot = $_SERVER['SCRIPT_FILENAME'];
$filename = $_SERVER['PHP_SELF'];
// backslashes vervangen door voorwaartse slashes
$docroot = str_replace('\\', '/', $docroot);
// de positie uitrekenen waar de bestandsnaam begint
$positie = strpos($docroot, $filename);
// deze van de docroot aftrekken en teruggeven
return substr($docroot, 0, $positie);
} // einde functie get_docroot()
/**
* function check_field()
* Valideert een formulierveld tegen een gegeven type
* @param string $inhoud De tekstuele inhoud van het formulierveld
* @param string $type Een van de typen die is vastgelegd in het configbestand (T_TEKST, T_EMAIL of T_URL)
*
* @return int
*/
function check_field($inhoud, $type){
trim($inhoud); // eventuele spaties verwijderen
switch ($type){
// controleer een tekstveld. Voorwaarde: niet leeg.
case T_TEXT:
if(empty($inhoud)){
return false;
}
else{
return true;
}
break;
// controleer een e-mailadres met behulp van een reguliere expressie
case T_EMAIL:
if(empty($inhoud) ||
!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $inhoud)){
return false;
}
else{
return true;
}
break;
// controleer een URL met behulp van een reguliere expressie
case T_URL:
if(empty($inhoud) ||
!eregi( '^http:\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$', $inhoud)){
return false;
}
else{
return true;
}
break;
// EXTRA:
// controleer een opgegeven wachtwoord. Eis: minimaal 4, maximaal 10 tekens,
// moet beginnen met een letter.
// voorbeeld: Peter1 = true;
// 1Peter = false;
case T_PASSWORD:
if(empty($inhoud) ||
!eregi( '^[a-zA-Z].{3,9}$', $inhoud)){
return false;
}
else{
return true;
}
break;
// vangnet, deze regel zou nooit moeten worden uitgevoerd
// maar voor de zekerheid (hackpogingen?) laten we de functie
// false retourneren
default:
return false;
}
} // einde functie check_field()
/**
* function admin_toegang($melding, $foutmelding){
* Autoriseert een gebruiker/administrator voor YABG met Basic Realm
* @return string
*/
function admin_toegang($melding, $foutmelding){
header("WWW-Authenticate: Basic realm=\"$melding\"");
header("HTTP/1.0 401 Unauthorized");
die ($foutmelding);
}// einde functie admin_toegang()
/**
* function safe_db_open()
* algemene functie om database te openen. Kan vanuit alle modules
* worden aangeroepen. Zelf eventueel uitbreiden met code om ook MySQL 3.x
* te bedienen. (mysql_ in plaats van mysqli_).
* @param string $host
* @param string $gebruiker
* @param string $wachtwoord
* @param string $database
* @return resource
*/
function safe_db_open($host, $gebruiker, $wachtwoord, $database){
$db ='';
if (empty($host) || empty($gebruiker) || empty($wachtwoord) || empty($database)){
// er zijn geen geldige parameters meegegeven
// eventueel nog uitbreiden met controles op het meegegeven type,
// zoals is_string().
return false;
}
else{
if (DEBUG_MODE){
// uitgebreide debugging-mode, met meldingen voor de programmeur
// DEBUG_MODE is een constante, gedefinieerd in het config-bestand
if (!$db = mysqli_connect($host, $gebruiker, $wachtwoord, $database)){
die ("Oooops: er is een fout opgetreden: <br />
host : $host <br />
gebruiker : $gebruiker <br />
wachtwoord : $wachtwoord <br />
database : $database <br />
MySQL-foutnummer: " . mysqli_errno($db) .
"<br /> MySQL-melding: " . mysqli_error($db));
}
else {
// alles OK, resource-handler teruggeven
return $db;
}
}
else{
// geen debug-mode, eindgebruiker krijgt beperkte foutmelding te zien
if (!$db = mysqli_connect($host, $gebruiker, $wachtwoord, $database)){
die ("Er s een fout opgetreden bij het werken met de database");
}
else {
// alles OK, resource-handler teruggeven
return $db;
}
}
}
} // einde functie safe_db_open()
/**
* function send_confirmation ()
* functie om een bevestigingsmailtje te sturen
* na aanmelding/registratie bij YAPA
*
* @param string $email het email-adres waar de bevestigng naartoe gestuurd wordt
* @param string $code de registratiecode die in de database is opgenomen
* @return int
*/
function send_confirmation($email, $code=''){
if(!empty($email)){
$pagina = "http://" . $_SERVER['HTTP_HOST'];
// Let op: zelf het pad eventueel dynamischer samenstellen
// met andere $_SERVER[...]-variabelen. Hier: hard-coded
$pagina .= "/php_app/yapa_h07/yapa_confirm.php?user="
. $email . "&code=" . $code;
$onderwerp = "YAPA: bevestig uw registratie";
$ontvanger = $email;
$bericht = "Bedankt voor uw aanmelding bij Yet Another Photo Album!\n\n";
$bericht .= "Uw account is geregistreerd met het volgende e-mailadres: $email\n\n";
$bericht .= "Activeer uw account via deze pagina: $pagina\n\n";
$bericht .= "Met vriendelijke groet\nDe YAPA-webmaster";
}
else{
return false;
}
// Het e-mailbericht verzenden
if(!mail($ontvanger, $onderwerp, $bericht)){
return false;
}
else{
return true;
}
} // einde functie send_confirmation()
/**
* function create_regcode ()
* functie om een 32-bits random registratiecode te genereren
*
* @return string
*/
function create_regcode(){
return (md5(microtime().rand(10000, 32000)));
} // einde functie create_regcode()
/**
* function safe_password()
* versleuteld een meegegeven wachtwoord op basis van md5-encryptie
*
* @param string $wachtwoord
* @return string
*/
function safe_password($wachtwoord=''){
if(!empty($wachtwoord)){
return md5($wachtwoord);
}
else{
return false;
}
}// einde functie safe_password()
?>
/**
* Configuratiebestand invoegen.
*
*/
include_once 'yapa_config.php';
/**
* function safe_query ()
* Algemene functie om queries safe uit te voeren, inclusief
* error-nummers. Schakel DEBUG_QUERY uit in config.php voor productiesites!
*
* @return resource
*/
function safe_query($db, $query){
global $ERRORS; // globale array met foutmeldingen
$result = '';
if (empty($query) || empty($db) || !is_string($query) || !is_object($db)){
// er zijn geen geldige parameters meegegeven
return false;
}
else{
if (DEBUG_MODE){
// uitgebreide debugging-mode, met meldingen voor de programmeur
if (!$result = @mysqli_query($db, $query)){
die ("{$ERRORS['QUERY_ERROR_ADMIN']}
<br> uitgevoerde query: $query .
<br> MySQL-foutnummer: " . mysqli_errno($db) .
"<br> MySQL-melding: " . mysqli_error($db));
}
else {
return $result;
}
}
else{
// geen debug-mode, eindgebruiker krijgt beperkte foutmelding te zien
if (!$result = @mysqli_query($db, $query)){
die ($ERRORS ['QUERY_ERROR_USER']);
}
else {
return $result;
}
}
}
}// einde functie safe_query()
/**
* Function safe_text()
* Biedt de formuliergegevens eerst aan aan de functie safe_text().
* hierin worden HTML-tags uitgefilterd en (eventueel) speciale tekens
* als ', ", &, < en > omgezet naar tekst. Het binnensmokkelen van script
* in de database is dan al een stuk lastiger geworden.
* <p>Er wordt gebruik gemaakt van strip_tags() om ongewenste HTML-tags
* uit de invoer te weren. De tekst wordt eerst van spaties en andere whitespaces
* ontdaan via trim().
*
* @return string
*/
function safe_text($tekst='', $toegestane_tags=''){
$tekst = trim($tekst);
if(!get_magic_quotes_gpc()){
$tekst = addslashes($tekst);
}
return strip_tags($tekst, $toegestane_tags);
}// einde functie safe_text()
/**
* function get_docroot()
* Haal %DOCUMENT_ROOT% op, onafhankelijk van de gebruikte webserver.
* Werkt zowel voor Apache als voor IIS
*
* @return string
*/
function get_docroot(){
// twee variabelen inlezen
$docroot = $_SERVER['SCRIPT_FILENAME'];
$filename = $_SERVER['PHP_SELF'];
// backslashes vervangen door voorwaartse slashes
$docroot = str_replace('\\', '/', $docroot);
// de positie uitrekenen waar de bestandsnaam begint
$positie = strpos($docroot, $filename);
// deze van de docroot aftrekken en teruggeven
return substr($docroot, 0, $positie);
} // einde functie get_docroot()
/**
* function check_field()
* Valideert een formulierveld tegen een gegeven type
* @param string $inhoud De tekstuele inhoud van het formulierveld
* @param string $type Een van de typen die is vastgelegd in het configbestand (T_TEKST, T_EMAIL of T_URL)
*
* @return int
*/
function check_field($inhoud, $type){
trim($inhoud); // eventuele spaties verwijderen
switch ($type){
// controleer een tekstveld. Voorwaarde: niet leeg.
case T_TEXT:
if(empty($inhoud)){
return false;
}
else{
return true;
}
break;
// controleer een e-mailadres met behulp van een reguliere expressie
case T_EMAIL:
if(empty($inhoud) ||
!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $inhoud)){
return false;
}
else{
return true;
}
break;
// controleer een URL met behulp van een reguliere expressie
case T_URL:
if(empty($inhoud) ||
!eregi( '^http:\/\/[a-z0-9]+([\-\.]{1}[a-z0-9]+)*\.[a-z]{2,5}$', $inhoud)){
return false;
}
else{
return true;
}
break;
// EXTRA:
// controleer een opgegeven wachtwoord. Eis: minimaal 4, maximaal 10 tekens,
// moet beginnen met een letter.
// voorbeeld: Peter1 = true;
// 1Peter = false;
case T_PASSWORD:
if(empty($inhoud) ||
!eregi( '^[a-zA-Z].{3,9}$', $inhoud)){
return false;
}
else{
return true;
}
break;
// vangnet, deze regel zou nooit moeten worden uitgevoerd
// maar voor de zekerheid (hackpogingen?) laten we de functie
// false retourneren
default:
return false;
}
} // einde functie check_field()
/**
* function admin_toegang($melding, $foutmelding){
* Autoriseert een gebruiker/administrator voor YABG met Basic Realm
* @return string
*/
function admin_toegang($melding, $foutmelding){
header("WWW-Authenticate: Basic realm=\"$melding\"");
header("HTTP/1.0 401 Unauthorized");
die ($foutmelding);
}// einde functie admin_toegang()
/**
* function safe_db_open()
* algemene functie om database te openen. Kan vanuit alle modules
* worden aangeroepen. Zelf eventueel uitbreiden met code om ook MySQL 3.x
* te bedienen. (mysql_ in plaats van mysqli_).
* @param string $host
* @param string $gebruiker
* @param string $wachtwoord
* @param string $database
* @return resource
*/
function safe_db_open($host, $gebruiker, $wachtwoord, $database){
$db ='';
if (empty($host) || empty($gebruiker) || empty($wachtwoord) || empty($database)){
// er zijn geen geldige parameters meegegeven
// eventueel nog uitbreiden met controles op het meegegeven type,
// zoals is_string().
return false;
}
else{
if (DEBUG_MODE){
// uitgebreide debugging-mode, met meldingen voor de programmeur
// DEBUG_MODE is een constante, gedefinieerd in het config-bestand
if (!$db = mysqli_connect($host, $gebruiker, $wachtwoord, $database)){
die ("Oooops: er is een fout opgetreden: <br />
host : $host <br />
gebruiker : $gebruiker <br />
wachtwoord : $wachtwoord <br />
database : $database <br />
MySQL-foutnummer: " . mysqli_errno($db) .
"<br /> MySQL-melding: " . mysqli_error($db));
}
else {
// alles OK, resource-handler teruggeven
return $db;
}
}
else{
// geen debug-mode, eindgebruiker krijgt beperkte foutmelding te zien
if (!$db = mysqli_connect($host, $gebruiker, $wachtwoord, $database)){
die ("Er s een fout opgetreden bij het werken met de database");
}
else {
// alles OK, resource-handler teruggeven
return $db;
}
}
}
} // einde functie safe_db_open()
/**
* function send_confirmation ()
* functie om een bevestigingsmailtje te sturen
* na aanmelding/registratie bij YAPA
*
* @param string $email het email-adres waar de bevestigng naartoe gestuurd wordt
* @param string $code de registratiecode die in de database is opgenomen
* @return int
*/
function send_confirmation($email, $code=''){
if(!empty($email)){
$pagina = "http://" . $_SERVER['HTTP_HOST'];
// Let op: zelf het pad eventueel dynamischer samenstellen
// met andere $_SERVER[...]-variabelen. Hier: hard-coded
$pagina .= "/php_app/yapa_h07/yapa_confirm.php?user="
. $email . "&code=" . $code;
$onderwerp = "YAPA: bevestig uw registratie";
$ontvanger = $email;
$bericht = "Bedankt voor uw aanmelding bij Yet Another Photo Album!\n\n";
$bericht .= "Uw account is geregistreerd met het volgende e-mailadres: $email\n\n";
$bericht .= "Activeer uw account via deze pagina: $pagina\n\n";
$bericht .= "Met vriendelijke groet\nDe YAPA-webmaster";
}
else{
return false;
}
// Het e-mailbericht verzenden
if(!mail($ontvanger, $onderwerp, $bericht)){
return false;
}
else{
return true;
}
} // einde functie send_confirmation()
/**
* function create_regcode ()
* functie om een 32-bits random registratiecode te genereren
*
* @return string
*/
function create_regcode(){
return (md5(microtime().rand(10000, 32000)));
} // einde functie create_regcode()
/**
* function safe_password()
* versleuteld een meegegeven wachtwoord op basis van md5-encryptie
*
* @param string $wachtwoord
* @return string
*/
function safe_password($wachtwoord=''){
if(!empty($wachtwoord)){
return md5($wachtwoord);
}
else{
return false;
}
}// einde functie safe_password()
?>
Config:
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
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
<?php
/**
* yapa_config.php - configuratiebestand voor YAPA
*
* Hierin worden de configuratieparameters ingesteld<br>
* voor het fotoalbum Yet Another Photo Album
*/
//initialisatie databasevariabelen
$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'retep01';
$database = 'php_app';
$query = null;
$db = null;
// initialisatie uploadvariabelen
$deze_pagina = $_SERVER['PHP_SELF']; // de naam van de pagina zelf
$upload_dir = 'uploads/'; // directory voor uiteindelijke opslag van foto's
$foto_naam = ''; // de bestandsnaam van de foto
$fout_bericht = ''; // Variabele voor eventueel opgetreden fouten
// Een array met toegestane afbeeldingstypen
$foto_MIME = array('image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'image/gif');
// Constanten
define ('DEBUG_MODE', true); // geeft aan of de debugging-mode voor queries actief is
// uitschakelen op een productiesite (false).
define ('MAX_FOTO_SIZE', 500000); // maximaal 500KB per foto
define ('FOTOS_PER_RIJ', 4); // het aantal foto's dat in 1 tabelrij wordt getoond
define ('UPLOAD_VERPLICHT', true); // het uploaden van een bestand is verplicht
define ('THUMB_SIZE', 120); // de breedte van thumbnails voor de foto.
// Verschillende typen inhoud voor formuliervelden
define('T_TEXT', 'tekst'); // valideren als tekst (alle tekens toegestaan)
define('T_EMAIL', 'email'); // valideren als e-mailadres
define('T_PASSWORD', 'wachtwoord'); // valideren als wachtwoord
define('T_URL', 'url'); // valideren als webadres
?>
/**
* yapa_config.php - configuratiebestand voor YAPA
*
* Hierin worden de configuratieparameters ingesteld<br>
* voor het fotoalbum Yet Another Photo Album
*/
//initialisatie databasevariabelen
$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'retep01';
$database = 'php_app';
$query = null;
$db = null;
// initialisatie uploadvariabelen
$deze_pagina = $_SERVER['PHP_SELF']; // de naam van de pagina zelf
$upload_dir = 'uploads/'; // directory voor uiteindelijke opslag van foto's
$foto_naam = ''; // de bestandsnaam van de foto
$fout_bericht = ''; // Variabele voor eventueel opgetreden fouten
// Een array met toegestane afbeeldingstypen
$foto_MIME = array('image/jpeg', 'image/pjpeg', 'image/png', 'image/x-png', 'image/gif');
// Constanten
define ('DEBUG_MODE', true); // geeft aan of de debugging-mode voor queries actief is
// uitschakelen op een productiesite (false).
define ('MAX_FOTO_SIZE', 500000); // maximaal 500KB per foto
define ('FOTOS_PER_RIJ', 4); // het aantal foto's dat in 1 tabelrij wordt getoond
define ('UPLOAD_VERPLICHT', true); // het uploaden van een bestand is verplicht
define ('THUMB_SIZE', 120); // de breedte van thumbnails voor de foto.
// Verschillende typen inhoud voor formuliervelden
define('T_TEXT', 'tekst'); // valideren als tekst (alle tekens toegestaan)
define('T_EMAIL', 'email'); // valideren als e-mailadres
define('T_PASSWORD', 'wachtwoord'); // valideren als wachtwoord
define('T_URL', 'url'); // valideren als webadres
?>
Confirm:
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
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
<?php
// bestanden insluiten
include_once('yapa_config.php');
include_once('yapa_functions.php');
// Eerst controleren of de pagina is aangeroepen met een registratiecode op de adresregel
if (!isset($_GET['code'])){
// nee, de algemene pagina tonen dat gebruikers in hun mailbox moeten kijken
$bericht = "<h2>Bedankt voor uw aanmelding</h2>";
$bericht .= "Uw account is nog niet geactiveerd. " ;
$bericht .= "Controleer uw e-mail voor een bericht met een bevestigingscode";
}
else{
// de pagina is aangeroepen met een registratiecode, deze member activeren
// initialisatie
$member_code = safe_text($_GET['code']);
$member_email = safe_text($_GET['user']);
// database openen
$db = safe_db_open($host, $gebruiker, $wachtwoord, $database);
$query = "SELECT * FROM yapa_members WHERE email='$member_email' ";
$query .= "AND reg_code='$member_code'";
$result = safe_query($db, $query);
if (mysqli_num_rows($result) > 0){
// match gevonden, voor deze member de record activeren
$query = "UPDATE yapa_members SET actief='1' WHERE reg_code='$member_code' ";
$result = safe_query($db, $query);
// bericht opstellen voor weergave op de pagina
$bericht = "<h2>Registratie succesvol!</h2>";
$bericht .= "Uw account is nu geactiveerd. U kunt inloggen met uw e-mailadres en wachtwoord";
}
else{
// geen match gevonden
$bericht = "<h2>Fout: registratiecode of e-mailadres niet gevonden</h2>";
$bericht .= "<a href=\"yapa_register.php\">Voer een nieuwe registratie uit</a>";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YAPA -uw registratie bevestigen</title>
</head>
<body>
<h2>YAPA: Uw registratie bevestigen</h2>
<?php echo $bericht?>
<ul>
<li><a href="yapa_index.php">Terug naar de homepage</a></li>
<li><a href="yapa_login.php">Inloggen</a></li>
</ul>
</form>
</body>
</html>
// bestanden insluiten
include_once('yapa_config.php');
include_once('yapa_functions.php');
// Eerst controleren of de pagina is aangeroepen met een registratiecode op de adresregel
if (!isset($_GET['code'])){
// nee, de algemene pagina tonen dat gebruikers in hun mailbox moeten kijken
$bericht = "<h2>Bedankt voor uw aanmelding</h2>";
$bericht .= "Uw account is nog niet geactiveerd. " ;
$bericht .= "Controleer uw e-mail voor een bericht met een bevestigingscode";
}
else{
// de pagina is aangeroepen met een registratiecode, deze member activeren
// initialisatie
$member_code = safe_text($_GET['code']);
$member_email = safe_text($_GET['user']);
// database openen
$db = safe_db_open($host, $gebruiker, $wachtwoord, $database);
$query = "SELECT * FROM yapa_members WHERE email='$member_email' ";
$query .= "AND reg_code='$member_code'";
$result = safe_query($db, $query);
if (mysqli_num_rows($result) > 0){
// match gevonden, voor deze member de record activeren
$query = "UPDATE yapa_members SET actief='1' WHERE reg_code='$member_code' ";
$result = safe_query($db, $query);
// bericht opstellen voor weergave op de pagina
$bericht = "<h2>Registratie succesvol!</h2>";
$bericht .= "Uw account is nu geactiveerd. U kunt inloggen met uw e-mailadres en wachtwoord";
}
else{
// geen match gevonden
$bericht = "<h2>Fout: registratiecode of e-mailadres niet gevonden</h2>";
$bericht .= "<a href=\"yapa_register.php\">Voer een nieuwe registratie uit</a>";
}
}
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<title>YAPA -uw registratie bevestigen</title>
</head>
<body>
<h2>YAPA: Uw registratie bevestigen</h2>
<?php echo $bericht?>
<ul>
<li><a href="yapa_index.php">Terug naar de homepage</a></li>
<li><a href="yapa_login.php">Inloggen</a></li>
</ul>
</form>
</body>
</html>
Het begint langzaam duidelijk te worden bij mij met de foutmeldingen myqli_query functie kent ie bijvoorbeeld niet :)
Zet error_reporting(E_ALL); eens aan.
mysqli is een aparte extensie en het kan zijn dat je webhoster die niet geinstalleerd heeft. Het lijkt me dat je in dit geval ook mysqli_ door mysql_ kan vervangen, en dat het waarshcijnlijk werkt. Ik zie hier niet werkelijk de reden wat mysqli_ hier wel kan en mysql_ niet.