Bonjour à tous.
Alors pour résumer tous vos posts :
@dunbar : non, je n'ai pas essayé "utf8_decode()".
Je n'ai pas voulu utiliser cette fonction car je pensais que le "tout utf8" permettait de l'éviter... mais en dernier ressort... si je dois y passer...
@Victor BRITO : mes fichiers PHP sont édités avec Zend studio en UTF8, et normalement sans BOM...
En revanche, je vais quand même les revérifier avec NotePad++ (mais je ne pense pas qu'il y ait de souci à ce niveau...)
@AB :
1- OK, mes tables sont en UTF8_bin et l'interclassement aussi.
2- Le header des entêtes est bien celui-là
3- j'ai bien la requête "SET NAMES 'utf8'" dans ma fonction de connexion de manière à ce qu'elle soit exécutée à chaque fois.
4- j'ai également la balise meta pour l'encodage UTF-8...
J'avoue que là... c'est bien la première fois que je reste bloqué sur un truc comme ça... !
Dans le doute, je vous mets les fonctions en question car je ne vois plus qu'un problème à leur niveau...
Fichier des entêtes :
//On force les entêtes en UTF-8
header("content-type:text/html; charset=utf-8");
session_start();
ob_start('ob_gzhandler');
setlocale(LC_CTYPE,'french');
//On écrit l'entete de la page
echo "<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n";
echo "<html xmlns=\"http://www.w3.org/1999/xhtml\" xml:lang=\"".$aConf["global"]["lang_abbreviation"]."\" lang=\"".$aConf["global"]["lang_abbreviation"]."\" dir=\"".$aConf["global"]["lang_direction"]."\">\n";
echo " <head>\n";
//On écrit les balises META
echo " <meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" />\n";
echo " <meta http-equiv=\"Content-Style-Type\" content=\"text/css\" />\n";
echo " <meta http-equiv=\"Content-Style-Type\" content=\"text/javascript\" />\n";
echo " <meta http-equiv=\"Content-Language\" content=\"".$aConf["global"]["lang_abbreviation"]."\" />\n";
echo " <meta name=\"author\" content=\"".NOM_DEVELOPPEUR."\" />\n";
echo " <meta name=\"generator\" content=\"Zend Studio\" />\n";
echo " <meta name=\"keywords\" content=\"".KEYWORDS_META."\" />\n";
echo " <meta name=\"description\" content=\"".DESCRIPTION_META."\" />\n";
echo " <link rel=\"stylesheet\" href=\"".$sRacineSite."/themes/".$aConf["global"]["theme"]."/style.css\" type=\"text/css\" media=\"all\" />\n";
echo " <title>".TITRE_BARRE_TITRES."</title>\n";
echo " </head>\n";
Connexion :
function connexion($sServeur, $sBase, $sUser, $sPwd){
//Messages d'erreur de connexion
//Pour le serveur
$sErrServeur = "Connexion au serveur <b>\"".$sServeur."\"</b> impossible !";
$sErrServeur = $sErrServeur . "<br>Identification de l'erreur : ";
//Pour la BDD
$sErrBdd = "Connexion à la base de données <b>\"".$sBase."\"</b> impossible !";
$sErrBdd = $sErrBdd . "<br>Identification de l'erreur : ";
//Connexion au serveur
$bConnexion = @mysql_connect($sServeur, $sUser, $sPwd, TRUE);
$GLOBALS["connexion"] = $bConnexion or die($sErrServeur . mysql_error());
//Connexion à la base de données choisie
$db = @mysql_select_db($sBase,$GLOBALS["connexion"]);
$db = $db or die($sErrBdd . mysql_error());
//Indique à MySQL de travailler en UTF-8 (par défaut MySQL risque de travailler au standard ISO-8859-1)
mysql_query("SET NAMES 'utf8'");
}
Détection ou non de l'activation des magic_quotes :
function test_magic_quotes(){
//On fait notre tests
if(get_magic_quotes_gpc()){
//Les magic_quotes sont activées
$bMagicQuotes = TRUE;
}
else{
//Les magic_quotes sont desactivées
$bMagicQuotes = FALSE;
}
//On retourne le résultat
return $bMagicQuotes;
}
Traitement pour enregistrement dans BDD :
function cleanData($Variable){
//On vérifie l'activation ou non des magic_quote
if(test_magic_quotes() == FALSE){
//Magic_quote désactivées donc on traite les données
//ATTENTION cette fonction n'est pas récursive !!!!
//On doit donc rentrer dans le tableau
if (is_array($Variable)) {
//On parcours le contenu du tableau
foreach ($Variable as $i => $Contenu) {
//Suppression des espaces
$Variable[$i] = trim($Contenu);
//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
$Variable[$i] = mysql_real_escape_string($Contenu);
}
}
//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
else{
//Suppression des espaces
$Variable = trim($Variable);
//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
$Variable = mysql_real_escape_string($Variable);
}
}
else{
//Magic_quote activées, donc on ne rajoute pas de caractères d'échappement
//ATTENTION cette fonction n'est pas récursive !!!!
//On doit donc rentrer dans le tableau
if (is_array($Variable)) {
//On parcours le contenu du tableau
foreach ($Variable as $i => $Contenu) {
//Suppression des espaces
$Variable[$i] = trim($Contenu);
}
}
//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
else{
//Suppression des espaces
$Variable = trim($Variable);
}
}
//On retourne la variable
return $Variable;
}
Traitement pour affichage après extraction de la BDD :
function displayData($Variable){
//On vérifie l'activation ou non des magic_quote
if(test_magic_quotes() == FALSE){
//Magic_quote désactivées donc on traite les données
//ATTENTION cette fonction n'est pas récursive !!!!
//On doit donc rentrer dans le tableau
if (is_array($Variable)) {
//On parcours le contenu du tableau
foreach ($Variable as $i => $Contenu) {
//Conversion des caractères spéciaux HTML
$Variable[$i] = htmlentities($Contenu, ENT_QUOTES, 'UTF-8');
}
}
//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
else{
//Conversion des caractères spéciaux HTML
$Variable = htmlentities($Variable, ENT_QUOTES, 'UTF-8');
}
}
else{
//Magic_quote activées, donc on supprime les caractères d'échappement "\"
//ATTENTION cette fonction n'est pas récursive !!!!
//On doit donc rentrer dans le tableau
if (is_array($Variable)) {
//On parcours le contenu du tableau
foreach ($Variable as $i => $Contenu) {
//Suppression des backslashes
$Variable[$i] = stripslashes($Contenu);
}
}
//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
else{
//Suppression des backslashes
$Variable = stripslashes($Variable);
}
}
//On retourne la variable
return $Variable;
}
Et je viens de me rendre compte que mes caractères type guillemets par exemple ne doivent pas être échapés correctement car si je réaffiche la valeur dans un input, les guillemets sont bien présent, mais du coup le reste de ma ligne de code n'est pas prise en compte.
(exemple : value="opération "Teddy"" -> je ne vois que "opération dans le input)
J'ai trouvé une solution en rajoutant un
$Variable = htmlspecialchars($Variable, ENT_QUOTES,'UTF-8'); dans la fonction de traitement de l'enregistrement, mais je ne pense pas que ce soit le bon truc...
Voilà, j'espère que ça va pouvoir vous éclairer.
