Problémes liés aux guillemets, cotes et formatages de caractères

Petit nouveau ! | 1 Messages

14 déc. 2007, 18:25

Bonjour tout le monde,

Je me suis mis à m'investir à 100% dans la réalisation de classes perso afin d'avoir ma bibliothèque de fonctions bétonnées pretes à être utilisées sur des projets pros sans la moindre hésitation.

Dans un souci de perfectionnisme, je me suis heurté il y a qqes jours aux fonctions permettants de gérer le problème des cotes et/ou des guillemets pour tout ce qui est requetes sql, gestion des cotes avec les paramètres magic_quotes à off (je préfère gérer moi-même l'ajout de \ pour mes cotes) et gestion des différentes normes de caractère (unicode, iso-8858-1, iso-885915).

Bon ca fait beaucoup de choses pour un post, je sais, mais je me suis tellement rendu fou sur ca, que je prefere passer sur autre chose pour le moment (je me suis acheté PHP5 Avancé et Sécurité PHP chez Eyrolles et je voudrais maitriser en détails les techniques pro pour bien coder), et demander si qqu peut me donner une piste pour commencer à comprendre profondemment ces points sur lesquelles je butte.

Un peu de pratique pour mieux me faire comprendre :

Ma fonction pour contourner les magic_quote quelques soit la valeur de magic_quote_gpc:
function test_magic_quote($txt)
{
	if( 1 === get_magic_quotes_gpc() )
    		$txt=stripslashes($txt);
	return($txt);
}
Ma fonction pour formater un string pour une insertion Mysql:
function format_mysql($txt) // Pour enregistrer n'importe quelles chaine de caractere dans une base MySQL
{
	$txt=substr(trim(mysql_real_escape_string(htmlspecialchars(test_magic_quote($txt),ENT_QUOTES)),0,50); // 50 est un nombre arbitraire, à selectionner selon la taille de la variable en question
	return($txt);
}
Voici la fonction que j'utilisais jusqu'à présent, et que je voudrais perfectionner:
$login=trim(htmlentities(substr($login,0,50), ENT_QUOTES));
Ce que j'attends de cette fonction :
-> Un formatage d'un string quel qu'il soit, avec magic_quote_gpc activé OU non activé !!!
-> Pouvoir controller la taille de la chaine avant de la soumettre à MySQL (peut etre que wordwrap serait plus pertinent que substr)
-> Pouvoir inclure n'importe quel caractère particulier (accents, mais aussi caractère chinois, arabes etc...) avec l'UTF-8
-> Peut etre faut il aussi rédiger une fonction qui gere l'affichage HTML des strings extraits de la base MySQL, ainsi que ceux simplement manipulés avec des variables et des GET, POST... (par ex, pour résumer des coordonnées qui viennent d'être rédigées dans un formulaire).

A l'affichage, les caractère chinois, arabes etc... devront pouvoir être pris en compte. J'imagine que l'UTF-8 sera utilisé, mais je bloque un peu sur la manière de faire. Est-ce utopiste comme fonction ? (genre le fait de chercher une fonction parfaite qui pourra régler TOUS les pbs d'insertion et d'affichage de caractères spéciaux).

Je sais que je suis un peu confus dans mes explications, je serais ravi de répondre à d'éventuelles demande de précision sur tel ou tel point de ma demande.

Merci à tous

Eléphant du PHP | 59 Messages

17 déc. 2007, 19:49

J'ai deux questions:

ce serait pas mieux ça:
function test_magic_quote($txt)
{
    if(get_magic_quotes_gpc())
            return stripslashes($txt);
}
sinon pour venir à bout des magic_quotes (je les déteste moi aussi) ce serait pas plus simple d'exécuter une fonction comme ça au début de chaqu'une de tes pages:
function magic_quotes_gpc_remove(){//Fonction qui supprime magic_quotes_gpc
	if (get_magic_quotes_gpc()) {
		foreach($_POST as $key => $value){

			if(is_array($_POST[$key])){
				foreach($_POST[$key] as $k2 => $v2){
					$_POST[$key][$k2]=stripslashes($v2);
				}
			}else{
				$_POST[$key] = stripslashes($value);
			}
		}
		foreach($_GET as $key => $value){
			$_GET[$key] = stripslashes($value);
		}
		foreach($_COOKIE as $key => $value){
			$_COOKIE[$key] = stripslashes($value);
		}
	}
}
De cette façon quand tu codes par la suite tu considères toujours magic_quotes comme étant à off et si jamais t'es sur un serveur dont tu es sur que magic_quotes est à off tu retires simplement cette fonction histoire de pas executer du code pour rien