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 :

Interprètation de caractères accentués [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Interprètation de caractères accentués
    J'ai un drôle de soucis.
    J'ai une base MySQL (Version du serveur: 5.0.51a-3ubuntu5.1). Dans cette base, je cherche a exploiter deux tables à travers la requete suivante :

    $requeteLivres = "SELECT mouvements.Cid AS \"Ref.DNA\", mouvements.DateEmprunt AS \"Emprunté le\", mouvements.DateRestitution AS \"Restitué le\", livres.Auteur, livres.Titre FROM mouvements INNER JOIN livres ON mouvements.Cid=livres.RefDNA WHERE mouvements.CodeCategorie=\"LIVRES\" AND mouvements.Personne=".$indexeEmprunteur." AND DateRestitution IS NOT NULL ORDER BY DateEmprunt DESC";

    Mes deux tables sont définies sur mon serveur avec l'interclassement utf8_unicode_ci. Lorsque je construit le résultat dans la suite de mon code php sous la forme d'un balisage HTML de tableau, ce dernier s'affiche correctement, son contenu aussi à un détail prèt, les caractères accentués ne sont pas interprètés ?! Dans IE ils sont remplacés par un carré blanc, et sous Firefox par un losange noir contenant un point d'interrogation blanc.
    Par contre, si j'éffectue une requete plus simple sur la table des livres, genre :
    SELECT * FROM livres, et que je construit de la même manière mon tableau HTML, les accents sont là ?!...........
    Y aurait-il une influence dans l'interprètation des caractères accentués lorsque l'on utilise les jointures ?
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  2. #2
    Membre confirmé Avatar de Momodedf
    Inscrit en
    Juillet 2007
    Messages
    246
    Détails du profil
    Informations personnelles :
    Âge : 36

    Informations forums :
    Inscription : Juillet 2007
    Messages : 246
    Par défaut
    En HTML on ne doit pas utiliser de caractères accentués normalement mais leur correspondance ASCI par exemple.
    Donc dans un document HTML tu n'écriras pas "é" mais "é".
    Tu peux chercher sur internet les correspondances de tout les caractères spéciaux.

  3. #3
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Merci...
    C'est gentil à vous de répondre à mon interrogation. Mais le problème que je rencontre ne se situe pas là.
    En fait, la table 'livres' contient dans ses champs Auteur et Titre des données de type varchar(255) tous les deux avec l'interclassement UTF-8 unicode.
    Lorsque je fait ma requête SELECT RefDNA, Auteur, Titre FROM livres via php, et qu'ensuite j'utilise la fonction echo dans une boucle de lecture pour récupérer le contenu de la réponse SQL et construire un tableau HTML, je n'ai null besoin d'internationaliser mes caractères accentués pour qu'ils s'affichent correctement.
    Par contre, dans le cas d'une autre requête qui s'adresse aux tables 'mouvements' et 'livres' par le biais d'une jointure entre ces tables, tout se passe bien, mais le tableau obtenu n'interprète plus les caractères accentués. Pourquoi ?
    Dans le premier cas je ne veux afficher que la liste des livres, dans le second, je consulte la table des mouvements pour lister les prêts d'un emprunteur particulier. Pour cela j'effectue une requête sur la table mouvements, et pour pouvoir compléter mon tableau réponse des informations de nom et de titre de l'objet, je fait une jointure vers la table des livres.
    Si j'effectue cette requête :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT mouvements.Cid, mouvements.DateEmprunt, mouvements.DateRestitution, livres.Auteur, livres.Titre FROM
    mouvements INNER JOIN livres ON mouvements.Cid=livres.RefDNA
    WHERE mouvements.DateRestitution IS NOT NULL AND mouvement.Personne=677
    ORDER BY mouvements.DateEmprunt DESC;

    Dans phpMyAdmin, la requête fonctionne, et le résultat présente mes champs correctement, aucuns problèmes d'accents.
    Lorsque je réalise la même requête dans mon code php, les accents ne sont plus là, Pourquoi ?

    Voici un extrait de mon code :

    $requeteLivres est une chaîne constituée plus haut et contenant la requete SQL.

    $reponseLivres est l'objet contenant la réponse de mysql_query($requeteLivres).

    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
    if ($requeteLivres != "") {
    	echo "<DIV align=\"center\"><HR width=\"50%\"><BR><P><B>Historique pour les livres :</B> ".$nombreLivres." pr&egrave;ts</P></DIV>";
    	echo "<DIV align=\"center\">";
    	echo "<TABLE name=\"LIVRES_HISTO\" border=0 width=\"80%\" cellspacing=\"0\" style=\"font-family:'Times New Roman',Times,serif; font-size:10pt\">";
    	echo "<TR>";
    		$enteteTableau = mysql_fetch_assoc($reponseLivres);
    		$largeurs[0]="10%";
    		$largeurs[1]="15%";
    		$largeurs[2]="15%";
    		$largeurs[3]="20%";
    		$largeurs[4]="40%";
    		$cpt=0;
    		foreach ($enteteTableau as $nom => $valeur) {
    			echo "<TD align=\"center\" BGCOLOR=\"#000000\" width=\"". $largeurs[$cpt]. "\"><FONT color=\"white\"> $nom </FONT></TD>";
    			$cpt++;
    			}
    	echo "</TR>";
    	$cptLignes=0;
    	while($resultatLivres = mysql_fetch_array($reponseLivres, MYSQL_NUM)) {
    		if($cptLignes%2 == 0) echo "<TR BGCOLOR=\"#C4C4C4\" bordercolor=\"#C4C4C4\">";
    		else echo "<TR BGCOLOR=\"#E4E4E4\" bordercolor=\"#E4E4E4\">";
    		$cpt=0;
    		foreach($resultatLivres as $valeur) {
    			echo "<TD width=\"$largeurs[$cpt]\"> $valeur </TD>";
    			$cpt++;
    			}
    		$cptLignes++;
    		echo "</TR>";
    		}
    	echo "</TABLE>";
    	echo "</DIV><BR>";
    	}
    J'utilise exactement la même boucle pour mes deux requêtes, la seule différence, c'est la requête SQL.
    Je n'arrive pas à comprendre pourquoi la requête simple me donne un tableau avec les caractères accentués correctement affichés, mais pas avec la requête qui contient une jointure ???????
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

  4. #4
    Membre confirmé Avatar de nimbus_77
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    109
    Détails du profil
    Informations personnelles :
    Âge : 69
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 109
    Par défaut j'ai constaté ...
    ...

    que mysql ne rendait pas correctement les accents dans les champs "varchar".

    J'avais un champs qui, par défaut était, 'dédié' mais ce n'est pas du tout ce qu'il affichait.

    Mysql semble ne pas supporter les accents plus que les espaces, sauf dans des champs de type TEXT.

    J'apprécierai aussi d'en connaître la raison.

  5. #5
    Membre Expert
    Avatar de yotta
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Septembre 2006
    Messages
    1 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Technicien maintenance
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2006
    Messages : 1 088
    Par défaut Une solution, mais pas d'explications...
    A force de parler de mon problèmes à différents collègues au boulot, j'ai été mis sur une piste particulière. En fait, mon cas est un peu particulier dans le sens ou je développe sous windows des choses que j'execute ensuite sur une machine unix. Quel rapport me direz-vous ? Et bien, l'encodage des caractères dans les fichiers ascii.
    C'est dépendant de l'OS, et ça a apparament toujours été un problèmes de type casse-tête à gérer.
    En clair, j'écris mes fichiers php avec mon bon vieux Notepad, et ensuite, je les copie via ftp sur mon serveur Linux Ubuntu. Et parfois, à l'occasion d'une petite correction, pour ne pas refaire tout le cycle, je lance mon VNC et je prends la main sur mon serveur ou j'édite mon fichier php avec GEdit de gnome. Et c'est là que ça couac...
    Notepad sous windows enregistre par défaut les fichiers ascii avec un encodage ANSI, alors que les machines Linux encode en UTF-8 par défaut.
    Moralité, je me suis vite retrouvé avec un fichier un coup encodé ANSI, un coup UTF-8, bref, pas bon.
    Alors, j'ai décidé de ré-écrire intégralement mon fichier php avec GEdit directement sur le serveur, et là, surprise, mes accents sont là... mais pas tous !
    En effet, dans le texte qui habille mon tableau et récapitule quelques infos les accents sont maintenant parfait, mais toujours pas dans le résultat de la requete présentée sous la forme d'un tableau.
    Alors j'ai continué à chercher dans les fonctions php concernant les chaînes, et je suis tombé sur la fonction htmlentities(String).
    C'est magique, dans les lignes echo de mon code où j'écris $valeur, j'ai mis htmlentities($valeur), et là, miracle, les accents sont là, en minuscule comme en majuscule.
    Bref, ça marche, mais je comprends toujours pas pourquoi dans le cas de la requete simple je n'ai pas besoin de faire de htmlentities, alors que dans le cas d'une requete qui concerne deux tables, j'y suis obligé ?!....

    Sinon, merci à vous nimbus 77, je vais voir si je peux me passer de ce fameux htmlentities en modifiant la structure de ma table et opter pour un champ TEXT au lieu d'un VarChar. Merci à vous.
    Une technologie n'est récalcitrante que par ce qu'on ne la connait et/ou comprend pas, rarement par ce qu'elle est mal faite.
    Et pour cesser de subir une technologie récalcitrante, n'hésitez surtout pas à visiter les Guides/Faq du site !

    Voici une liste non exhaustive des tutoriels qui me sont le plus familiers :
    Tout sur Java, du débutant au pro : https://java.developpez.com/cours/
    Tout sur les réseaux : https://reseau.developpez.com/cours/
    Tout sur les systèmes d'exploitation : https://systeme.developpez.com/cours/
    Tout sur le matériel : https://hardware.developpez.com/cours/

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

Discussions similaires

  1. [Débutant] Interpréter les caractères accentués en non accentués
    Par wofty dans le forum Visual Studio
    Réponses: 1
    Dernier message: 17/05/2012, 23h11
  2. Chaines avec caractères accentués dans interbase
    Par Tsimplice dans le forum Bases de données
    Réponses: 4
    Dernier message: 08/03/2004, 17h12
  3. Chaînes avec des caractères accentués dans Interbase
    Par Invité dans le forum Bases de données
    Réponses: 2
    Dernier message: 04/03/2004, 22h39
  4. [PostgreSQL] Les caractères accentués ?
    Par yacomor dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/02/2003, 16h30
  5. insérer des caractères accentués INFORMIX/JDBC
    Par donde dans le forum Informix
    Réponses: 2
    Dernier message: 19/11/2002, 20h02

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