Précédent   Forum des professionnels en informatique > PHP > Langage > Formulaires
Formulaires Forum d'entraide sur les formulaires avec PHP. Avant de poster -> FAQ formulaires, Cours de formulaires et Sources de formulaires
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 17/10/2011, 15h35   #1
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Par défaut Problème d'encodage UTF8 PHP & MySQL

Bonjour à tous,


cela fait plusieurs heures que je suis bloqué sur l'encodage de mes caractères.
En effet, il me faut enregistrer des infos sur des clients comme leur nom et prenoms depuis un formulaire, et dans une BDD MySQL.

C'est pourquoi j'ai besoin d'un encodage UTF8.

-Toutes les pages de mon site sont encodées en UTF8 (j'utilise Wordpress et il est configuré par défaut en UTF8)
- Toutes les pages "_post" (envois de requêtes PHP) sont encodées en "AINSI as UTF8" selon N++ (sans BOM). (j'ai essayé en UTF8 pur mais ca ne marche pas mieux)
- Ma base de donnée, mes tables, et tous les champs sont en utf8_general_ci. Sans exception.
- Lors de la connexion à ma BDD via PDO je renseigne l'argument suivant :

Code :
$bdd = new PDO('mysql:host=;dbname=', '', '', array(PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'));
J'ai également essayé en ne faisant qu'une simple requête SET NAMES après la connexion, sans succès.

Resultat :

Lorsque j'écris un 'é' dans le champ 'nom' de mon formulaire, Phpmyadmin affiche 'é'. Pourtant si je modifie directement le champ via un UPDATE dans myadmin, le 'é' est prit en compte.

Ce qui prouve que le problème n'est PAS la BDD.

J'utilise htmlidentities() avec pour argument UTF-8, et lorsque je fais un 'echo $nom' dans ma page formulaire_post.php qui envoie les requetes a ma BDD, le navigateur m'affiche bien 'é'.

Ce qui prouve que le problème n'est PAS le code php.

Mon doctype est en XHTML Strict et j'utilise bien la balise meta suivante :
Code :
<meta http-equiv="content-type" content="text/html;charset=utf-8" />
Ce qui prouve que le problème n'est PAS le XHTML.

Il ne reste plus que l'envoi de requête via PDO, pourtant, comme je l'ai dis plus haut j'utilise SET NAMES à chaque connexion.

Pour finir, je certifie avoir bien lu votre F.A.Q dédié a ce problème :
http://php.developpez.com/faq/sgbd/?...ql#mysql-utf-8

Il ne m'a néanmoins été d'aucun secours.


En espérant que vous trouverez mon erreur... Merci.
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/10/2011, 18h53   #2
Membre habitué
 
Homme
Développeur Web
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Service public

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 110
Points : 110
Bonsoir,

As-tu essayé un utf8_encode sur tes valeurs lors de l'enregistrement
yasen77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 10h28   #3
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Citation:
Envoyé par yasen77 Voir le message
Bonsoir,

As-tu essayé un utf8_encode sur tes valeurs lors de l'enregistrement
C'est à dire ? Tu parle lors de la requête SQL ? Il faudrait que je fasse utf8_encode($nom) dans la requete préparée ?
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 20h30   #4
Membre habitué
 
Homme
Développeur Web
Inscription : mars 2007
Messages : 112
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Développeur Web
Secteur : Service public

Informations forums :
Inscription : mars 2007
Messages : 112
Points : 110
Points : 110
Exactement, pour chaque valeur que tu vas enregistrer, tu utilise cette fonction
yasen77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/10/2011, 22h47   #5
En attente de confirmation mail
 
Inscription : juin 2002
Messages : 6 164
Détails du profil
Informations forums :
Inscription : juin 2002
Messages : 6 164
Points : 6 404
Points : 6 404
Citation:
Envoyé par gogetenk Voir le message
Lorsque j'écris un 'é' dans le champ 'nom' de mon formulaire, Phpmyadmin affiche '&eacute;'. Pourtant si je modifie directement le champ via un UPDATE dans myadmin, le 'é' est prit en compte.
...

Citation:
Envoyé par gogetenk Voir le message
J'utilise htmlidentities() avec pour argument UTF-8, et lorsque je fais un 'echo $nom' dans ma page formulaire_post.php qui envoie les requetes a ma BDD, le navigateur m'affiche bien 'é'.
Donc ce n'est nullement une erreur d'encodage. L'erreur c'est d'utiliser htmlentities ainsi (ie utiliser htmlspecialchars à l'affichage et non à l'insertion - ne pas perdre de vue que injection SQL != XSS).
julp est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 09h34   #6
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Bonjour,
merci pour vos deux réponses.
J'ai testé en enlevant htmlentities() et a la place de &eacute; j'ai des é (SEULEMENT dans PMA, pas lorsque j'affiche en PHP)
Problème d'encodage donc ?
C'est pourquoi j'ai fais appel à utf8_encode() sur mes variables avant de faire ma requête, sans succès.

Je récapitule :
- BDD, tables et champs en utf8
- Pages en utf8 sans BOM
- J'utillise bien SET NAMES utf8 a chaque connexion
- Charset en utf8
- utf8_encode() sur chaque variable


Voici mon code :


Code :
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
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
        "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
 
<head>
	<title>Formulaire post</title>
	<meta http-equiv="content-type" 
		content="text/html;charset=utf-8" />
</head>
 
<body>
 
     <?php
 
$nom= utf8_encode($_POST['nom']);
$prenom= utf8_encode($_POST['prenom']);
$email= utf8_encode($_POST['email']);
$sexe= utf8_encode($_POST['sexe']);
$type= utf8_encode($_POST['type']);
$nation= utf8_encode($_POST['nation']);
$discipline= utf8_encode($_POST['discipline']);
$hebergement= utf8_encode($_POST['hebergement']);
 
// Connexion à la base de données
 
		mysql_connect("XXX", "XXX","XXX") or die("Erreur de connexion au serveur");
	mysql_select_db("XXX") or die("Erreur de connexion à la base de donnée");
		mysql_query("SET NAMES utf8");	
 
    // Insertion des infos à l'aide d'une requête 
	$sql = "INSERT INTO tournoi2 (nom, prenom, email, sexe, type, nation, discipline, date_inscription) VALUES('$nom', '$prenom', '$email', '$sexe', '$type', '$nation', '$discipline', NOW())";
		mysql_query($sql) or die('Erreur SQL ! <br>'.$sql.'<br>'.mysql_error());
 
 
			// On cherche l'id de la personne en question afin de la mettre dans un cookie
			$sql2 = "SELECT `id` FROM `tournoi` WHERE nom='$nom' AND prenom='$prenom' ";
			$req = mysql_query($sql2) or die('Erreur SQL ! <br>'.$sql2.'<br>'.mysql_error());
 
			// On met l'ID dans une variable
			$id = mysql_fetch_array($req);
 
 
    // Redirection du visiteur vers la page de confirmation ou d'hebergement
		if ( $hebergement = 'oui' ) {
 
			//On fait un cookie pour identifier l'utilisateur dans le formulaire d'hebergement
		    setCookie("inscription-tournoi", $id['id'] , time()+3600, null, null, false, true);
			//On redirige vers l'inscription a un hotel
			header('Location: inscription-a-un-hotel');
 
 
		} else { 	
 
			//On redirige a la page de confirmation
			header('Location: confirmation-de-linscription');
		}
 
?>
 
</body>
</html>

Je suis en stage et la deadline approche... Je commence a désespérer ça fait deux jours maintenant que je suis dessus...

Help


EDIT : J'ai testé en enlevant SET NAMES, en enlevant le charset, et en encodant la page en UTF8 pour et en AINSI, aucune différence. Toujours les mêmes caractères.
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 19/10/2011, 16h19   #7
Candidat au titre de Membre du Club
 
Inscription : août 2011
Messages : 16
Détails du profil
Informations forums :
Inscription : août 2011
Messages : 16
Points : 13
Points : 13
Le problème venait du fait que mes variables étaient encodées deux fois à cause de utf8_encode() et du charset en ut8.

Du coup cela revenait à écrire en ISO...

Merci à tous et surtout Julp pour m'avoir aidé a trouver via MP.
gogetenk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 05h10.


 
 
 
 
Partenaires

Hébergement Web