problemen met lettercodering UTF-8
Dank je voor je duidelijke reactie.
Klopt het dat als ik dat allemaal heb ingesteld dat ik dan [htmlentities($row[0],ENT_QUOTES,"UTF-8");] kan veranderen in [htmlentities($row[0])] en dat het dan goed zou moeten werken? (zou een mooie test zijn om te weten of ik alles goed heb staan ...)
Zijn de variabelen die ik in phpmyadmin zie:
character set connection: latin1;
character set database: latin1;
nog verder van belang og moet ik die ook op utf-8 zetten? En zo ja hoe kan ik dat doen (als mijn provider het me al toe staat). Met [SET NAMES 'utf8';] verandert er nix nl.
Toevoeging op 03/06/2014 22:12:36:
Ik heb nu de volgende code:
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
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
<?php
header('Content-Type: text/html; charset=UTF-8');
//functie om data te controleren en te beschermen tegen hackers
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
session_start();
$sTITLE='test tekensets';
$sKOP1='test Tekensets';
$sKOP2='invoerpagina';
require '_phpscripts/beheer_header.inc.php';
//controleren of formulier verzonden is
if($_SERVER['REQUEST_METHOD']=='POST') {
if(isset($_POST['volgende'])) {
if(!empty($_POST['titel'])){
$input=test_input($_POST['titel']);
$errors[]='1: input = '.$input;
require '_phpscripts/dbverbinding.inc.php';
if (!mysqli_set_charset($dblink, "utf8")) {
$errors[]="Error loading character set utf8: %s\n".mysqli_error($dblink);
} else {
$errors[]="Current character set: %s\n".mysqli_character_set_name($dblink);
}
$input=htmlspecialchars_decode($input);
$input=mysqli_real_escape_string($dblink,$input);
$errors[]='2: input tbv db = '.$input;
$sql="INSERT INTO m_test (titel) VALUES ('".$input."')";
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
$errors[]='boek <strong>'.$input.' NIET</strong> toegevoegd';
}
else
{
$errors[]='boek <strong>'.$input.'</strong> toegevoegd';
}
$sql="SELECT titel FROM m_test ORDER BY id DESC LIMIT 1";
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
}
else
{
$row = mysqli_fetch_array($res);
$errors[]='resultaat uit db zonder htmlentities: '.$row[0];
$row[1]=htmlentities($row[0],ENT_QUOTES,"UTF-8");
$errors[]='resultaat uit db met utf-8: '.$row[1];
$row[2]=htmlentities($row[0]);
$errors[]='resultaat uit db zonder utf-8: '.$row[2];
}
mysqli_close($dblink); #beëindigingen db verbinding
}
}
}
?>
<label>formulier</label>
<form id="form_mega" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST" enctype="multipart/form-data">
<label for="titel" <?php echo $roodtitel; ?> >invoer speciale characters (bv ):</label>
<input id="titel" name="titel" type="text" size="80" value=<?php echo '"'.$input.'"' ?> /><br />
<div class="submit rechts">
<input class="submit" type="submit" name="volgende" value="VOLGENDE>>>" />
</div>
</form>
<?php
echo '<br />
<div style="border:1px solid darkgrey;">
Aantal meldingen: '.count($errors).'<br />';
if (count($errors)!=0){
echo '
<ul>';
foreach ($errors as $error){
echo '
<li>'.$error.'</li>';
}
echo '
</ul>';
}
?>
</body>
</html>
header('Content-Type: text/html; charset=UTF-8');
//functie om data te controleren en te beschermen tegen hackers
function test_input($data) {
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
}
session_start();
$sTITLE='test tekensets';
$sKOP1='test Tekensets';
$sKOP2='invoerpagina';
require '_phpscripts/beheer_header.inc.php';
//controleren of formulier verzonden is
if($_SERVER['REQUEST_METHOD']=='POST') {
if(isset($_POST['volgende'])) {
if(!empty($_POST['titel'])){
$input=test_input($_POST['titel']);
$errors[]='1: input = '.$input;
require '_phpscripts/dbverbinding.inc.php';
if (!mysqli_set_charset($dblink, "utf8")) {
$errors[]="Error loading character set utf8: %s\n".mysqli_error($dblink);
} else {
$errors[]="Current character set: %s\n".mysqli_character_set_name($dblink);
}
$input=htmlspecialchars_decode($input);
$input=mysqli_real_escape_string($dblink,$input);
$errors[]='2: input tbv db = '.$input;
$sql="INSERT INTO m_test (titel) VALUES ('".$input."')";
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
$errors[]='boek <strong>'.$input.' NIET</strong> toegevoegd';
}
else
{
$errors[]='boek <strong>'.$input.'</strong> toegevoegd';
}
$sql="SELECT titel FROM m_test ORDER BY id DESC LIMIT 1";
if(!$res=mysqli_query($dblink, $sql))
{
trigger_error('Fout in query: '.mysqli_error($dblink));
}
else
{
$row = mysqli_fetch_array($res);
$errors[]='resultaat uit db zonder htmlentities: '.$row[0];
$row[1]=htmlentities($row[0],ENT_QUOTES,"UTF-8");
$errors[]='resultaat uit db met utf-8: '.$row[1];
$row[2]=htmlentities($row[0]);
$errors[]='resultaat uit db zonder utf-8: '.$row[2];
}
mysqli_close($dblink); #beëindigingen db verbinding
}
}
}
?>
<label>formulier</label>
<form id="form_mega" action="<?php echo htmlspecialchars($_SERVER["PHP_SELF"]);?>" method="POST" enctype="multipart/form-data">
<label for="titel" <?php echo $roodtitel; ?> >invoer speciale characters (bv ):</label>
<input id="titel" name="titel" type="text" size="80" value=<?php echo '"'.$input.'"' ?> /><br />
<div class="submit rechts">
<input class="submit" type="submit" name="volgende" value="VOLGENDE>>>" />
</div>
</form>
<?php
echo '<br />
<div style="border:1px solid darkgrey;">
Aantal meldingen: '.count($errors).'<br />';
if (count($errors)!=0){
echo '
<ul>';
foreach ($errors as $error){
echo '
<li>'.$error.'</li>';
}
echo '
</ul>';
}
?>
</body>
</html>
Dit geeft het volgende resultaat:
Code (php)
1
2
3
2
3
<li>resultaat uit db zonder htmlentities: </li>
<li>resultaat uit db met utf-8: ë</li>
<li>resultaat uit db zonder utf-8: ë</li>
<li>resultaat uit db met utf-8: ë</li>
<li>resultaat uit db zonder utf-8: ë</li>
Behalve eerder genoemde punten in in mysql staan tabellen en kolommen in de database netjes op utf-8. Als ik geen character-set mee geef met htmlentities krijg ik daar vreemde tekens. Klopt dat zo of heb ik nog steeds iets niet goed staan?
Resultaat 1 is toch wat je nodig hebt?
http://nl1.php.net/htmlentities
Geeft aan dat de derde parameter optioneel is, de characterset, maar dat de defaultwaarde verschilt per php-versie
Quote:
Klopt het dat als ik dat allemaal heb ingesteld dat ik dan [htmlentities($row[0],ENT_QUOTES,"UTF-8");] kan veranderen in [htmlentities($row[0])] en dat het dan goed zou moeten werken? (zou een mooie test zijn om te weten of ik alles goed heb staan ...)
Nee, htmlentities doet extra spul dat overbodig is als je de charset overal goed ingesteld hebt. Gebruik dus htmlspecialchars($row[0], ENT_QUOTES, "UTF-8")
Als je de documentatie van beiden functies lees staat er dat het heel erg aan te raden is om UTF-8 te specificeren.
htmlentities lijkt inderdaad niet meer nodig. Ik gebruikte het omdat bij xhtml het anders niet door de validator kwam. bij html5 lijkt het geen probleem.
Maar betekent volgens mij wel, dat er html tag in de database gezet kunnen worden (<script></script>) en dat maakt het heackgevoelig. Of wordt dat elders ondervangen?>
htmlspecialchars dat maakt alleen de speciale tekens onschadelijk, maar doet niets met alle tekens met accenten en dergelijke.
Gebruik dan