Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 03/03/2011, 13h38   #1
Candidat au titre de Membre du Club
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 52
Points : 14
Points : 14
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
Citation:
é = é
è = è
à = Ã
dans la source de la page :
Citation:
é
è
à
dans la table texte de mysql :
é
è
à
mon code php :
Code :
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
papaye0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h43   #2
Membre éprouvé
 
Homme Gaetan
Webmaster
Inscription : janvier 2007
Messages : 386
Détails du profil
Informations personnelles :
Nom : Homme Gaetan
Âge : 40
Localisation : France

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

Informations forums :
Inscription : janvier 2007
Messages : 386
Points : 441
Points : 441
Envoyer un message via MSN à Gaetan_
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.
Gaetan_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h49   #3
Candidat au titre de Membre du Club
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 52
Points : 14
Points : 14
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
papaye0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h49   #4
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
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.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 13h57   #5
Candidat au titre de Membre du Club
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 52
Points : 14
Points : 14
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 :
Citation:
&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é.
papaye0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/03/2011, 15h18   #6
Candidat au titre de Membre du Club
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 52
Points : 14
Points : 14
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 ....
papaye0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/03/2011, 23h06   #7
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
&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é.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/03/2011, 22h15   #8
Candidat au titre de Membre du Club
 
Inscription : juin 2009
Messages : 52
Détails du profil
Informations forums :
Inscription : juin 2009
Messages : 52
Points : 14
Points : 14
Merci estofilo, j'ai repris tout mon code a zéro et reconfiguré ma db correctement au propre et tout fonctionne
papaye0 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h29.


 
 
 
 
Partenaires

Hébergement Web