Quote:
Dan loop je het risico op de volgende foutmelding:
"Warning: htmlspecialchars() expects parameter 1 to be string, array given in __FILE__ on line 3".
Dit probleem ontstaat doordat je niet controleert of hetgeen iemand naar jouw pagina stuurt wel werkelijk is wat jij verwacht. Dit is netjes op te lossen door te controleren of je ook wel alles krijgt wat je verwacht.
Een voorbeeld van een nette totaaloplossing is:
Spoiler tonen
Codeblok (voorbeeld.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
?php
$bShowForm = true;
# Als deze niet bestaan, kun je er vanuit gaan dat het formulier niet via de officile pagina is verstuurd
if ( isset( $_POST[mail], $_POST[username], $_POST[password], $_POST[repassword], $_POST[age], $_POST[postalcode] ) )
{
$asErrors = Array(); # Een array aanmaken van strings, waarin de foutmeldingen van het formulier komen
# Mailadres
if ( !is_string( $_POST[mail] ) || !preg_match( #A[-_a-z0-9+*$^&%=~!?{}]++(?:.[-_a-z0-9+*$^&%=~!?{}]+)*+@(?

?![-.])[-a-z0-9.]+(? {
$asErrors[] = Vul a.u.b. een valide mailadres in.;
}
# Gebruikersnaam
if ( is_string( $_POST[username] ) )
{
$sUsername = trim($_POST[username]);
if ( strlen( $sUsername ) < 3 )
{
$asErrors[] = Vul een gebruikersnaam in van minimaal drie tekens lang!;
}
elseif ( strlen( $sUsername ) > 10 )
{
$asErrors[] = Vul een gebruikersnaam in die niet langer is dan tien tekens!;
}
}
else
{
$asErrors[] = Vul een valide gebruikersnaam in!;
}
# Wachtwoord
if ( !is_string( $_POST[password] ) || !is_string( $_POST[repassword] ) )
{
# Hoogswaarschijnlijk hackwerk.
$asErrors[] = Vul valide wachtwoorden in!;
}
elseif ( $_POST[password] != $_POST[repassword] )
{
$asErrors[] = De wachtwoorden die u invulde komen niet overeen!;
}
elseif ( ( strlen($_POST[password] ) < 4 ) || !preg_match( #A([a-z]*[0-9]){2,}[a-z]*z#i, $_POST[password] ) )
{
$asErrors[] = Uw wachtwoord moet minimaal 4 tekens lang zijn en dient cijfers en letters te bevatten!;
}
# Leeftijd
if ( !is_string( $_POST[age] ) || !ctype_digit( $_POST[age] ) )
{
$asErrors[] = Vul een valide leeftijd in;
}
elseif( (int)$_POST[age] > 100 )
{
$asErrors[] = De uiterste leeftijd die geaccepteerd wordt, is 99 jaar!;
}
# Postcode (niet verplicht)
if ( !is_string( $_POST[postalcode] ) || !preg_match( #A[1-9]d{3}[a-z]{2}z#i, $_POST[postalcode] ) )
{
$_POST[postalcode] = ;
}
if ( count( $asErrors ) > 0 )
{
echo
De verwerking van het formulier heeft een aantal fouten opgeleverd;
foreach ( $asErrors as $sError )
{
echo - . htmlspecialchars( $sError ) .
;
}
echo
;
}
else
{
$bShowForm = false;
# Hier zou je nog dingen kunnen doen als vooraf controleren of een gebruikersnaam al bestaat (kan evt. ook achteraf, door de mysql-errorno op te vragen). Voor het voorbeeld even niet gedaan.
$query = "INSERT INTO
users
(
name
, password
, age
, postalcode
, signupdate
)
VALUES
(
" . mysql_real_escape_string( $_POST[username] ) . "
, " . sha1( $_POST[password] ) . "
, " . mysql_real_escape_string( $_POST[age] ) . "
, " . mysql_real_escape_string( strtoupper( $_POST[postalcode] ) ) . "
, CURRENT_DATE
)";
$result = mysql_query( $query );
if ( false === $result )
{
echo
Door een fout met de database kon u niet worden toegevoegd als lid. Sorry voor het ongemak!
;
}
else
{
echo
U bent toegevoegd als lid aan de database
;
}
}
}
if( $bShowForm )
{
?>
}
?>[/code[/spoiler]][/quote]