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 sur les caractères : quote, tirets [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut encodage sur les caractères : quote, tirets
    Bonjour,

    je rencontre un problème d'encodage sur une base mysql 5.5.24 :
    j'ai une base, 'labase', encodée en utf8_general_ci
    qui contient des tables encodées en latin1_swedish_ci
    avec des colonnes en latin1_swedish_ci

    par exemple: pour "l'agglomération", phpmyadmin affiche "l'agglomération".
    pour "l'agglomération", phpmyadmin affiche "l'agglomération".

    Sur une page php dont voici les headers:
    Code html : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-15" />
    <meta http-equiv="Content-Style-Type" content="text/css" />
    <meta http-equiv="Content-Language" content="fr" />
    les données sont affichées correctement, c'est-à-dire que:
    "l'agglomération" s'affiche "l'agglomération"

    Sur cet page il y a une requête sql update (c'est un site qui date) :
    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
    $AdminConnect = mysql_connect($hostname_AdminConnect, $username_AdminConnect, $password_AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG));
    mysql_select_db($database_AdminConnect, $AdminConnect);
    if (isset($_REQUEST['TitreMemoire'])) {
    	$TitreMemoire = netString($_REQUEST['TitreMemoire']);
    }
    else {
    	$TitreMemoire=null;
    }
     
    /**
    * dans un autre fichier inclus
    */
    function netString($chaine) {
     
    	// Nettoyage 
    	$chaine = filter_var($chaine, FILTER_SANITIZE_STRING);
     
    	$chaine = stripslashes($chaine);
    	// Supprimer les espaces de début et de fin
    	$chaine = ltrim($chaine);
    	$chaine = rtrim($chaine);
     
    	return $chaine;
    }
    // fin et reprise du fichier main.php
     
     
    $query_UpdateForm = "UPDATE Etudiants SET TitreMemoire='$TitreMemoire'  WHERE Identifiant='$id';"
     
    $UpdateForm = mysql_query($query_UpdateForm, $AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG));
    $message="Op&eacute;ration ok";
    SI j'affiche la requête, j'obtiens:
    UPDATE Etudiants SET [...], TitreMemoire='Mise en place d'un outil d'évaluation socio-économique adapté aux projets de transport ferroviaire', UrlMemoire= [...] WHERE Identifiant='358'
    et elle fonctionne.
    Par contre, si l'on regarde dans phpmyadmin les apostrophes sont remplacées par '(avec point virgule bien sur) et les tirets (par exemple), les quotes sont remplacés aussi.

    Lors de l'update, dans la table, les apostrophes ' sont remplacés par ' par exemple.

    SI ce n'était que cela ce ne serait pas un problème, sauf qu'il faut pouvoir exporter en csv le contenu de la table Etudiants.

    Dans export.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
    20
    21
    22
    [...]
    header("Content-Type: text/csv");
    header("Content-Disposition: attachment; filename=export.csv");
     
    $liste=$_GET['liste'];
    $tri=$_GET['tri'];
     
    $AdminConnect = mysql_connect($hostname_AdminConnect, $username_AdminConnect, $password_AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG));
    mysql_select_db($database_AdminConnect, $AdminConnect);  
     
    $query_SelectionListe = "SELECT * FROM Etudiants WHERE Identifiant IN($liste)";
     
    $SelectionListe = mysql_query($query_SelectionListe, $AdminConnect) or die(afficherErreurMySQL(mysql_error(), $DEBUG));
    $row_SelectionListe = mysql_fetch_assoc($SelectionListe);
     
    // Ensuite dans une boucle
    // [...]
    // je construis mon fichier csv
    $thechamps1=$row_SelectionListe[$nomduchamp];
    $thechamps2=ereg_replace("\""," ",$thechamps1);
     
    echo '"'.$thechamps2.'",';
    MAIS LA, impossible d'afficher correctement les caractères encodés:
    ', ’, ", ‐, – soit ', ", ’, ... dans la bdd.
    J'ai essayer de résoudre le problème en modifiant l'encodage de la colonne TitreMemoire et de la table Etudiants; en jouant avec mysql_set_charset() (version de php 5.4.3) mais sans succès.

    En attendant de résoudre définitivement le problème; la seule méthode que j'ai trouvé c'est de remplacer ces encodages:
    dans export.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $thechamps1=$row_SelectionListe[$nomduchamp];
    $thechamps2=ereg_replace("\""," ",$thechamps1);
     
    $thechamps2 = ereg_replace("'","'",$thechamps2);
    $thechamps2 = ereg_replace("’","'",$thechamps2);
    // etc...
     
    echo '"'.$thechamps2.'",';
    Une solution des plus bancales

    Comment résoudre ce problème?
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

  2. #2
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    utf8_general_ci et latin1_swedish_ci sont des interclassements, ce n'est pas l'encodage des données.

    Les points à contrôler sont
    - l'encodage indiqué dans la page HTML
    - l'encodage de la connexion PHP-Mysql
    - l'encodage des fichiers

    ici pour UTF8, mais les contrôler sont les mêmes sur un autre encodage :
    http://j-willette.developpez.com/tut...-site-en-utf8/

    CEPENDANT, ton problème ne ressemble pas à un problème d'encodage.
    Ca ne serait pas plutôt ta fonction netString qui pose problème ?
    Tu ferrais mieux d'utiliser mysql_real_escape_string() egalement quelque part.
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  3. #3
    Membre éclairé Avatar de tigunn
    Homme Profil pro
    Développeur de bug
    Inscrit en
    Janvier 2003
    Messages
    608
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France

    Informations professionnelles :
    Activité : Développeur de bug

    Informations forums :
    Inscription : Janvier 2003
    Messages : 608
    Points : 658
    Points
    658
    Par défaut
    Merci Sabotage pour ta réponse,
    j'ai fait ainsi:
    j'ai remplacé la fonction netString() par mysql_real_escape_string() appelé avant la mise à jour du champs dans mysql; puis, j'affiche sur la page php la valeur directement extraite de la bdd.
    Cela fonctionne et évite cet encodage html de frele.

    Par contre, je ne comprend toujours pas pourquoi
    J'utilise filter_var dans nombre de mes développements et je n'avais jamais rencontré ce problème??
    Le monde se divise en deux: ceux qui utilisent le tag et les autres.

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

Discussions similaires

  1. Opérations arithmétiques sur les caractères
    Par JolyLoic dans le forum C
    Réponses: 6
    Dernier message: 18/01/2009, 21h59
  2. Les principes sur les caractères
    Par yann87 dans le forum Langage
    Réponses: 2
    Dernier message: 19/04/2008, 00h33
  3. problème d'encodage avec les caractères spéciaux
    Par wind_vinch dans le forum Ruby on Rails
    Réponses: 4
    Dernier message: 23/10/2007, 12h47
  4. Réponses: 4
    Dernier message: 03/07/2007, 11h21
  5. [RegEx] preg_replace : explications sur les caractères spéciaux
    Par Anduriel dans le forum Langage
    Réponses: 6
    Dernier message: 05/10/2005, 21h35

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