Problème Encodage Base de donnée phpMyAdmin

Résolu/Fermé
leteste007 Messages postés 6 Date d'inscription jeudi 28 février 2013 Statut Membre Dernière intervention 3 mars 2013 - 28 févr. 2013 à 12:18
-helper- Messages postés 89 Date d'inscription mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 - 29 mai 2014 à 17:19
Bonjour,

J'ai un problème d'encodage au niveau de ma base de donnée phpMyAdmin. Le problème est le suivant:
Sur mon site web, j'ai réalisé un formulaire, qui une fois validé est traité et envoyé à ma base de donnée. Cependant, bien que mon interclassement du champ en question soit en utf8_general_ci , les informations qui arrivent sur ma base de donnée sont en caractères spéciaux, j'ai par exemple des caractères de ce genre: "expÃf©rimentÃf© â€Â" .
Je suis obligé de modifier manuellement dans ma base de donnée pour que l'affichage sur mon site web se fasse correctement. J'ai essayé plein de choses ( mettre un utf8_encode() avant l'envoie à la base de donnée ) mais rien n'y fait, je ne sais comment résoudre ce problème.

J'espère avoir été assez clair, d'avance merci

6 réponses

Utilisateur anonyme
1 mars 2013 à 11:06
Bonjour

Il ne suffit pas de définir tes tables en utf8, il faut aussi l'indiquer quand tu te connectes à mysql :

$bdd=
    new PDO('mysql:host=localhost; dbname=film', 'root',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8",
          PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
          PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC );

Tu n'es pas obligé d'utiliser les options PDO::ATTR_ERRMODE et PDO::ATTR_DEFAULT_FETCH_MODE qui correspondent à mes préférences personnelles.

Par contre, n'utilise jamais utf8_decode juste pour voir si ça marche mieux comme ça. Cette fonction n'a strictement rien à faire dans un site construit en utf8, sauf dans des cas très particuliers, par exemple si tu veux créer un fichier en iso-8859-1 à partir de tes données en utf-8.
4
Pour moi ce code a parfaitement fonctionné et à régler totu mes soucis.
Un grand merci Padre ! :p

try
{
$bdd = new PDO('mysql:host=localhost;dbname=bd1', 'root', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
}
catch (Exception $e)
{
die('Erreur : ' . $e->getMessage());
}
0
pijaku Messages postés 12259 Date d'inscription jeudi 15 mai 2008 Statut Modérateur Dernière intervention 9 août 2022 2 709
28 févr. 2013 à 13:10
Bonjour,

1- vérifie le charset de ta page php. Il doit être en utf-8.
2- tu as peut être dans ton code, ce genre de "test" :
$monmessage=htmlentities($monmessage, ENT_QUOTES); 
ou
$montext = htmlspecialchars($montext, ENT_QUOTES);


à remplacer comme ceci :
$monmessage=htmlentities($monmessage, ENT_QUOTES, "UTF-8");
ou
$montext = htmlspecialchars($montext, ENT_QUOTES, 'UTF-8');

ou alors, ne pas hésiter à utiliser utf8_decode :
$montext = utf8_decode($montext);
0
leteste007 Messages postés 6 Date d'inscription jeudi 28 février 2013 Statut Membre Dernière intervention 3 mars 2013
1 mars 2013 à 10:51
Merci d'avoir répondu, cependant ça ne fonctionne pas. Voici mon code:

<?php
try
{
$bdd = new PDO('mysql:host=localhost; dbname=film', 'root', '') ;
}
catch(Exception $e)
{
die('Erreur : '.$e->getMessage());
}
if (!empty($_POST['titre']))
{
$titre=$_POST['titre'] ;
$nationalite=$_POST['nationalite'] ;
$real=$_POST['realisateur'] ;
$genre=$_POST['genre'] ;
$acteur=$_POST['acteur'] ;
$epoque=$_POST['epoque'] ;
$annee=$_POST['annee'] ;
$duree=$_POST['duree'] ;
$resume=$_POST['resume'] ;
$note=$_POST['note'] ;

if (!empty($_FILES['pochette']))
{
if ($_FILES['pochette']['size'] <= 4000000) // on autorise une taille maxi de pochette ? Mo
{
$infosfichier=pathinfo($_FILES['pochette']['name']) ;
$extension_upload=$infosfichier['extension'] ; // Extension du fichier
$extensions_autorisees = array('jpg', 'jpeg', 'png') ;
if (in_array($extension_upload, $extensions_autorisees))
{
$nomfichier=$titre ;
move_uploaded_file($_FILES['pochette']['tmp_name'],"pochettes/$nomfichier.$extension_upload") ; // Déplace un fichier
$pochette="pochettes/$titre.$extension_upload" ;
echo "Fichier envoyé" ;
}
else {
echo ("Extension non valide") ;
header('Refresh: 1, URL=membre.php');
}
}
else {echo "Taille du fichier non valide";
header('Refresh: 1, URL=membre.php');}
}
}
$reqAjout=$bdd->prepare('INSERT INTO film (titre, nationalite, realisateur, genre, resume, pochette, acteur, epoque, annee, date_ajout, note, duree) VALUES (:titre, :nationalite, :realisateur, :genre, :resume, :pochette, :acteur, :epoque, :annee, CURDATE(), :note, :duree)');
$reqAjout->execute(array(
'titre' => $titre,
'nationalite'=> $nationalite,
'realisateur' => $real,
'genre' => $genre,
'resume' => htmlspecialchars($resume, ENT_QUOTES, 'UTF-8'),
'pochette' => $pochette,
'acteur' => $acteur,
'epoque' => $epoque,
'annee' => $annee,
'note' => $note,
'duree'=>$duree)) ;
echo "<br>Le film a été ajouté à la base de donnée" ;
header('Refresh: 1, URL=membre.php') ;
?>

Le echo "<br>Le film a été ajouté à la base de donnée" ; s'affiche correctement, la page est bien en utf8, le problème vient de la base de donnée qui ne récuepre pas le bon formulaire avec le bon encodage ( j'ai par exemple des Endetté jusqu'au cou dans une affaire de water bed ) dans mon champ résumé de ma table bien que celle çi soit bien en utf8_general_ci ... Je ne comprends pas et je ne sais quoi faire...
0
leteste007 Messages postés 6 Date d'inscription jeudi 28 février 2013 Statut Membre Dernière intervention 3 mars 2013
1 mars 2013 à 13:58
C'est mieux, il n'y a plus que deux choses qui ne s'affichent pas correctement il s'agit des apostrophes, les accents fonctionnent.
Seuls les ' et " ne sont pas bien affichés ( même dans ma base de donnée ) toujours lors de l'envoie de mon formulaire (si je modifie manuellement dans ma base de donnée, l'affichage se fait bien)..
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Utilisateur anonyme
1 mars 2013 à 14:25
Qu'entends-tu par 'pas bien affichés' ?
Si sur ton système magic_quotes_gpc est à 1, alors dans les données que tu reçois par $_POST,$_GET ou $_COOKIES les apostrophes sont précédés du backslash (\). Il faut donc les supprimer en faisant :
$titre=stripslashes($_POST['titre'] ;) , etc...

Il ne faut pas utiliser htmlspecialchars ou htmlentities avant d' enregistrer les données dans la base, par contre il faut obligatoirement utiliser htmlspecialchars pour l'envoi des données si tu veux qu'elles apparaissent telles qu'elles avaient été saisies.
0
-helper- Messages postés 89 Date d'inscription mercredi 21 mai 2014 Statut Membre Dernière intervention 15 juin 2014 25
Modifié par -helper- le 29/05/2014 à 17:19
Mon père vous m'étonnez !

Le set NAMES utf8 suivi du GPC, je suis ébloui par vos connaissance !
Tel un disciple je m'agenouille et je prie, pour un jour vous arriver à la cheville !

Lol ! (pardon je m'égare !)
Mais c'est bien vu, ca sent le vécu !
0
leteste007 Messages postés 6 Date d'inscription jeudi 28 février 2013 Statut Membre Dernière intervention 3 mars 2013
1 mars 2013 à 16:34
ça fonctionne enfin, j'ai retiré tous mes htmlspecialchars ( avant d'enregistrer les données dans la de donnée ) et j'ai retiré mes utf8_encode avant d'afficher sur le site. Merci à toi !
0