Test schonestring foutmelding.
Ik krijg mijn aanmeld/ inlogscript nog niet helemaal rond.
Bij het aanmaken van een nieuw record wordt de functie schonestring ingezet.
Ik krijg dan de volgende foutmelding:
Parse error: syntax error, unexpected 'mysql_real_escape_string' (T_STRING) in C:\inlog_pagina\dbklasse.inc.php on line 7
Quote:
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
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
<?php
function signup(&$terug){
$ok = true;
if( $_POST['naam'] == ''):
$terug['error_naam'] = 'Vul uw naam in!';
$ok &= false;
endif;
if( $_POST['mail'] == ''):
$terug['error_mail'] = 'Vul uw e-mailadres in!';
$ok &= false;
endif;
if( $_POST['pass1'] == '' || $_POST['pass1'] != $_POST['pass2'] ):
$terug['error_pass'] = 'Vul uw tweemaal hetzelfde wachtwoord in';
$ok &= false;
endif;
if( $ok ):
// Controleer in database of email nog niet bestaat
$sql = "
SELECT
id
FROM
gebruikers
WHERE
mail='".$_POST['mail']."'
";
if( $db->aantaldb($sql) == 0 ):
// maak nieuw record in database
$ml = $db->schonestring($_POST['mail']);
$nm = $db->schonestring($_POST['naam']);
$sid = session_id();
$pass = $db->versleutel($_POST['pass1']);
$nu = $db->maaksqldate(time());
$sql = "
INSERT TO
gebruikers
(mail, naam, pass, sid, aanmaak, login)
VALUES
('$ml', '$nm', '$pass', '$sid', '$nu', '$nu')
";
return $db->querydb($sql);
else:
$terug['error_mail'] = 'E-mail is al in gebruik!';
return false;
endif;
else:
return false;
endif;
}
?>
function signup(&$terug){
$ok = true;
if( $_POST['naam'] == ''):
$terug['error_naam'] = 'Vul uw naam in!';
$ok &= false;
endif;
if( $_POST['mail'] == ''):
$terug['error_mail'] = 'Vul uw e-mailadres in!';
$ok &= false;
endif;
if( $_POST['pass1'] == '' || $_POST['pass1'] != $_POST['pass2'] ):
$terug['error_pass'] = 'Vul uw tweemaal hetzelfde wachtwoord in';
$ok &= false;
endif;
if( $ok ):
// Controleer in database of email nog niet bestaat
$sql = "
SELECT
id
FROM
gebruikers
WHERE
mail='".$_POST['mail']."'
";
if( $db->aantaldb($sql) == 0 ):
// maak nieuw record in database
$ml = $db->schonestring($_POST['mail']);
$nm = $db->schonestring($_POST['naam']);
$sid = session_id();
$pass = $db->versleutel($_POST['pass1']);
$nu = $db->maaksqldate(time());
$sql = "
INSERT TO
gebruikers
(mail, naam, pass, sid, aanmaak, login)
VALUES
('$ml', '$nm', '$pass', '$sid', '$nu', '$nu')
";
return $db->querydb($sql);
else:
$terug['error_mail'] = 'E-mail is al in gebruik!';
return false;
endif;
else:
return false;
endif;
}
?>
En dit is de functie die bij naam en mail wordt ingezet:
Quote:
Code (php)
1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
<?php
function schonestring($string, $html=false){
$string = trim($string);
if ( !$html ):
$string = strip_tags($string);
endif;
$string mysql_real_escape_string($string);
return $string;
}
?>
function schonestring($string, $html=false){
$string = trim($string);
if ( !$html ):
$string = strip_tags($string);
endif;
$string mysql_real_escape_string($string);
return $string;
}
?>
Dezelfde schonestring functie werkt wel in mijn testpagina dus de fout zit hem waarschijnlijk ergens in het aanmaken van een nieuwe record.
Heeft iemand een idee waar de foutmelding aan kan liggen?
Gewijzigd op 06/02/2015 12:10:38 door Fester Splinter
Gewijzigd op 06/02/2015 12:15:14 door - Ariën -
misschien goede gewoonte om in de query zelf altijd de escape te gebruiken. Dan hoef je er ook nooit vanuit te gaan dat dat ergens anders al wel gedaan is, want het is jammer als je dat achterafgezien voor 1 van de vars vergeten was.
Ivo P op 06/02/2015 12:52:10:
misschien goede gewoonte om in de query zelf altijd de escape te gebruiken. Dan hoef je er ook nooit vanuit te gaan dat dat ergens anders al wel gedaan is.
Mee eens.
Verder:
- gebruik mysqli in plaats van mysql (als je toch enkel van MySQL gebruik maakt, overweeg anders PDO); mysql is eigenlijk al 10 jaar verouderd
- voor een correct gebruik van een _real_escape_string() functie/methode is het van essentieel belang dat de juiste character encoding is geselecteerd met een _set_charset() functie/methode, dit doe je niet in je db-klasse je de andere thread; daarnaast is het handig en verstandig om overal dezelfde character encoding aan te houden, dus ook in je uiteindelijke HTML-document
- escape-on-input (het op voorhand escapen/verwijderen van ongewenste karakters in input) is om een aantal uiteenlopende redenen niet zo'n goed idee, in jouw geval neem je daarmee ook al min of meer een besluit in welke context de content gebruikt gaat worden (een plaintext passage in een HTML document?); een betere strategie is wellicht om alles "rauw" op te slaan en escape(-on-)output toe te passen, oftewel escape of verwijder bepaalde karakters als je de content ergens gebruikt, je hebt dan nog altijd de keuze hoe je deze content inzet, als je op voorhand alles stript wordt dit een stuk lastiger...
- ik zou dus een aparte shorthand methode maken voor de _real_escape_string() functie met als enkel doel het escapen van karakters die in de MySQL context een speciale betekenis hebben
Overigens is _real_escape_string() geen wondermiddel. Zo wordt in:
NIETS GE-ESCAPED, omdat er simpelweg geen karakters te escapen zijn. Daarnaast moet je bij tijd en wijlen input filteren als je externe data in een query opneemt.