Problème de lecture d'accents

Eléphanteau du PHP | 42 Messages

03 mars 2014, 17:54

Bonjour, voilà, j'explique mon problème, j'utilise un système de news php, qui me permet de poster des news depuis une administration, le hic ? Les accents ne se lisent pas ! Par exemple, au lieu du "é" j'ai un "é", voici le codage de tout mon système, est ce que quelqun pourrait m'aider, me dire ce que je dois faire ?

table_news.sql

Code : Tout sélectionner

CREATE TABLE news ( id int(6) NOT NULL auto_increment, auteur VARCHAR(30) NOT NULL, titre text NOT NULL, date datetime NOT NULL default '0000-00-00 00:00:00', texte_news text NOT NULL, PRIMARY KEY (id) ) TYPE=MyISAM;
news.php

Code : Tout sélectionner

<?php // on se connecte à notre base $base = mysql_connect ('serveur', 'login', 'password'); mysql_select_db('nom_base', $base); // lancement de la requête. on sélectionne les news que l'on va ordonner suivant l'ordre "inverse" des dates (de la plus récente à la plus vieille : DESC) tout en ne sélectionnant que le nombre voulu de news à afficher (LIMIT) $sql = 'SELECT auteur, titre, date, texte_news FROM news ORDER BY date DESC;'; // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error()); // on compte le nombre de news stockées dans la base de données $nb_news = mysql_num_rows($req); if ($nb_news == 0) { echo 'Aucune news enregistrée.'; } else { // si on a au moins une news, on l'affiche while ($data = mysql_fetch_array($req)) { // on décompose la date sscanf($data['date'], "%4s-%2s-%2s %2s:%2s:%2s", $an, $mois, $jour, $heure, $min, $sec); // on affiche les résultats echo '<br />News de : ' , htmlentities(trim($data['auteur'])) , '<br />'; echo 'Titre : ' , htmlentities(trim($data['titre'])) , '<br />'; echo 'Postée le : ' , $jour , '/' , $mois , '/' , $an , ' à ' , $heure , ':' , $min , ':' , $sec , '<br /><br />'; echo 'News : ' , nl2br(htmlentities(trim($data['texte_news']))) , '<br />'; } } // on libère l'espace mémoire alloué à cette requête mysql_free_result ($req); // on ferme la connexion à la base de données mysql_close (); ?>
index.php

Code : Tout sélectionner

<html> <head> <title>Index de mon site WEB</title> </head> <body> <!-- code HTML avant l'affiche des news (tout dépend comment est constitué votre site) --> <?php // on inclut l'affichage de nos news include ('news.php'); ?> <!-- code HTML après l'affiche des news (tout dépend comment est constitué votre site) --> </body> </html>
insert_news.php

Code : Tout sélectionner

<?php // on teste si le formulaire a été validé if (isset($_POST['go']) && $_POST['go']=='Poster la news') { // on se connecte à notre base $base = mysql_connect ('serveur', 'login', 'password'); mysql_select_db('nom_base', $base); // on teste la déclaration de nos variables if (!isset($_POST['auteur']) || !isset($_POST['titre']) || !isset($_POST['news'])) { $erreur = 'Les variables nécessaires au script ne sont pas définies.'; } else { if (empty($_POST['auteur']) || empty($_POST['titre']) || empty($_POST['news'])) { $erreur = 'Au moins un des champs est vide.'; } // si tout est bon, on peut commencer l'insertion dans la base else { // lancement de la requête d'insertion $sql = 'INSERT INTO news VALUES("", "'.mysql_escape_string($_POST['auteur']).'", "'.mysql_escape_string($_POST['titre']).'", "'.date("Y-m-d H:i:s").'", "'.mysql_escape_string($_POST['news']).'")'; // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die) mysql_query($sql) or die('Erreur SQL !'.$sql.'<br />'.mysql_error()); // on ferme la connexion à la base de données mysql_close(); // on redirige vers la page d'accueil du site (attention, cette redirection ne fonctionne qui si vous avez placé cette page dans un répertoire à partir de la racine du site). Si ce n'est pas le cas, veuillez entrer ici le bon chemin d'accès afin de retomber sur la page d'accueil du site. header('Location: ../index.php'); // on termine le script courant exit(); } } } ?> <html> <head> <title>Insertion d'une nouvelle news</title> </head> <body> <!-- on fait pointer le formulaire vers la page traitant les données --> <form action="insert_news.php" method="post"> <table> <tr><td> [b]Auteur :[/b] </td><td> <input type="text" name="auteur" maxlength="30" size="50" value="<?php if (isset($_POST['auteur'])) echo htmlentities(trim($_POST['auteur'])); ?>"> </td></tr><tr><td> [b]Titre :[/b] </td><td> <input type="text" name="titre" maxlength="50" size="50" value="<?php if (isset($_POST['titre'])) echo htmlentities(trim($_POST['titre'])); ?>"> </td></tr><tr><td> [b]News :[/b] </td><td> <textarea name="news" cols="50" rows="10"><?php if (isset($_POST['news'])) echo htmlentities(trim($_POST['news'])); ?></textarea> </td></tr><tr><td><td align="right"> <input type="submit" name="go" value="Poster la news"> </td></tr></table> </form> <?php // on affiche les erreurs éventuelles if (isset($erreur)) echo '<br /><br />',$erreur; ?> </body> </html>

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 mars 2014, 18:08

C'est un problème d'encodage :)

Les données que tu stockes dans ta base sont encodées d'une certaine manière (à priori en ISO), alors que lorsque tu les affiches, elles sont considérées comme étant dans un autre jeu de caractères (UTF-8). L'interprétation des accents dans ces deux jeux de caractères ne correspondant pas, il t'affiche ce qu'il trouve à la place...

Il faut donc uniformiser l'encodage de ta base de données et celui de tes page (via balises headers de ta page)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 42 Messages

03 mars 2014, 18:22

D'accord, je vois, donc, par logique, je dois insérer un code du genre "
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />" or, je l'ai fais sur la plupart de mes pages où se trouvent mon système de news, et là toujours le même problème, je comprend pas..

ViPHP
xTG
ViPHP | 7331 Messages

03 mars 2014, 19:05

Il n'y a malheureusement pas que cette ligne. :)
Un très bon article sur le sujet : faq-tutoriels/encodage-utf-t245062.html

Eléphanteau du PHP | 42 Messages

03 mars 2014, 19:58

Oulah, voilà beaucoup de lecture que tu 'mapportes, te serait-il possible de me donner toutes les lignes à mettre s'i lte plait ?

Eléphanteau du PHP | 42 Messages

04 mars 2014, 12:35

J'ai essayé tout ce qui était indiqué dans le tutoriel, pour le moment, rien de positif.. j'aimerais que quelqun m'aide, merci !

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2014, 14:11

On peut t'aider mais il va falloir des informations sur ce que tu as mis en place et ce qui te bloque ou ne fonctionne pas.
Parce que rien de positif c'est un poil vague. ;)

Eléphanteau du PHP | 42 Messages

04 mars 2014, 20:39

Sur le tutoriel, il m'est indiqué de:
-mettre le meta en tête de page
-mettre mes pages en UTF-8 dans ma bdd
-d'ajouter un code devant mes "mysql_dbconnect"
Tout est fait, or j'ai encore ce souci d'accents, vous pouvez aller voir sur mon site, http://www.danstaface.bl.ee/test ! Je ne comprend pas d'où vient le problème, peut être que tu pourras m'aider ^^

ViPHP
xTG
ViPHP | 7331 Messages

04 mars 2014, 21:19

J'ai juste regardé le code source généré sur la première page de ton site...
Et oui je me suis bien pris une saleté dans la face...
La balise HTML elle est où ?
<html>
  <head>
  ...
  </head>
<body>
contenu
</body>
</html>
Tu devrais faire valider ton site en W3C, ton code HTML n'est absolument pas portable.
Ce qui veut dire que d'un navigateur à un autre il est possible qu'il ne s'affiche pas correctement (voire pas du tout).

De plus tu as ceci qui se trimbale sur ta page :
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
Je ne sais pas s'il sera interprété là où il est, mais dans tous les cas il est après la déclaration pour l'utf-8. (dernier arrivé, dernier pris en compte)
Tu as du ménage à faire. ;)