Informatique


Préparer une chaîne de caractères pour la BD

Nettoyer en début et en fin de chaîne

Lorsqu'on récupère des données à partir d'un formulaire il est souvent intéressant de nettoyer la chaîne de caractères reçues des éventuels espaces ou caractères indésirables en début ou en fin de chaîne.

ltrim(), rtrim() et trim() reçoivent deux paramètres: la chaîne à nettoyer et les caractères à supprimer.

Lorsque le deuxième paramètre est absent ces méthodes supprimes les espaces.

Syntaxe
	string trim ( string $str [, string $character_mask = " \t\n\r\0\x0B" ] )
	//idem pour ltrim et rtrim
	
Démo
<?php
	$a=".....Do John...";
	echo"Sans la méthode trim(): " .$a."<br>";
	$a=ltrim($a,".");
	echo"Avec la méthode trim(): ".$a;
?>

Casse des caractères

Ces méthodes permettent de normaliser la casse des caractères entés par l'utilisateur.

On utilisera:

  • strtoupper(), tous les caractères en majuscules
  • strtolower(), tous les caractères en minuscules
  • ucfirst(), la première lettre du premier mot en majuscule
  • lcfirst(), la première lettre du premier mot en minuscule
  • ucwords(), la première lettre de chaque mot en majuscule
Syntaxe
	string strtoupper ( string $string )
	string strtolower ( string $string )
	string ucfirst ( string $str )
	string lcfirst ( string $str )
	string ucwords ( string $str)
	
Démo
<?php
	$a="Heinz Dooffenschmirtz";
	echo($a."<br>");
	$b=strtoupper($a);
	echo "Avec la méthode strtoupper(): ".$b."<br>";
	$b=strtolower($b);
	echo "Avec la méthode strtolower(): ".$b."<br>";
	$b=ucfirst($b);
	echo "Avec la méthode ucfirst(): ".$b."<br>";
	$b=ucwords($b);
	echo "Avec la méthode ucwords(): ".$b."<br>";
	$b=lcfirst($b);
	echo "Avec la méthode ucwords(): ".$b."<br>";
?>

Ajouter le caractère d'échappement

addslashes()

Voilà une méthode indispensable, elle est utilisée avant d'enregistrer des données dans un SGBDR.

L' antislash est ajouté devant les apostrophes, les guillemets, les antislash et le caractère NULL.

Syntaxe
string addslashes ( string $str )	
Démo
<?php
	$a="L'individu Maléfique \anonyme, Heinz Doofnscmirtz, n'est pourtant pas si \"méchant\".";
	$a=addslashes($a);
	echo $a;
?>

L' antislash n'est pas ajouté devant les antislashs de \"méchant\" car dans l'exemple il repésente le caractère d'échappement.
L'antislash est ajouté directement devant les guillemets de la chaîne "méchant" !
Par contre un antislash a bien été ajouté devant \anonyme car dans ce cas il ne représente pas le caractère d'échappement mais tout simplement le carctère antislash lui-même.

quotemeta()

Cette méthode a le même effet que addslashes() sauf que les antislahs sont pacés devant les caractères ., \, +, *, ?, [, ], (, ), $ et ^ .

Syntaxe
string quotemeta ( string $str )
Démo
<?php
	$a="(5 +3)=8?";
	$a=quotemeta($a);
	echo $a;
?>

Enlever le caractère d'échappement

stipslashes() enlève les carctères d'échappement placés par addslashes() et quotemeta().

Syntaxe
string striplashes ( string $str )	
Démo
<?php
	$a="L'individu Maléfique anonyme, Heinz Doofnscmirtz, n'est pourtant pas si \"méchant\".";
	$a=addslashes($a);
	echo $a."<br>";
	$a=stripslashes($a);
	echo($a."<br>");
	$b="(5 +3)=8?";
	$b=quotemeta($b);
	echo $b."<br>";
	$b=stripslashes($b);
	echo $b;
?>

Traduire en caractères spéciaux

htmlentities() permet de remplacer les caractères spéciaux (é, ç, à, <, > etc.) par leurs équivalents html.

Cette méthode permet d'empêcher l'utilisateur d'intégrer du code html dans les formulaires, ce qui en fait un outil très précieux pour garantir l'intégrité des données.

Syntaxe
string htmlentities ( string $string [, int $flags = ENT_COMPAT | ENT_HTML401 
[, string $encoding = ini_get("default_charset") [, bool $double_encode = TRUE ]]] )
Démo
<?php
	//Pour voir le résultat il faut évidemment afficher la source
	$a="L'individu Maléfique anonyme, Heinz Doofnscmirtz, n'est pourtant pas si \"méchant\" <button>.";
	$a=htmlentities($a,ENT_QUOTES, "UTF-8");
	echo $a;
?>

Les 3 paramètres les plus utilisés de la méthode sont:

  • la chaîne à traiter
  • une constante spécifiant le traitement des guillemets
  • le jeu de caractères utilisé, le plus simple est de toujours utiliser UTF-8

Pour reconvertir en caractères ordinaires il suffit d'utiliser la méthode html_entity_decode() avec les mêmes paramètres.

Démo
<?php
	//Pour voir le résultat il faut évidemment afficher la source
	$a="L'individu Maléfique anonyme, Heinz Doofnscmirtz, n'est pourtant pas si \"méchant\" <button>.";
	$a=htmlentities($a,ENT_QUOTES, "UTF-8");
	echo $a."<br>";
	$b=html_entity_decode($a,ENT_QUOTES, "UTF-8");
	echo $b;
?>

Supprimer les balises html

strip_tags() supprime les balises HTML et PHP d'une chaîne.

Imaginons un petit rigolo qui entrerait la chaîne suivante dans un formulaire, si cette chaîne est destinée à être afficher par un echo le navigateur affichera une boîte alert() qui nous réorientera inexorablement vers la page précédente! Bref, on ne pourra jamais afficher la page souhaitée!
strip_tags() permet de supprimer les balises html et donc l'ensemble des codes JS qui pourrait nous pourrir la vie.

Cette méthode permet d'empêcher l'utilisateur d'intégrer du code html dans les formulaires, ce qui en fait un outil très précieux pour garantir l'intégrité des données.

Syntaxe
string strip_tags ( string $str [, string $allowable_tags ] )
Démo
<?php
$ch="<script>alert('Salut ma poule, on va un peu jouer ensemble!');history.back();</script>";
//Pour éviter la boîte alert()
echo(strip_tags($ch));
//L'affichage est gênant mais pas dangereux!
?>

Le paramètre optionnel allowable_tags permet de spécifier les balises qui ne doivent pas être supprimées.


Un exemple

Avant d'insérer de l'information dans la base de données il y a lieu de préparer les chaînes de caractères afin d'éviter de mauvaises surprises.

  • strip_tags pour supprimer toutes les balises éventuellment intégrées dans la balise
  • htmlentities pour remplacer tous les caractères spéciaux par leur équivalent html
  • trim pour élimer les espaces avant et après la donnée
  • addslashes pour ajouter des antislash devant les caractères interprétables
  • strtolower pour avoir une cohérence de casse dans la BD, ici on choisit tout en minuscules

$valeur=strtolower(addslashes(trim(htmlentities(strip_tags($_POST['valeur'])))));