Problème d'encodage de caractères incompréhensible...

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : Problème d'encodage de caractères incompréhensible...

par Invité » 28 août 2008, 01:27

Ok.
Merci AB.
Je prends note et fais les modifications nécessaires dans mes fonctions.

par AB » 26 août 2008, 18:00

Bon je n'avais regardé que ta première fonction mais ta deuxième "displayData" c'est pas ça non plus.

Pour afficher le contenu de la lecture d'un champ mySql tu peux faire simplement
//Exécution de la requête
$req_exec = mysql_query($requete) or die(mysql_error());
    
//Création  et lecture du tableau associatif du résultat
 while ($resultat = mysql_fetch_assoc($req_exec)) {
echo htmlentities($resultat['champ']);}
Bien sûr htmlentities serait superflu pour des champ mySql formatés en INT ou DOUBLE par exemple mais en même temps ça ne gêne généralement pas de le mettre tout le temps.

par AB » 26 août 2008, 17:41

Si ta fonction cleanData est censée protéger des requêtes sql, ce n'est pas la bonne méthode.

Pour une variable simple (pas un tableau) on peut faire typiquement :
function PrepareSql ($chaine) 
{
    $chaine = (get_magic_quotes_gpc())? mysql_real_escape_string(stripslashes($chaine)) : mysql_real_escape_string($chaine);
    return $chaine;
}
//...
//connexion bdd

$nom = PrepareSql($_POST['pseudo']);

$requete = "SELECT count(*) as nb FROM membres WHERE pseudo = '".$nom."'"; 
En tous cas comme indiqué dans la doc mysql_real_escape_string(), cette fonction doit être utilisée, à de rares exeptions, pour protéger les requêtes.


EDIT : Un lien pour l'UTF8

par Eagle » 26 août 2008, 14:54

Bonjour à vous.

Pour _activmik
Voici la structure de ma table news :

Code : Tout sélectionner

-- phpMyAdmin SQL Dump -- version 2.11.3 -- http://www.phpmyadmin.net -- -- Serveur: XXXXX.sql.free.fr -- Généré le : Mar 26 Août 2008 à 14:46 -- Version du serveur: 5.0.67 -- Version de PHP: 5.2.5 SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO"; -- -- Base de données: `XXXXX` -- -- -------------------------------------------------------- -- -- Structure de la table `site_news` -- CREATE TABLE IF NOT EXISTS `site_news` ( `news_id` int(11) NOT NULL auto_increment, `news_auteur` varchar(255) character set latin1 collate latin1_general_ci NOT NULL, `news_date` datetime NOT NULL, `news_auteur_modification` varchar(255) character set latin1 collate latin1_general_ci default NULL, `news_date_modification` datetime default NULL, `news_titre` varchar(255) character set latin1 collate latin1_general_ci NOT NULL, `news_contenu` blob NOT NULL, `news_destinataire` int(1) NOT NULL default '1', `news_is_supprimee` tinyint(1) NOT NULL default '0', PRIMARY KEY (`news_id`), KEY `news_is_supprimee` (`news_is_supprimee`), KEY `news_auteur` (`news_auteur`), KEY `news_auteur_modification` (`news_auteur_modification`), KEY `news_date` (`news_date`), KEY `news_date_modification` (`news_date_modification`) ) ENGINE=MyISAM DEFAULT CHARSET=latin1 COMMENT='Table des news et messages' AUTO_INCREMENT=13 ;
Pour @rthur, je vais regarder pour htmlentities..., mais ce qui me surprend le plus, ce que jusqu'à présent, je faisais toujours comme actuellement et ça fonctionnait... (traitement de base : trim() + addslash())... et là... pffff !? :?

A ce propos, je sais que ce n'est plus vraiment du SQL "pur", mais quel "traitement" me conseillez vous de faire avant l'insertion dans la BDD et inversement pour l'affichage... ?
Voici au cas où mes fonctions actuelles :
Pour l'insertion :
function cleanData($Variable){
 	//On vérifie l'activation ou non des magic_quote
 	if(test_magic_quotes() == FALSE){
 		//Magic_quote désactivées donc on traite les données
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des espaces
	 			$Variable[$i] = trim($Contenu);
	 			
		    	//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
		    	$Variable[$i] = addslashes($Contenu); 			
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des espaces
 			$Variable = trim($Variable); 			
 			
			//Echappement des caractères spéciaux MySQL (',",\n,\r,NULL...)
			//$Variable = mysql_real_escape_string($Variable);
			$Variable = addslashes($Variable);
 		}
 	}
 	else{
 		//Magic_quote activées, donc on ne rajoute pas de caractères d'échappement
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des espaces
	 			$Variable[$i] = trim($Contenu); 			
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des espaces
 			$Variable = trim($Variable);
 		}	
 	}
 	
 	//On retourne la variable
 	return $Variable;
}
Pour l'affichage après un select :
function displayData($Variable){
 	//On vérifie l'activation ou non des magic_quote
 	if(test_magic_quotes() == FALSE){
 		//Magic_quote désactivées donc on traite les données
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Conversion des caractères spéciaux HTML
	 			$Variable[$i] = htmlentities($Contenu); 			
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
	 			//Conversion des caractères spéciaux HTML
	 			$Variable = htmlentities($Contenu);
 		}
 	}
 	else{
 		//Magic_quote activées, donc on supprime les caractères d'échappement "\"
 		
 		//ATTENTION cette fonction n'est pas récursive !!!!
 		//On doit donc rentrer dans le tableau
 		if (is_array($Variable)) {
 			//On parcours le contenu du tableau
 			foreach ($Variable as $i => $Contenu) {
	 			//Suppression des backslashes
	 			$Variable[$i] = stripslashes($Contenu); 			
 			}
 		}
 		//Sinon ce n'est pas un tableau (champ simple) donc on traite simplement
 		else{
 			//Suppression des backslashes
 			$Variable = stripslashes($Variable);
 		}		
 	}
 	
 	//On retourne la variable
 	return $Variable;
}
Merci encore pour votre aide car je reste bloqué sur ces **** de caractères spéciaux ! :evil:
Cordialement,

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

EDIT
Bon, je n'ai toujours pas compris le pourquoi du comment...
Toutefois, bien que réticent à basculer en UTF-8... j'ai mis moins de temps à le faire que de gratter dans tous les sens...
Donc je suis toujours preneur d'une explication (je serai moins bête... ;)), mais j'ai contourné le problème :).

Merci à tous quand même

par @rthur » 26 août 2008, 10:06

Bonjour,

Solution de contournement: http://fr.php.net/htmlentities

par _activmik » 26 août 2008, 09:18

Quel est le type de donnée de ta colonne "news_titre" ?

Problème d'encodage de caractères incompréhensible...

par Eagle » 26 août 2008, 00:28

Bonjour à tous.

Bon je vous explique mon nouveau souci.
Je refais un site avec la BDD qui va bien derrière (enfin presque ;) :)).
Hébergeur : FREE
SGBD : MySQL 5.0.51a.
Langage de dév : PHP

Mes pages sont codées en ISO-8859-1.
Mes tables (charset et interclassement) sont en latin 1 (latin1_general_ci).
Par contre Free code les BDD en UTF-8 et on ne peut pas agir dessus.

Voici mon problème. (je prends l'exemple d'un formulaire simple : 1 input et 1 textarea)
Dans plusieurs formulaires, je vais être amené à saisir des caractères "spéciaux" du type "€", "°" entre autre.
Si je saisis dans le input "Test N°1 - 5€" par exemple, j'ai le message d'erreur suivant à l'insertion :

Code : Tout sélectionner

Identification de l'erreur : Incorrect string value: '\xB0' for column 'news_titre' at row 1
Donc je comprends bien que la BDD n'en veut pas (entre autre parce que le symbole euro n'est pas défini dans iso-8859-1...).
Avez-vous une solution ?

Mais là où je ne comprends plus rien..., c'est que si je saisis la même chose dans le textarea... ça fonctionne !!!!

(pourtant l'encodage des champs est strictement le même...)

Avez-vous une idée pour me dépanner ?
Merci d'avance de votre aide.
Cordialement.