Question théorique à propos de l'insertion d'accent dans la base

Alorsladaccord

WRInaute occasionnel
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 ?
 

spout

WRInaute accro
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 ?
 

niap

WRInaute discret
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".
 

Alorsladaccord

WRInaute occasionnel
spout a dit:
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 dit:
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.
 

spout

WRInaute accro
Alorsladaccord a dit:
- 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 dit:
- 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 dit:
- Je ne sais pas ce que tu appelles l'interclassement.
https://openclassrooms.com/courses/comprendre-les-jeux-de-caracteres-e ... lassements
 

Alorsladaccord

WRInaute occasionnel
Merci pour le lien, Spout. Je finirai de lire l'article avant ma mort.
spout a dit:
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.
 

spout

WRInaute accro
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
 

Alorsladaccord

WRInaute occasionnel
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 ?
 

Alorsladaccord

WRInaute occasionnel
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 ?
 

Alorsladaccord

WRInaute occasionnel
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 ?
 

Alorsladaccord

WRInaute occasionnel
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 ?
 

spout

WRInaute accro
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.
 

Alorsladaccord

WRInaute occasionnel
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.
 

Discussions similaires

Haut