Placer htmlspecialchars dans script php
Bonjour,
Je viens de placer mes mes scripts sur un autre serveur (infinityfree), mais ceux-ci n'affichent pas les caractères spéciaux.
J'ai vu qu'on utilise la fonction :
function htmlspecialchars(
string $string,
int $flags = ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401,
?string $encoding = null,
bool $double_encode = true
): string
Mais où la placer ? Uniquement dans l'index.php ou tous les scripts ? Et à quel endroit ?
Merci
6 réponses
-
Bonjour,
Il serait préférable de continuer sur l'ancienne discussion, parce que le contexte et l'historique ont leur importance.
Concernant htmlspecialchars, son rôle est de nettoyer/sécuriser un texte avant de l'enregistrer dans une BDD, cette fonction ne fera rien sur problème d'accents suite à une migration d'hébergeur.
Donc pour mieux comprendre, il serait déjà utile de savoir si le problème touche le texte présent en BDD, ou si ça concerne tout le texte de la page.
-
Bonjour,
Regarde les exemples :
Tu vas en avoir besoin pour tout ce qui est rendu d'un contenu qui a été saisi par un utilisateur (tu veux maîtriser ce qui s'affiche et éviter des injections)
(la réponse de Feldrip est valable aussi)
-
Bonjour,
Les fonctions htmlspecialchars ou htmlentities, comme leurs noms l'indiquent, sont à utiliser lors de l'affichage de données dans un document html.
Contrairement à une mauvaise pratique malheureusement courante, il ne faut pas utiliser htmlspecialchars avant l'enregistrement en bdd car ceci va poser d'autres problèmes sur le traitement des données en bdd.
Plus d'info : zestedesavoir.com/articles/2489/ne-pas-confondre-faille-par-injection-sql-et-faille-xss/Si le problème d'affichage des caractères spéciaux provient des données présentes dans la bdd, le problème vient souvent du charset de la connexion à la bdd.
Il faut simplement définir le charset après la connexion, via set_charset avec mysqli ou dans le DNS avec PDO (cf. premier commentaire sur la doc) :
www.php.net/manual/fr/mysqli.set-charset.php
www.php.net/manual/fr/pdo.construct.php
-
Ben j'y arrive pas ! Pourtant, je l'ai déjà fait, mais je ne me rappelle plus où.
<center><br><br> Ce site présente une généalogie des branches <b>HUMBERT, DAMERON ,DAQUIN</b> et <b>MALFOI</b> <br>Pour raison de confidentialité, ne seront présentés que les années de naissance < année actuelle - 110.<p> Le nom <b>DAQUIN</b> était écrit <b>DACQUIN</b> ou <b>D'ACQUIN</b> jusqu'au milieu du XVIII° siècle.<br> Le nom <b>MALFOI</b> était écrit <b>MALFOY</b> jusqu'au milieu du XIX° siècle. <BR><BR><BR> Cette généalogie se compose de : <?php include ('connexion/connexion.php'); $date = date("Y"); $date2 = $date-110; $query = 'SELECT count(id) FROM individus WHERE (SUBSTRING(date_naissance, -4) < "'.$date2.'" )'; $result = mysql_query($query) or die (mysql_error()); $resultat=mysql_fetch_row($result); echo "$resultat[0] individus<p>dont<br>"; $query2 = 'SELECT count(id), MIN(RIGHT(date_naissance, 4)) AS date FROM individus WHERE famille LIKE "%HUMBERT%" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'" )'; $result2 = mysql_query($query2) or die (mysql_error()); $resultat2=mysql_fetch_row($result2); $row2 = mysql_fetch_array($result2); echo "$resultat2[0] individus dans la branche xxxxxx <br>"; echo ''.$row2['date'].''; ?> Elle a été préparée et éditée par : <p>XXXXXXX <br> N'hésitez pas à me contacter ..... -
En fait, ce sont les é, les è et les à qui sont remplacés par �
J'essaye d'utiliser str_replace, mais .............????
-
Modérateur
Bonjour,
Comme signalé plus haut les problèmes d'accents peuvent être liés au charset de la base. Et quand on déplace une base, ce peut être lié à la base d'origine, à la procédure d'export, à la procédure d'import et au paramétrage de la base finale. Je n'ai jamais touché à cela sur Mysql, mais c'est un soucis que je rencontrais aussi sur les bases Oracle.Et ne pas oublier le charset des pages internet.
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8">
-
-
J'ai réussi à supprimer les caractères indésirables sur ma page d'accueil en l'encodant en utf8 via notepad++.
Ensuite, via des liens, j'affiche le contenu de ma base. Le problème est toujours là !
J'ai placé en début de script
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link type="text/css" rel="stylesheet" href="style.css" />
sans résultat probant !
Ma table dans la base est bien enregistré en utf8 !
Mon script :
<!DOCTYPE html> <html lang="fr"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1"> <link type="text/css" rel="stylesheet" href="style.css" /> <?php include ('connexion/connexion.php'); $nom = $_GET['nom']; $date = date("Y"); $date2 = $date-110; $query = 'SELECT id,famille,nom,surnom,prenom,sexe,date_naissance,date_dc FROM individus WHERE famille LIKE "%'.$nom.'%" AND (SUBSTRING(date_naissance, -4) < "'.$date2.'" ) ORDER BY nom, prenom, (SUBSTRING(date_naissance, -4))'; $result = mysql_query($query) or die(mysql_error()); echo '<p></p><center><font size="6"><u>Branche '.$nom.'</u></font><p></p>'; if(isset($_GET['id'])) { $id = $_GET['id']; } else { echo '<div class="essai">'; echo '<table>'; while ($row = mysql_fetch_array($result)) { if (empty($row['date_dc'])) { $row['date_dc'] = " ? "; } if (empty($row['date_naissance'])) { $row['date_naissance'] = " ? "; } if ($row['sexe'] == 'M') { echo '<tr align="left"><td><img src="images/garcon.gif">'; } elseif ($row['sexe'] == 'F') { echo '<tr align="left"><td><img src="images/fille.gif">'; } elseif ($row['sexe'] == '?') { echo '<tr align="left"><td> ? '; } echo '<a href="index.php?page=fiche_indiv&id='.$row['id'].'&famille='.$row['famille'].'&nom='.$row['nom'].'"><i>'.$row['nom'].'</i></a> '.$row['prenom'].''; if ($row['surnom'] != '') { echo '<font size="2"> ('.$row['surnom'].')</font>'; } echo '<font size="1" color="#FFCC66"> ('.$row['date_naissance'].' - '.$row['date_dc'].')</font></td></tr>'; } } echo '</table>'; echo '</div>'; mysql_close(); exit; ?> </center>Une autre solution ?