Pb avec les caractères spéciaux

Panama
Invité n'ayant pas de compte PHPfrance

06 mars 2010, 10:13

Bonjour à tous,

Voici mon problème:

Lors de la création d’un nouveau membre avec une page nommée « ajout.php »
avec par exemple comme Pseudo et Mot de passe :

- Pseudo => frédérique
- Mot de passe => 12à+

à ce stade, quand je regarde ma bdd MySQL tout les champs sont correcte (les accents sont présent dans tout les champs de la bdd), aucun problèmes…

Lorsque que je valide les infos de ce membre dans une page nommée « modifsuppr.php » ou bien que le membre lui même modifie ces infos dans une autre page nommée « modif_infos_util.php » alors ma bdd ne gère plus les accents et je me retrouve avec comme Pseudo et Mot de passe :

- Pseudo => frédérique
- Mot de passe = > 12à+

Seuls certains champs présent dans ma bdd comme : Pays, Nom, Prénom, Adresse & Date de naissance garde correctement les caractères spéciaux et les accents.

Je cherche donc à savoir pourquoi ma bdd gère correctement certains champs avec des caractères spéciaux et d’autres pas…

Encore une petite précision, les caractères spéciaux et les accents sont corectement afficher et pris en compte dans toutes mes pages php.

Merci pour vos réponses !

ViPHP
ViPHP | 2287 Messages

06 mars 2010, 10:18

Bonjour,

N'en veux pas trop à ta base de données, ce n'est pas de sa faute. Tu sembles utiliser la fonction htmlentities() (ou équivalent) sur ton site. C'est très bien si tu l'utilises à l'affichage de tes données, c'est moins bien si tu l'utilises à l'enregistrement dans la bdd, et ça devient carrément problématique si tu l'utilises pour les deux - ce que tu sembles faire actuellement, et ce qui cause ton souci.

Tu sais donc ce qu'il te reste à faire pour corriger ;) (il faudra sans doute corriger les entrées "corrompues" en BDD à la main).

++
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Panama
Invité n'ayant pas de compte PHPfrance

06 mars 2010, 10:29

Bonjour Calimero et merci pour cette réponse et si je peux me permettre, j’ai fait un petit récap de mon problème (resté malheureusement sans réponses…) avec le code de mes pages.
C’est ici => http://www.commentcamarche.net/forum/af ... s-speciaux

ViPHP
ViPHP | 2287 Messages

06 mars 2010, 10:49

Ma religion de barbu primaire m'interdit de regarder du code source sans colorisation syntaxique ET posté sur un autre forum (en plus ça pique les yeux). :D

il serait donc bon que tu fasses l'effort de poster ton code ici s'il te plaît (correctement encadré pour que le coloriseur puisse faire son boulot).

Et en fait, c'est surtout à toi de regarder exactement à quel endroit dans tes fichiers (sachant que tu n'as peut-être pas regardé au bon endroit jusqu'à maintenant, donc cherche large) tu utilises la fonction htmlentities() en tenant compte de ces principes :

- A l'affichage, c'est très bien (on adapte la donnée pour qu'elle suive les contraintes de formatage du HTML).
- A l'enregistrement, c'est mal (on stocke la donnée en base le plus fidèlement possible par rapport à ce que l'utilisateur a saisi, on évite de la transformer à ce stade).

En plus de ça, si tes données en base ont déjà des entités html à l'intérieur il faudra les corriger (soit en faisant un script à usage unique, rien que pour ça, soit en les éditant à la main dans phpmyadmin par exemple).

Si tu t'en sors toujours pas malgré tout ça, tu peux aussi regarder ce tuto pour envisager un passage en UTF-8 (ce qui ne va pas te régler ton problème, mais te permettra de moins galérer avec la gestion des caractères spéciaux : en effet, en UTF-8, tu n'auras plus besoin de htmlentities() ).
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Panama
Invité n'ayant pas de compte PHPfrance

06 mars 2010, 11:28

Merci pour le tuto, je vais regarder ça et voici le script ou ce trouve sans doute le problème...
Merci encore pour ton aide c'est sympa.


<?php
Error_Reporting(1);
@set_magic_quotes_runtime(0);
require_once("passe/conf.php");

// sessions
if($active_session=="1")
	{		
	session_start(); 
	$id=addslashes($_SESSION["id"]);
	}
	else
	{
	$id=addslashes($_GET["id"]);
	}
// fin sessions


$db_link=connect_db();
$droits=verif_login($id);
verif_admin();

// On verifie si on va rendre inactif le super admin
$requete_verif=mysql_db_query("$sql_bdd","select min(id_membre) as mini from membre where droits=1 AND actif=1",$db_link);
$row=mysql_fetch_assoc($requete_verif);
$id_membre_mini=$row["mini"];

if($_GET[cle]  == $id_membre_mini){
echo "<br><br><br><center><font size=5>Impossible de Modifier l'Administrateur principal !!! </font></center>";exit;
}

// Test sur la cohérence des droits d'administration et la page de redirection
if($_POST["droits"]==1 && $_POST["ceciestladestination"]!="protec/admin.php")
{
echo "<center>Si vous définissez ce membre comme étant un administrateur, l'url de destination doit être 'ADMINISTRATION' !!</center>";exit; 
}
if($_POST["droits"]==0 && $_POST["ceciestladestination"]=="protec/admin.php")
{
echo "<center>Si vous définissez ce membre comme n'étant PAS un administrateur, l'url de destination ne doit PAS être 'ADMINISTRATION' !!</center>";exit; 
}




$pseudo=addslashes($_POST["ceciestlepseudo"]);

// ON VERIFIE SI CE PSEUDO EXISTE DEJA
$requete=mysql_db_query($sql_bdd,"select * from membre where pseudo='".$pseudo."' AND id_membre <> '".addslashes($_GET[cle])."'",$db_link);
$num=mysql_num_rows($requete);
if($num!=0)
        {
        echo "<center>Ce pseudo existe déjà, Il faut en choisir un autre</center>";
        }


if($_POST['ceciestlepseudo']==""){echo "<br><br><br><font face=\"Verdana, Arial\" size=\"3\"><center>Vous devez choisir un pseudo<br><br><a href=\"javascript:history.back(1)\">Retour</a></center></font>";exit;}
if($_POST['ceciestlepasse']==""){echo "<br><br><br><font face=\"Verdana, Arial\" size=\"3\"><center>Vous devez choisir un mot de passe<br><br><a href=\"javascript:history.back(1)\">Retour</a></center></font>";exit;}
if($_POST['ceciestladestination']==""){echo "<br><br><br><font face=\"Verdana, Arial\" size=\"3\"><center>Vous devez entrer une page de destination<br><br><a href=\"javascript:history.back(1)\">Retour</a></center></font>";exit;}
if($_POST['ceciestlemail']==""){echo "<br><br><br><font face=\"Verdana, Arial\" size=\"3\"><center>Vous devez préciser votre E-mail<br><br><a href=\"javascript:history.back(1)\">Retour</a></center></font>";exit;}
if($_POST['ceciestlepasse']!=$_POST['ceciestlepasse2']){ echo "<br><br><br><font face=\"Verdana, Arial\" size=\"3\"><center>Vous avez mal confirmé le mot de passe<br><br><a href=\"javascript:history.back(1)\">Retour</a></center></font>";exit; }


// Test sur les champs optionnels
// Le nom
if($aff_nom==1)
	{
	$nom=addslashes($_POST[nom]);
	if($aff_nom_obl==1)
		{
		if($nom==""){ echo "<center><br><br>Vous devez entrer votre nom !!<br><br></center>";include 'footer.php';exit; }
		}
	$suite_requete_a=" ,nom='$nom'";
	}
	
// Le prénom
if($aff_prenom==1)
	{
	$prenom=addslashes($_POST[prenom]);
	if($aff_prenom_obl==1)
		{
		if($prenom==""){ echo "<center><br><br>Vous devez entrer votre prenom !!<br><br></center>";include 'footer.php';exit; }
		}
	$suite_requete_a.=" ,prenom='$prenom'";
	}

// L'adresse
if($aff_adresse==1)
	{
	$adresse=addslashes($_POST[adresse]);
	if($aff_adresse_obl==1)
		{
		if($adresse==""){ echo "<center><br><br>Vous devez entrer votre adresse !!<br><br></center>";include 'footer.php';exit; }
		}
	$suite_requete_a.=" ,adresse='$adresse'";
	}

// La date de naissance
if($aff_date_naissance==1)
	{
	$date_naissance=addslashes($_POST[date_naissance]);
	if($aff_date_naissance_obl==1)
		{
		if($date_naissance==""){ echo "<center><br><br>Vous devez entrer votre date de naissance !!<br><br></center>";include 'footer.php';exit; }
		}
	$suite_requete_a.=" ,date_naissance='$date_naissance'";
	}
	
// Le pays
if($aff_pays==1)
	{
	$pays=addslashes($_POST[pays]);
	if($aff_pays_obl==1)
		{
		if($pays==""){ echo "<center><br><br>Vous devez entrer votre Pays !!<br><br></center>";include 'footer.php';exit; }
		}
	$suite_requete_a.=" ,pays='$pays'";
	}
	
	
function EmailOK($ceciestlemail)
{

  return( ereg('^[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+'.
               '@'.
               '[-!#$%&\'*+\\/0-9=?A-Z^_`a-z{|}~]+\.'.
               '[-!#$%&\'*+\\./0-9=?A-Z^_`a-z{|}~]+$',
               $ceciestlemail) );
}
if(!EmailOK($_POST['ceciestlemail']))
{
echo "<b><font size=\"3\" face=\"Verdana, Arial\" color=\"#cc0000\">ATTENTION : L'email n'est pas correct ! </font><br><br><center><a href='javascript:history.back(1)'><br><font face=\"Verdana, Arial\" size=\"2\" color=\"#000000\">Retour</font></center></a>";exit;
}

else {
if($_POST[mailingliste]==1){ $inscription=1; } else{ $inscription=0; }

$rek="UPDATE membre SET mailingliste='$inscription', pseudo='".htmlentities(addslashes($_POST[ceciestlepseudo]))."', passe='".htmlentities(addslashes($_POST[ceciestlepasse]))."', url='".htmlentities(addslashes($_POST[ceciestlurl]))."', destination='".htmlentities(addslashes($_POST[ceciestladestination]))."',  remarques='".htmlentities(addslashes($_POST[ceciestlesremarques]))."', email='".htmlentities(addslashes($_POST[ceciestlemail]))."', droits='".$_POST[droits]."', actif=".$_POST[actif]." $suite_requete_a WHERE id_membre='".addslashes($_GET[cle])."'";
mysql_db_query($sql_bdd,$rek,$db_link) or die(mysql_error());
$requete=mysql_db_query($sql_bdd,"select * from membre where id_membre=\"".addslashes($_GET[cle])."\"",$db_link);
$row=mysql_fetch_assoc($requete);
		$pseudo=$row["pseudo"];
        $id_membre=$row["id_membre"];
        $passe=$row["passe"];
        $url=$row["url"];
        $destination=$row["destination"];
        $pays=$row["pays"];
        $remarques=$row["remarques"];
        $email=$row["email"];
		$droits=$row["droits"];
		$nom=$row["nom"];
		$prenom=$row["prenom"];
		$adresse=$row["adresse"];
		$date_naissance=$row["date_naissance"];
		$mailingliste=$row["mailingliste"];
		
// envoi de mail si demandé
if($_POST["envoi_mail"]=="1")
{
$message="Un email a été envoyé sur la boîte ".$email." pour informer le membre.";
mail($email, "Votre compte a été modifié sur $nom_site", "Bonjour $pseudo, \n\nL'administrateur de $nom_site a modifié votre compte $role.\n\nVous pouvez donc vous connecter désormais sur  $chemin_formulaire/login.htm avec vos logins : \n\nPseudo : $pseudo \nPasse : $passe \n\n Vos informations : \n\nAdresse de votre site : $url \nVotre pays : $pays \nVotre E-mail : $email \n\n.\nCordialement, l'équipe de $nom_site \n\n", "FROM: $votre_email");

}


include 'entete.php';
echo "<p align=\"center\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"4\" color=\"#cc0000\">Le ";
echo "  membre ".$pseudo." a bien été enregistré !</font></b><br>";
echo "</p>";
echo "<p align=\"center\"><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><b>Voici ";
echo "  les infos du membre </b></font></p>";
echo "<font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><center> ".$message."</center><br><br>";
echo "</font>";
echo "<table border=\"0\" cellspacing=\"1\" cellpadding=\"6\" align=\"center\" bgcolor=\"#666666\" width=\"70%\">";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\" width=\"50%\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">ID ";
echo "      du membre </font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$id_membre."</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Pseudo</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$pseudo."</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FF0000\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">ADMINISTRATEUR ?</font></td>";
echo "    <td bgcolor=\"#ff0000\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#ffffff\">";
if($_POST['droits']==1){ echo "Oui"; };
if($_POST['droits']==0){ echo "Non"; }
echo "</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Passe</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$passe."</font></b></td>";
echo "  </tr>";
?>

<?php if($aff_nom==1){ ?>
  <tr> 
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Nom</font></td>
    <td bgcolor="#CCCCCC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#990000"><?php echo $nom ?></font></b></td>
  </tr>
  <?php } ?>
  <?php if($aff_prenom==1){ ?>
  <tr> 
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Prénom</font></td>
    <td bgcolor="#CCCCCC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#990000"><?php echo $prenom ?></font></b></td>
  </tr>
  <?php } ?>
  <?php if($aff_adresse==1){ ?>
  <tr> 
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Adresse</font></td>
    <td bgcolor="#CCCCCC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#990000"><?php echo $adresse ?></font></b></td>
  </tr>
  <?php } ?>
  <?php if($aff_pays==1){ ?>
  <tr> 
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Pays</font></td>
    <td bgcolor="#CCCCCC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#990000"><?php echo $pays ?></font></b></td>
  </tr>
  <?php } ?>
  <?php if($aff_date_naissance==1){ ?>
  <tr> 
    <td bgcolor="#FFFFFF"><font face="Verdana, Arial, Helvetica, sans-serif" size="2">Date 
      de naissance</font></td>
    <td bgcolor="#CCCCCC"><b><font face="Verdana, Arial, Helvetica, sans-serif" size="2" color="#990000"><?php echo $date_naissance ?></font></b></td>
  </tr>
  <?php } ?>

<?php
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Adresse ";
echo "      de son site Web</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$url."</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Page ";
echo "      de destination apr&egrave;s Login</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">";
		if($destination=="protec/admin.php"){ echo "ADMINISTRATION"; }else{ echo $destination; }
echo "  </font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Remarques</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$remarques."</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">E-mail</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">".$email."</font></b></td>";
echo "  </tr>";
echo "  <tr> ";
echo "    <td bgcolor=\"#FFFFFF\"><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\">Mailingliste</font></td>";
echo "    <td bgcolor=\"#CCCCCC\"><b><font face=\"Verdana, Arial, Helvetica, sans-serif\" size=\"2\" color=\"#990000\">";
if($mailingliste==1){ echo "Oui";} else{ echo "Non"; }
echo "</font></b></td>";
echo "  </tr>";
echo "</table>";
echo "<div align=\"center\"><font size=\"2\" face=\"Verdana, Arial, Helvetica, sans-serif\"><br>";
echo "  <a href=\"liste_membres.php?action=id_membre";if($active_session!="1"){ echo "&id=".$id; }
echo "\">Liste des membres</a> | ";
echo "  <a href=\"modifsuppr.php?cle=".addslashes($_GET[cle]);if($active_session!="1"){ echo "&id=".$id; }
echo "\">Modifier ou supprimer ce membre</a> ";
echo "  | <a href=\"admin.php";if($active_session!="1"){ echo "?id=".$id; }
echo "\">ADMIN</a> | <a href=\"delogue.php\"";
if($active_session!="1"){ echo "?id=".$id; }
echo "\">Se ";
echo "  d&eacute;loguer</a></font><font face=\"Verdana, Arial\" size=\"2\"> </font> </div>";
include ("footer.php");
close();
}
?>

ViPHP
ViPHP | 2287 Messages

06 mars 2010, 12:42

Effectivement, tu as du htmlentities() dans les valeurs de la requête UPDATE (écriture en base donc), c'est ce que je te signalais comme étant à éviter...

En les enlevant, tu vas empêcher tes futures données en base de se faire corrompre par ce formulaire, mais ça ne corrigera pas le problème pour les données déjà htmlentities-isées. C'est seulement quand tu auras fait les deux (à savoir, corrigé le formulaire ET les données) que tu pourras voir ton problème vraiment résolu. :)

Bon courage, tiens-nous au courant.
if(!@work()){ Nespresso(); } else { what(); }
______________________________

Panama
Invité n'ayant pas de compte PHPfrance

06 mars 2010, 17:09

J’ai supprimé les htmlentities de la requête comme tu le disais et maintenant ça marche nickel ! :D

=D> Merci beaucoup Calimero, j’avais "la vie pourrie" depuis plusieurs mois avec ce problème dans mon site, grâce à toi mes prochaines nuits seront sereine.

Encore merci, je vais me pencher sérieusement sur la fonction htmlentities ()…

Bon week-end à tous !

ViPHP
ViPHP | 2287 Messages

06 mars 2010, 17:15

:D Content pour toi !

@+
if(!@work()){ Nespresso(); } else { what(); }
______________________________