Impossible d'afficher les caractères spéciaux [Résolu/Fermé]

Signaler
-
Marlocq
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019
-
Bonjour,

J ai un site internet avec ma base de données en utf8, la déclaration de page en utf8 et le codage de celle ci en utf8 mais ma page refuse obstinément d'afficher les caractère spéciaux. J ai fini par trouver que ça venait de ma commande a la BDD si vous pouviez me dire si vous voyez quelque chose qui cloche dedans...

<?php
try{
$DB = new PDO('mysql:host=localhost;dbname=greg_test','root','alpha',array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
}
catch(PDOException $e){
echo 'Impossible de se connecter à la base de donnée';
exit();
}
?>

21 réponses

petit up si quelqu'un pouvait m'aider...
Messages postés
878
Date d'inscription
vendredi 11 mars 2011
Statut
Contributeur sécurité
Dernière intervention
5 décembre 2014
139
Hello,

Est-ce que ta page est aussi encodé en UTF-8 ?


@+

Bonjour

Ta connexion à la base de données a l'air OK.
Ce problème concerne-t-il seulement les données issues de la base, ou tous les caractères accentués ?
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Se problème ne concerne que les données traitées par cette requête la.

Voila ce que ça m'affiche :é à è Test des caractères spéciaux


ça c'est la requete de la page de news qui affiche tout comme il faut:

$requete = ' SELECT * FROM mess_gen ORDER BY date DESC LIMIT '.(($cPage-1)*$parPage).','.$parPage.' ';
$resultat = $db_conn->query($requete);

$nb_lig_resultat = $resultat->num_rows;

Se problème ne concerne que les données traitées par cette requête la
Ça veut dire que quand tu affiches des données à partir d'autres requêtes, tu n'as pas ce problème ? J'ai du mal à y croire.
Ton site est-il en ligne pour qu'on puisse se faire une idée ?
Ou sinon, peux-tu nous montrer le code du <head> de ta page, où on voit que tu travailles en utf8 ?
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Mon site tourne sur un serveur local...

<head>
<title>Librairie en ligne du centre multimédia Don Bosco</title>
<meta content="text/html;charset=utf-8" http-equiv="Content-Type">
<meta content="" name="keywords">
<meta content="" name="author">
<meta content="" name="description">
<link href="css/site.css" type="text/css" rel="stylesheet">
<link href="css/calendrier.css" type="text/css" rel="stylesheet">
<script src="javascript/jquery-1.8.1.min.js" language="Javascript" type="text/javascript">
<script src="javascript/calendrier.js" language="Javascript" type="text/javascript">
<script type="text/javascript">
</head>

Faudrait penser à fermer tes balises <script> avec </script>.
Mais bon, ce n'est pas ce qui explique ton problème.

Tu n'as pas répondu à ma question sur le fait qu'il n'y a vraiment qu'avec cette requête-là que tu as un problème.
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Ben ceci est la requète de la page de news par exemple

function db_connect() {
$db_connec = new mysqli('localhost','root','alpha','greg_test');

if (mysqli_connect_errno()) {
echo 'Echec de la connection à la base : '.mysqli_connect_error();
exit ();
} else {
return $db_connec;
}
}

$db_conn = db_connect ();

$requete = ' SELECT * FROM mess_gen ORDER BY date DESC LIMIT '.(($cPage-1)*$parPage).','.$parPage.' ';
$resultat = $db_conn->query($requete);

$nb_lig_resultat = $resultat->num_rows;

Et l'autre plus haut qui fait connexion me permet de récupéré les events pour le calendrier (la page qui bug)

Comment le texte qui s'affiche mal a-t-il été entré dans la base de données ? À partir d'un formulaire que tu as fait ? Avec phpmyadmin ? Ou d'une autre manière ?
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

A partir d'un formulaire.

Voila l'insertion:

$h1=stripslashes(trim($_POST['h1']));
$hfin=stripslashes(trim($_POST['hfin']));
$groupe=stripslashes(trim($_POST['groupe']));
$titre="<span class=\"red\">$local</span> <span class=\"blue\">de $h1 à $hfin</span> <span class=\"green\">$nom $prenom</span> groupe: $groupe";
$fac="non";
$db_conn = db_connect ();
$requete = " insert into events (title,date,fac,mail,local,h_deb,h_fin) values ('$titre','$date','$fac','$mail_user','$local','$h1mod','$hfinmod') ";
$resultat = $db_conn->query($requete);

Je vois que tu mélanges PDO et mysqli. Je suppose que tu n'en es pas conscient.

Tu dis bien à ta connexion PDO de travailler en utf8, mais ta connexion mysqli, elle, ne contient pas de "SET NAMES utf8". Elle ne marche PAS en utf8.
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Oui mais pourtant c'est ma requête pdo qui bug vu que c'est celle que j'utilise sur le calendrier.

Le projet de se site c'est étalé sur 2 ans donc je suis passé au PDO entre temps sans modifier les pages préalablement faite (en mysqli).

Donc pour toi je devrais modifier ma requête mysqli ?

Pas ta requête, ta connexion.
Comme pour PDO, il faut dire à mysqli que tu travailles en utf8. Je viens de jeter un coup d'oeil à la doc, ils déconseillent d'utiliser SET NAMES comme en PDO. Il y a une fonction faite pour :

function db_connect() { 
$db_connec = new mysqli('localhost','root','alpha','greg_test');

if (mysqli_connect_errno()) {
echo 'Echec de la connection à la base : '.mysqli_connect_error();
exit ();
} else {
$db_connec->set_charset("utf8");
return $db_connec;
}
}
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Bon je viens de testé ta requête le résultat est que ça n'affiche plus les caractères avec accent. Le bug viendrait du fait de déclaré l'utf8...
Je ne comprend pas trop pourquoi.

Il n'y a pas de raison, l'utf8 marche très bien si tout est fait correctement.
Maintenant, les données qui avaient été mal enregistrées auparavant ne vont pas être 'réparées'.
J'ai quelques questions :
Peux-tu m'expliquer pourquoi ton INSERT se fait dans la table 'events' alors que ton affichage va chercher dans la table mess_gen ? S'agit-il d'une vue ?
Vois-tu les données insérées avec phpmyadmin ? Ont-elles l'air correctes ?
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

Ha non je me tais. Le problème venais bien de ma connexion mysqli vu que ça ne déclarait pas le charset avant l'insertion dans la BDD je suppose.

Tu a résolu mon problème merci milles fois à toi.
Utilisateur anonyme
De rien :)
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

les mess_gen sont pour la table de la page news.

Le truc que je ne comprends pas avec la connexion pdo de mon calendrier c'est comment il sait qu'il doit recherché les info du tableau events alors que rien ne le dit clairement.

En gros pour schématiser

Tableau mess_gen = page de news donc je fais mes requêtes vers ça.
Tableau events = calendrier et la je fais ma requête avec le pdo mais je ne lui dis pas explicitement d'aller dans se tableau mais pourtant ça marche....

alors que rien ne le dit clairement
Si, si, il y a certainement quelque chose qui le lui dit clairement, aucun doute là-dessus. Mais il faudrait tout le code de la page news, et peut-être des pages incluses, pour te montrer exactement où
Messages postés
103
Date d'inscription
mardi 19 novembre 2013
Statut
Membre
Dernière intervention
27 novembre 2019

class Date{

var $days = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi','Dimanche');
var $months = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

function getEvents($year){
global $DB;
$req = $DB->query('SELECT id,title,date,fac FROM events WHERE fac="oui" and YEAR(date)='.$year.' ORDER BY title');
$r = array();
while($d = $req->fetch(PDO::FETCH_OBJ)){
$r[strtotime($d->date)][$d->id] = $d->title;
}
return $r;
}

function getAll($year){
$r = array();
$date = new DateTime($year.'-01-01');
while($date->format('Y') <= $year){
$y = $date->format('Y');
$m = $date->format('n');
$d = $date->format('j');
$w = str_replace('0','7',$date->format('w'));
$r[$y][$m][$d] = $w;
$date->add(new DateInterval('P1D'));
}
return $r;
}

}

La fonction config c'est la connexion PDO

Je m'étonne que tu n'aies pas trouvé, il n'y a rien de caché.
La table events apparaît bien au début de la function getEvents de la classe Date. Et dans ton script, on voit bien l'appel à cette fonction.
1 2