Bonjour,

Bon, je lis depuis un moment ce forum et généralement je trouve ma réponse, mais là, je sèche. Je reprends une base de données / un logiciel (interface web DHTML Suite) qui a quelques années dans le cadre de mon boulot, et... je ne m'en sors pas avec cette vacherie d'encodage caractère ^^

Je m'explique :

La base de données MySQL (5.0) est encodée en utf-8 (unicode), que ce soit la base en elle-même, la table, ou le champ. J'ai effectué une modification sur quelques tables qui ne l'étaient pas pour que le nouvel encodage soit pris en compte.

Les fichiers étaient parfois encodés en ISO, parfois en UTF-8, j'ai tout passé en UTF-8 pour de bon, et vu avec les autres développeurs pour qu'ils paramètrent leur Dreamweaver de telle façon que ça n'arrive plus. Par ailleurs, il y a une méta UTF-8, et un header en PHP qui précise que c'est de l'UTF-8.

Lors de l'insertion dans la base, la fonction mysql_real_escape_string (dépréciée sur ma version de PHP, 5.3) est appliquée aux champs, mais aucun utf8_encode ou utf8_decode, ou iconv, ou aucune fonction du genre. Les informations sont passées en AJAX au fichier qui fait l'insertion dans la base (pas de "escape" sur les données en javascript) et l'insertion en elle-même ne fait l'objet d'aucune erreur.

Mon soucis : je n'ai aucun problème d'affichage dans le logiciel en lui-même, tout passe très bien, mais lorsque je vais dans PHPMyAdmin, il m'affiche des é et autres caractères utfhuités : l'encodage du PHPMyAdmin est bien UTF-8, et le navigateur prend bien la page en UTF-8 également... (si jamais je m'amuse à mettre ISO dans le navigateur, j'ai carrément é).

L'ennui est que pour les exports depuis PHPMyAdmin, des CSV ou du SQL tout moche ressort.
Une bonne âme aurait-elle une idée ?

Bonne journée, et merci d'avance Smiley cligne
Re-bonjour,

Bon, j'ai finalement trouvé le problème. J'avais tenté plutôt de le faire, mais je n'avais pas encore tout corrigé (header des fichiers, etc).

Il s'agit bien sûr de : mysql_query("SET NAMES 'utf8'");
Ceci pour forcer les transactions en UTF8 avec la base de données.

Tout est bon de mon côté,
Merci à ceux qui y ont réfléchi (ouais hein, quand même) Smiley cligne
Hello,

Fait attention quand même car si tu changes le charset par défaut avec SET NAME tu t'expose à certaines failles par injection SQL (selon la façon dont tu échappes tes données avant de les utiliser dans tes requêtes SQL).

Il est plus prudent d'utiliser (dans ton cas) la fonction mysql_set_charset().


$link = mysql_connect($host,$user,$password,FALSE);
mysql_selectdb($databse,$link);
mysql_set_charset('utf8',$link);

Modifié par jb_gfx (31 Jan 2011 - 23:21)
Bonjour,

A vrai dire, j'utilise mysql_real_escape_string pour faire mes échappements (la fonction à laquelle elle fait appel, mysql_escape_string, est dépréciée mais je ne vois pas quoi utiliser d'aussi complet, hormis peut-être une fonction maison, qui ne sera pas forcément aussi optimisée), mais je dois encore corriger un certain nombre de portions de code qui ne font... aucun échappement avant insertion en base de données.

Dans l'absolu, c'est une application intranet, mais je corrige cela aussi vite que possible. Mais c'est vaste.

Sachant que je fais appel à la fonction SET NAMES juste après mon mysql_select_db, y a-t-il une différence entre les deux ? SET NAMES définit le charset pour de bon, et mysql_set_charset juste pour la connexion courante ? Si c'est le cas, je retirerai la ligne SET NAMES du fichier de config.

Merci pour ta réponse en tout cas Smiley cligne
E fait quand tu utilises SET NAMES, la connexion ne sait pas que tu as redéfini le charset et cela ouvre une faille qui permet d'utiliser (potentiellement) des injections SQL reposant sur un bug de la gestion des charsets sous mySQL. En gros en utilisant certains caractères suivis d'un guillemet simple on peut injecter modifier tes requêtes. La faille se situe au niveau de la connexion et de la façon dont sont transmises les données à mySQL.

Il y a d'autres paramètres qui rentrent en jeu, donc c'est une faille potentielle. Mais pour être sûr autant utiliser mysql_set_charset() ou mysqli_set_charset().
Bonjour,

C'est noté, ceci dit, il faudra pour cela faire une mise à jour de MySQL sur les serveurs de développement étant donné qu'on s'est arrêté à MySQL 5.05a.

Merci pour ton aide Smiley cligne