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 :

erreur d'encodage avec mon ami sql


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Points : 56
    Points
    56
    Par défaut erreur d'encodage avec mon ami sql
    Bonjour a tous, je "comprend" (en gros) le php mais je n'ai jamais été doué pour l'appliquer, comme je voulais faire une sorte de forum (ca ressemble plus a un chat au final) j'ai pris ce qui ce rapproche d'un tuto que j'ai "adapté"
    tout fonctionne bien, mais ... toujours un mai
    voila l'erreur que j'ai
    é = é
    è = è
    à = Ã
    dans la source de la page :
    é
    è
    à
    dans la table texte de mysql :
    é
    è
    à
    mon code 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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
     
    mysql_connect("localhost", "$user_db", "$pass_db");
    mysql_select_db("$nom_db");
    mysql_query("SET NAMES UTF8"); 
     
    if (isset($_POST['pseudo']) AND isset($_POST['message']))
    {
    $pseudo = mysql_real_escape_string(htmlspecialchars($_POST['pseudo']));
    $message = htmlentities($_POST['message'], ENT_QUOTES, 'UTF-8');
    mysql_query("INSERT INTO forum VALUES('', '" . $pseudo . "', '" . $message . "', '".date("Y-m-d H:i:s")."')");
     
    $nombreDeMessagesParPage = 20;
    $retour = mysql_query('SELECT COUNT(*) AS nb_messages FROM forum');
    $donnees = mysql_fetch_array($retour);
    $totalDesMessages = $donnees['nb_messages'];
    $nombreDePages  = ceil($totalDesMessages / $nombreDeMessagesParPage);
     
    echo 'Aller à la page : ';
    for ($i = 1 ; $i <= $nombreDePages ; $i++)
    {
        echo '<a href="?rep=/forum&page=' . $i . '">' . $i . '</a> ';
    }
    echo '</p>';
    if (isset($_GET['page']))
    {
            $page = $_GET['page'];
    }
    else
    {
            $page = 1;
    }
     
    $premierMessageAafficher = ($page - 1) * $nombreDeMessagesParPage;
     
    $reponse = mysql_query('SELECT * FROM forum ORDER BY id DESC LIMIT ' . $premierMessageAafficher . ', ' . $nombreDeMessagesParPage);
     
    while ($donnees = mysql_fetch_array($reponse))
    {
     
            sscanf($donnees['date'], "%4s-%2s-%2s %2s:%2s:%2s", $an, $mois, $jour, $heure, $min, $sec); 
            $pseudo_af = $donnees['pseudo'];
            $message_af = nl2br(html_entity_decode($donnees['message'], ENT_QUOTES, 'UTF-8'));
            echo "<p style='border-top: 1px solid;'></p><h2 style='margin-left: 0pt;'>$pseudo_af</h2>$message_af<h5 style='text-align: right;'>le : $jour/$mois/$an à $heure:$min:$sec</h5>";
    }
    echo '<p style="border: 1px solid;"></p>'; 
    mysql_close();
    bon voila depuis 10h du matin j'ai la tête dans ce code, je ne sais pas si il est sécurisé ou pas, mais j'ai testé d'ajouter des balise et du code php avec un message et c'est affiché non pas interprété alors je pense que ça j'ai réussie ?
    Si vous pouviez m'aider (sur tout m'expliquer que je me couche moins idio ce soir)

    Merci

  2. #2
    Membre confirmé
    Homme Profil pro
    Webmaster
    Inscrit en
    Janvier 2007
    Messages
    469
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Janvier 2007
    Messages : 469
    Points : 525
    Points
    525
    Par défaut
    Question toute bête est ce que ta page est sauvegardée avec un encodage en UTF8 ?
    Tu peux être en ANSI ou autre ca peut donc merdouiller.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Points : 56
    Points
    56
    Par défaut
    nan j'ai vérifié je ne sais combien de fois tout est bien en UTF8

    EDIT : j'ai oublié de précisé ....

    L'un des test j'ai directement modifié la table dans phpmyadmin pour y ajouter des é è à et ils sont tré bien affiché ... donc le problème doit être entre l'envoi et l'enregistrement php/sql

  4. #4
    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
    htmlspecialchars et htmlentities sont a utiliser a l'affichage, pas pour l'insertion des données.
    mysql_real_escape_string doit lui au contraire etre appliqué pour toutes les chaines que tu utilises dans ta requête.

    Au passage dans mysql tu as CURDATE() pour avoir la date du jour, inutile de passer par PHP.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Points : 56
    Points
    56
    Par défaut
    Citation Envoyé par sabotage Voir le message
    htmlspecialchars et htmlentities sont a utiliser a l'affichage, pas pour l'insertion des données.
    mysql_real_escape_string doit lui au contraire etre appliqué pour toutes les chaines que tu utilises dans ta requête.

    Au passage dans mysql tu as CURDATE() pour avoir la date du jour, inutile de passer par PHP.
    merci je viens de corriger, mais pour le htmlentities j'avais fé comme ça car sinon j'ai :
    &amp;Atilde;&amp;copy;
    &amp;Atilde;&amp;uml;
    &amp;Atilde;&amp;nbsp
    avec TOUT les caractères spéciaux

    EDIT :
    et avec _decode je reviens au problème exposé.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Points : 56
    Points
    56
    Par défaut
    ra je me casse le crane même avec des str_replace.

    Edit :
    Bon je ne trouve pas ! J'ai tenté les srt_replace mais ils ne sont pas appliqué ... je cherche je cherche ....

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    &amp;Atilde;&amp;copy;
    Pour arriver à ce résultat il faut 4 étapes:
    - un 1er encodage en UTF8
    => é
    - suivi d'une interprétation erronée de l'UTF8 en ISO-8859-1
    => é
    - suivi d'une conversion des caractères accentués en entités HTML
    => &Atilde;&copy;
    - suivi d'une conversion pour échapper le code HTML lui-même (ici le caractère esperluette en l'occurence)
    => &amp;Atilde;&amp;copy;

    Ces différentes étapes sont inutiles et néfastes si ta page HTML est en UTF8 et ta connexion avec mysql aussi.
    Pour faire le minimum d'opérations il faut:
    - pour transférer des données d'un formulaire vers la base:mysql_real_escape_string() sur les variables POST avant injection dans la requête, à l'exclusion de tout autre chose (enfin si magic_quotes_gpc est à OFF car hélas il y a cette fonctionnalité qui vient complexifier).
    - pour transférer de la base vers une page HTML: htmlspecialchars() et éventuellement en 2eme étape nl2br() pour que les sauts de ligne soient visualisables par l'utilisateur final.

    Sinon méfie toi dans le code que tu as posté, il me semble bien qu'appliquer html_entity_decode() au message avant affichage fait que la page est ouverte à tout vent en terme d'injection de code HTML/javascript malicieux, ce qui est sans doute le contraire de l'effet recherché.

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 74
    Points : 56
    Points
    56
    Par défaut
    Merci estofilo, j'ai repris tout mon code a zéro et reconfiguré ma db correctement au propre et tout fonctionne

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

Discussions similaires

  1. Erreur de syntaxe dans mon code SQL
    Par Salsaboy60 dans le forum Requêtes
    Réponses: 2
    Dernier message: 18/04/2014, 21h08
  2. Erreur d'encodage avec python?
    Par nini_python dans le forum Tkinter
    Réponses: 3
    Dernier message: 26/07/2012, 00h25
  3. Erreur de liens avec une base SQL Server
    Par nbaxavf1 dans le forum Bases de données
    Réponses: 0
    Dernier message: 07/06/2011, 15h12
  4. Réponses: 3
    Dernier message: 15/08/2010, 17h33
  5. Probleme avec mon serveur sql
    Par hitman94 dans le forum Outils
    Réponses: 4
    Dernier message: 30/05/2006, 01h01

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