Consultez la formation SEO spéciale Wordpress
par WebRankInfo / Ranking Metrics

Messages: 527

Enregistré le: 30 Juil 2014

Message le Mar Mar 07, 2017 18:46

Bonjour,

Je viens de résoudre un très petit soucis technique, mais à vrai dire, je n'ai pas compris le pourquoi du comment.

C'est simple, j'expédie un mot accentué dans une table. Je regarde dans phpMyadmin et je constate que l'accent apparaît codé.

Donc j'utilise la fonction ut8_decode juste avant l'insertion. Et le mot apparaît bien accentué dans le tuple.

Mais pourquoi cela ? Pourquoi la base de donnée encode-t'elle automatiquement les accents lors de l'insertion ?
Haut
15 Réponses
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mar Mar 07, 2017 19:25

Pourquoi faire un utf8_decode avant d'enregistrer dans la base ?
Tu peux définir ce que tu entends par "l'accent apparaît codé" ?
Tu px regarder l'interclassement de la base de données ET des tables ?
Haut
Messages: 140

Enregistré le: 17 Oct 2009

Message le Mer Mar 08, 2017 2:38

Il faut que l'ensemble de la chaine soit encodé en UTF8.
Les fichiers, les tables et la connexion avec la requete "SET NAMES utf8".
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 13:06

spout a écrit:Pourquoi faire un utf8_decode avant d'enregistrer dans la base ?
Tu peux définir ce que tu entends par "l'accent apparaît codé" ?
Tu px regarder l'interclassement de la base de données ET des tables ?

Salut spout,

- Je fais un ut8_decode car j'insère par moi-même dans une table WordPress. Or, WordPress enregistre en base de donnée les mots accentués tel quel. Donc je fais pareil.
- L'accent apparaît codé, par exemple "épaté" -> eacute;pateacute; (sauf que c'est un autre encodage, genre @e)
- Je ne sais pas ce que tu appelles l'interclassement.

niap a écrit:Il faut que l'ensemble de la chaine soit encodé en UTF8.
Les fichiers, les tables et la connexion avec la requete "SET NAMES utf8".

Salut niap,
Je n'ai pas bien compris ton assertion. Je n'ai pas créé la table, c'est une table créée automatiquement par le script WordPress lors de l'installation. Je préfère n'y rien toucher.
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 13:47

Alorsladaccord a écrit:- Je fais un ut8_decode car j'insère par moi-même dans une table WordPress. Or, WordPress enregistre en base de donnée les mots accentués tel quel. Donc je fais pareil.

WP est en UTF8, donc tel quel c'est SANS faire de utf8_decode (ou à la limite utf8_encode si les données ne sont pas en utf8).

Alorsladaccord a écrit:- L'accent apparaît codé, par exemple "épaté" -> eacute;pateacute; (sauf que c'est un autre encodage, genre @e)

Là c'est du htmlentities, rien à avoir avec l'encodage.

Alorsladaccord a écrit:- Je ne sais pas ce que tu appelles l'interclassement.

https://openclassrooms.com/courses/comprendre-les-jeux-de-caracteres-e ... lassements
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 14:04

Merci pour le lien, Spout. Je finirai de lire l'article avant ma mort.
[quote="spout"]
WP est en UTF8, donc tel quel c'est SANS faire de utf8_decode (ou à la limite utf8_encode si les données ne sont pas en utf8).

Bah si je fais une requête insert en PDO avec en valeur de variable un mot tel que "accentué", je le retrouve automatiquement dans la table sous la forme "accentuae" ou quelque chose comme ça (j'ai pas noté). Par contre si j'ajoute la fonction utf8decode avant :
$mot_a_inserer=utf8_decode($mot_a_inserer);

Alors il est inséré dans la base comme ça : "accentué" et non pas comme ça "accentuae".


J'ai l'impression de radoter, chouilla.
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 14:28

Comme souligné par @niap, à la connexion PDO il faut faire le SET NAMES = 'UTF8';
Tous les charsets doivent correspondre:
- Headers HTTP
- HTML meta charset HTML (et form encoding des fois défini)
- Interclassement base de données ET tables
- Connexion (set names)
- Fichiers PHP
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 14:35

Je veux bien faire cela, mais qu'est-ce que ça fait si je ne le fais pas ?

Dans le cas présent, je ne fais que créer un tuple dans la table post et dans ce tuple, je ne renseigne que le titre qui peut donc comporter un accent le cas échéant. Pourquoi donc se préoccuper de tout ce que @niap indique et que tu rapportes ?
Modifié en dernier par Alorsladaccord le Mer Mar 08, 2017 15:02, modifié 1 fois.
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 14:37

Si tu respectes pas tu risques d'avoir des pb d'encodage.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 15:09

J'ai rectifié ma dernière phrase un peu douteuse.
Il faut donc que je fasse quelque chose comme ça ?

$dbh = new PDO('mysql:host=localhost;dbname);
$dbh->exec("set names utf8");

Je pige pas.
Il faut faire cela pour tout texte que l'on insère dans la base de données et qui comporte des accents ?
Et ceci afin que ces accents s'affichent bien côté client ? Et pourquoi cette fonction s'applique-t'elle à la variable $dbh et non pas à la variable qui contient le texte qu'on insère ?
Et ça date de quand une nouveauté pareille ?
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 15:20

Faut le faire juste à la connexion.
NB: autre façon de faire: http://stackoverflow.com/a/584999/1656355

C'est pas une nouveauté, ça date depuis des années.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 15:53

Bah, j'ai pas programmé depuis des années...

Mais quelle est le principe de cette fonction Set names utf8, en fait ?

C'est pour faire gagner du temps aux webmestres en encodant tout une fois pour toute à la base, sans ajouter systématiquement des utf8_encode à chaque insertion ?
Ou c'est une fonction qui a été créée pour d'autres impératifs, par exemple pour s'adapter aux évolutions de MYSQL ?
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 15:55

https://dev.mysql.com/doc/refman/5.7/en/charset-connection.html
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 16:28

Oui, mais je ne comprends pas le rapport entre cet encodage et l'ordinateur client, donc le visiteur.
Si j'encode dans la base, c'est encodé en ut8 une bonne fois pour toute. Peut-être que le navigateur client va ensuite transformer cet encodage en un autre. Mais pourquoi cette fonction se préoccupe-t'elle de cela ?
Haut
Messages: 8559

Enregistré le: 14 Mai 2003

Message le Mer Mar 08, 2017 16:40

Le set names ne sert que pour la connexion entre PHP et le driver PDO.
Le browser il affiche ce qu'on lui demande, il transforme rien.

Bref: ton site est en UTF8, te casse pas la tête et met de l'UTF8 partout.
Haut
Messages: 527

Enregistré le: 30 Juil 2014

Message le Mer Mar 08, 2017 16:56

Vi...

Et donc pour ça, j'utilise cette fonction que je place directement dans le fichier connex.php et puis fi des utf_8 encode un partout par la suite...
$dbh = new PDO('mysql:host=localhost;dbname);
$dbh->exec("set names utf8");
Whoua c'est classe !

Y'en a pas d'autres des nouvelles astuce dans le genre ?
Par exemple un petit $dbh=exec("SANITIZE_EVERYTHING") serait de bon aloi.
Haut

Formation recommandée sur ce thème :

Formation SEO spéciale Wordpress : apprenez à optimiser le référencement naturel d'un site fait avec Wordpress... Formation Ranking Metrics animée par un expert SEO / Wordpress.

Tous les détails sur le site Ranking Metrics : programme, prix, dates et lieux, inscription en ligne.