8792 sujets

Développement web côté serveur, CMS

bonjour,
j'viens de passer la journée à lire une quantité de posts sur plusieurs forums, qui traitent des jeux de caractères (utf-8...), des formulaires html qui alimentent des bases de données, des tris que l'on peut faire sur des requètes SQL qui sont faussées à cause des accents, etc...
et j'avoue que je suis de nouveau complètement perdu!

je m'occupe de plusieurs sites, et malheureusement les configs chez les hébergeurs ou en local sont tous différents, notamment sur la version de mysql et ses jeux de caractères, magic_quotes_gpc...

bref, ça fait 2 fois que je change de méthode pour récupérer les données de formulaires et les stocker dans une BD, puis les afficher en html, et j'ai à nouveau un problème.

mon cas est simple et ultra classique:
* j'ai un formulaire qui me permet de créer ou modifier des données (balises <input> <textarea>...)
* ces données sont stockées dans une base MySql
* j'affiche ensuite ses données dans une page html

là où je me prends la tête et où je n'arrive pas à choper la bonne info sur les forums, c'est: quel traitement dois-je faire en PHP:
* pour passer des variables $_POST à MySql ?
* pour passer des requètes SQL à l'affichage simple Html?
* pour passer des requètes SQL aux champs par défaut du formulaire quand je veux modifier une ligne?

avant, je faisais avant inclusion dans la base:
$donnee = nl2br(AddSlashes(htmlspecialchars($_POST['donnee'])));

pour afficher simplement une donnée Sql en html, je faisais:
$donnee = stripslashes($donnee)

et quand je voulais modifier une ligne, je mettais dans la balise input ou textarea du formulaire, la valeur par défaut:
$donnee = stripslashes(strip_tags($donnee));


puis, j'ai eu un problème lors de dump des bases SQL où j'ai perdu tous les caractères spéciaux français, et j'ai donc modifié mon code en mettant avant insertion dans la base:
$donnee = nl2br(htmlentities($_POST['donnee'], ENT_QUOTES));

comme çà, je n'avais plus de traitement à faire pour afficher en html après ou pour modifier le champ par le formulaire input (sauf pour le textarea où je créais la fonction inverse à nl2br()...)

malheureusement, avec cette méthode, les tries de la base sont moyens, et le nombre de caractères VARCHAR autorisé dans la table SQL sont faussés puisqu'un simple "é" par exemple prend 8 caractères au lieu d'1, et ça me gène...

je souhaite donc savoir comment vous vous faites pour faire çà ???
si tout bien passer en UTF-8, suffit-il juste de mettre "addslashes" avant la base puis "stripslashes" en sortie, et je ne me soucis plus des "éàùç<>'"" ?

désolé pour ce mail à rallonge...
si vous avez des liens vers un résumé des choses à faire, que j'aurais pas trouvé, chuis preneur
Les conversions sont automatique pour la simple raison que :
Les fonctions PHP connaissent le charset utilisé en interne, et la bdd connais tous les charsets utilisé sur chaque table.
Lorsque tu utilises une fonction PHP pour lire ta table, tes données seront obigatoirement dans le charset de PHP (voir la fonction setlocal).
Lorsque tu utilises une fonction pour faire une requète, elle seront convertis au moment de l'insertion pour correspondre à la bdd.

Pour les caractères spéciaux, je te conseil d'utiliser "mysql_real_escape_string"
boudiou... plus je cherche à approfondir, plus je m'enfonce...

j'étais passé à htmlentities et j'avais modifié toutes mes bases, car le gros soucis que j'avais, c'est que la version distante de mysql sur un des hébergeurs était 4.0,(donc ne gérait pas apparemment l'interclassement-jeux de caractères chaispasquoi...).
du coup, quand je voulais faire une sauvegarde de la base distante et la transférer par un dump sur mon serveur local mysql 4.1, tous les caractères spéciaux disparaissaient.

j'me suis donc poser la question pour tout passer en utf_8, mais c'est en premier la base distante que je dois modifer.
j'vais essayer de trouver le moyen de passer les données de ma base mysql 4.0 en utf_8...
http://www.siteduzero.com/tuto-3-6276-1-mysql-comprendre-les-jeux-de-caracteres-et-interclassements.html[/url]

et après j'aurais plus d'autres soucis?
avant chaque insertion dans un champ sql, je dois quand même faire un truc du gener

function chaine($chaine)
{
	if ( !get_magic_quotes_gpc() )
		$chaine = addslashes($chaine);
		
	return "'" . mysql_real_escape_string($chaine) . "'";
}

?
j'avais pas bien compris la fonction chaine() précédente avant de la recopier, mais elle est conne...
en gros, avant insertion dans la bdd, on devrait faire le traitement suivant:

function mysql_format($chaine)
{
	if (get_magic_quotes_gpc())
		stripslashes($chaine);
	
	$chaine = htmlspecialchars($chaine, ENT_NOQUOTES);
	$chaine = "'".mysql_real_escape_string($chaine)."'";
	
	return $chaine;
}

j'hésite pour la ligne htmlspecialchars($chaine, ENT_NOQUOTES), car parfois j'ai besoin d'utiliser des balises Html à l'affichage et parfois non...
et j'ai pas envie d'utiliser des trucs comme le bbcode etc...

m'enfin, avec les changements de version php et mysql, avec la lecture des différents posts comme celui-ci ou celui-la
ou là encore
j'arrive à comprendre qu'on peut régler les problèmes des accents, des slashes et des Quotes, mais il reste donc les balises <html>. (je reste en ISO-8859-15 pour l'instant, mes sites sont uniquement pour des français en france)

vous avez une opinion? un mode de faire classique?