IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Encodage des caractères [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut Encodage des caractères
    EDIT : nouveau problème à la fin du sujet

    Bonjour,

    décidément je n'arrive pas à me passer du forum ...

    J'ai passé toute ma base ainsi que mes pages en UTF-8. Je me suis rendue compte qu'avec la fonction strtolower(), ça ne fonctionnait pas et j'ai lu sur le web que c'était normal.

    J'utilise donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mb_strtolower($donnees['nom_categorie'],'UTF-8')
    qui fonctionne.

    Mais, j'aimerai remplacer mes caractères accentués comme â ou é par a ou e.
    J'ai donc voulu utiliser la fonction strtr() comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
    $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
    Et là, au lieu d'avoir maître > maitre, j'obtiens 'mau-tre'.
    Est-ce que c'est normal par rapport à mon code (ça doit sûrement être ça) ?

    Si c'est normal, pas moyen de faire autrement de manière à ce que mes caractères accentués soient remplacés normalement ?

    EDIT : hum, j'espère être dans la bonne partie du forum au fait ... j'ai un doute. Si un modérateur ou admin passe par là, vous pouvez déplacer le post s'il vous plait ?

  2. #2
    Membre éclairé Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut
    Euh, j'ai juste voulu tester ton code pour voir un peu le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    <?php
      $nomcatform = 'maître';
     
      $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
      $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
     
      echo $nomcatform."<br />".$nomcat;
    ?>
    et j'obtiens bien
    Du coup ton erreur ne doit pas être là...

  3. #3
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Merci d'avoir testé ! Ben du coup je vais chercher ailleurs, mais je ne vois pas trop d'où ça peut venir ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    // On écrit tout en minuscule
    $nomlower = Securite::bdd(mb_strtolower($donnees['nom_categorie'],'UTF-8'));
    // On enlève les espaces
    $nomreplace = str_replace(' ','',$nomlower);
    // On enlève les quotes
    $nomreplace2 = str_replace('\'','',$nomreplace);
    // On enlève les \
    $nomcatform = str_replace('\\','',$nomreplace2);
    avec Securite::bdd :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    class Securite
    {
    	// Données entrantes
    	public static function bdd($string)
    	{
    		// On regarde si le type de string est un nombre entier (int)
    		if(ctype_digit($string))
    		{
    			$string = intval($string);
    		}
    		// Pour tous les autres types
    		else
    		{
    			$string = mysql_real_escape_string($string);
    			$string = addcslashes($string, '%_');
    		}
    		return $string;
    	}
    }
    Ceci me renvoie la bonne chaîne : maîtredouvrage
    Et là je veux remplacer les caractères accentués, donc avoir : maitredouvrage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    // On enlève les caractères accentués des noms des catégories
    $nomcat = strtr($nomcatform, 'àçèéêëîïôùû', 'aceeeeiiouu');
    $nomcat = preg_replace('/([^.a-z0-9]+)/i', '-', $nomcat);
    Et j'obtiens : mau-tredouvrage

    Donc je ne vois pas d'où ça peut venir si ce n'est du strtr, ou du preg_replace ...

    Mes pages sont en UTf-8, ma base de données aussi.

    EDIT : avec maître d'ouvrage délégué, j'obtiens : mau-tredouvrageduiluiguui

    donc le problème doit bien se situer dans mes deux fonctions quand même oO

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    6 152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 6 152
    Par défaut
    Question récurrente : strtr ne gère pas les caractères multi-octets. Il faut utiliser autre chose ou décoder puis réencoder après la chaîne.

    Et preg_replace a normalement besoin de l'option u avec de l'UTF-8.

  5. #5
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Merci pour ta réponse julp.

    Il faut utiliser autre chose ou décoder puis réencoder après la chaîne.
    Comme utf8_encode et utf8_decode ? Si c'est ça, j'ai testé sans succès ...
    Je vais voir pour l'option u de preg_replace.

  6. #6
    Membre éclairé Avatar de s.lennon
    Inscrit en
    Juin 2009
    Messages
    66
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Juin 2009
    Messages : 66
    Par défaut
    Si tu fais un echo de $nomlower, tu as bien "maître d'ouvrage délégué" ?

    Pour ce qui est de ta fonction, j'avoue ne pas connaître mysql_real_escape_string et autres... Essaies de faire un echo de ta variable à chaque étape, ça peut te permettre de voir d'où vient l'erreur précisément.

  7. #7
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'nom lower : '.$nomlower.' nomreplace : '.$nomreplace.' nomreplace2 : '.$nomreplace2.' nomcatform : '.$nomcatform.' nomcat : '.$nomcat.'<br />';
    Et cela me renvoie :

    nom lower : maître d\'ouvrage délégué nomreplace : maîtred\'ouvragedélégué nomreplace2 : maîtred\ouvragedélégué nomcatform : maîtredouvragedélégué nomcat : mau-tredouvrageduiluiguui
    Donc c'est bien à la dernière étape que j'ai un problème.

    EDIt : les tests avec encode et decode ne donnent rien.
    Dois-je me servir de str_replace sinon ?

    EDIT 2 : testé avec str_replace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $accent = array('à','ç','è','é','ê','ë','î','ï','ô','ù','û'); 
    $sansacc = array('a','c','e','e','e','e','i','i','o','u','u');
    $nomcat = str_replace($accent,$sansacc,$nomcatform);
    Et ça fonctionne.
    Donc je vais garder ceci ! Merci d'avoir répondu

  8. #8
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Je reprends ce post parce que c'est un peu lié, et cette fois à MySQL aussi.

    J'ai un problème au niveau de l'encodage des caractères.

    Voilà ce que j'ai : Projet n°1 / à propos
    au lieu de : Projet n°1 / à propos

    J'ai passé toute ma base mysql en utf8_general_ci.
    Sur mes pages j'ai mis : mysql_set_charset('utf8'); .
    J'ai aussi : <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

    J'ai testé : mysql_query("SET NAMES 'utf8'"); écrit ici.

    Le nom dans ma base de données est enregistré comme : Projet n°1.

    Mais rien n'y fait. Où ai-je oublié quelque chose ? Est-ce que j'ai loupé une étape importante ?

  9. #9
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Et ton éditeur de code, il est bien configuré en pour te faire des fichiers en UTF-8?

  10. #10
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Notepad++ > encoder en UTF-8 (sans BOM), format UNIX

  11. #11
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Bah effectivement c'est bizarre, et tu as vérifié si tes tables étaient en UTF_8 aussi ainsi que les champs de tes tables?

  12. #12
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    Oui j'ai revérifié, tout est en utf-8.

    Et un truc étrange :
    - j'affiche trois parties différentes dans ma page, récupérant des données de trois tables différentes.

    Pour deux des trois tables, mes accents sont bien réécrits, sauf pour la troisième !

    J'ai vérifié sur mes pages d'ajout, le code est le même au niveau de l'encodage, et dans la base tout est enregistré de manière correcte.

    ex : (Sâlpètre) > s'affiche correctement venant de la première table.
    ex2 : n°1 > devrait afficher n°1 venant de la seconde table (même exemple avec : à propos )

    Une petite idée ? Vous avez besoin de voir du code ? Moi je sèche ...

  13. #13
    Membre éprouvé
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2009
    Messages
    180
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2009
    Messages : 180
    Par défaut
    Fais voir ton code c'est mieux. Ah puis aussi au niveau de la base de données, tout est bien écrit correctement? Les problèmes ne sont pas déjà présent?

  14. #14
    Membre confirmé Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Par défaut
    Moi pour la conversion de caractères j'utilise ces deux fonctions :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    function fixEncoding($in_str)
    {  
    	/*
    	fix the encoding for string, keyed array
    	*/ 
        if(is_string($in_str)){ $in_str = array($in_str);}
     
    	$in_str_tmp = array();
    	foreach($in_str as $key =>$input  )
    	{	
      		$cur_encoding = mb_detect_encoding($input) ;
      		if($cur_encoding == "UTF-8" && mb_check_encoding($input,"UTF-8"))
        		$in_str_tmp[$key] =$input;
      		else
                $in_str_tmp[$key] = utf8_encode($input);
        }
        if(count($in_str_tmp)>1) { return $in_str_tmp;}
        else { return $in_str_tmp[$key];} 
     
    }
    function fixDecoding($in_str)
    {
    	if(is_string($in_str)){ $in_str = array($in_str);}
     
    	$in_str_tmp = array();
    	foreach($in_str as $key =>$input  )
    	{	
      		$cur_encoding = mb_detect_encoding($input) ;
      		if($cur_encoding == "ISO-8859-1" && mb_check_encoding($input,"ISO-8859-1"))
        		$in_str_tmp[$key] =$input;
      		else
                $in_str_tmp[$key] = utf8_decode($input);
        }
        if(count($in_str_tmp)>1) { return $in_str_tmp;}
        else { return $in_str_tmp[$key];}
    }
    Si ca peux t'aider .

  15. #15
    Membre éclairé Avatar de baggie
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    755
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Octobre 2007
    Messages : 755
    Par défaut
    EDIT : problème trouvé, cf bas de page.

    Citation Envoyé par yann0807 Voir le message
    Fais voir ton code c'est mieux. Ah puis aussi au niveau de la base de données, tout est bien écrit correctement? Les problèmes ne sont pas déjà présent?
    Dans ma base de données, je n'ai pas de problème apparent : voici ce que j'ai : Maître d'ouvrage délégué.

    Tout est en utf8.

    Et sur la page où je récupère mes données, j'ai donc celles provenant de la table SOCIETE qui s'affichent comme il faut, et celles provenant de la table PROJET qui posent problème. Je ne crois pas avoir vu de différences sur l'ajout dans ces deux tables.
    Je vous donne mon code (que les parties correspondantes aux noms de projet et de société) :

    ajout_societe.php :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
    <?php
    	$connexion = mysql_connect($serveur,$login,$mdp);
    	mysql_select_db("mabase",$connexion);
    	mysql_set_charset('utf8');
    ?>
     
    <tr><td>Nom <span class="etoile">*</span></td><td><input type="text" name="nom_societe" /></td></tr>
     
    // [...]
    $nom = Securite::bdd($_POST['nom_societe']);
    $req = mysql_query("INSERT INTO SOCIETE(...) 
                                 VALUES ('".$nom."', ...);");
    ajout_projet.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
     
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
     
    <?php
    	$connexion = mysql_connect($serveur,$login,$mdp);
    	mysql_select_db("mabase",$connexion);
    	mysql_set_charset('utf8');
    ?>
     
    <tr><td>Nom du projet <span class="etoile">*</span></td><td><input type="text" name="nom_projet" /></td></tr>			
     
    // [...]
     
    $nom = Securite::bdd($_POST['nom_projet']);
    $req = mysql_query("INSERT INTO PROJET(...) 
                                 VALUES ('".$nom."', ...);");
    Sur mes deux pages j'ai ceci tout en haut aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    <?php
    session_start();
     
    require("page_connexion.php");
    require("securite.php");
     
    if($_SESSION['connect'] != 1)
    {
    	header("Location: index.php");
    	die();
    }
    else if($_SESSION['admin'] == 0)
    {
    	header("Location: deconnexion.php");
    	die();
    }
    ?>
    Difficile de vous donner plus de code parce qu'après ça fera un fichier entier et ça ne concerne pas directement les données qui posent problème.

    Et securite.php en entier (code trouvé sur le net) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    <?php
    class Securite
    {
    	// Données entrantes
    	public static function bdd($string)
    	{
    		// On regarde si le type de string est un nombre entier (int)
    		if(ctype_digit($string))
    		{
    			$string = intval($string);
    		}
    		// Pour tous les autres types
    		else
    		{
    			$string = mysql_real_escape_string($string);
    			$string = addcslashes($string, '%_');
    		}
     
    		return $string;
            }
    	// Données sortantes
    	public static function html($string)
    	{
    		return htmlentities($string);
    	}
    }
    ?>
    Je vais tester tes fonctions speedy_g !
    En tout cas, si quelqu'un avait une idée ou un éclair de génie là tout de suite je suis preneuse ... x)

    EDIT : j'ai trouvé mon problème (enfin !). Pour afficher mes données, j'utilisais Securite::html. Donc ça plantait. J'utilise Securite::bdd et là ça fonctionne parfaitement !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [MySQL] Encodage des caractères sous php4 lors de reception
    Par UN|X` dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 10/04/2007, 15h50
  2. [mysql]encodage des caractères
    Par ideal23 dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/10/2006, 13h16
  3. Probleme d'encodage des caractères spéciaux
    Par pacoulitou24 dans le forum Format d'échange (XML, JSON...)
    Réponses: 4
    Dernier message: 20/06/2006, 16h47
  4. Réponses: 15
    Dernier message: 24/02/2006, 14h17

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo