10 fonctions PHP-MySQL que j’utilise tous les jours

J’ai des scrupules vis-à-vis du logiciel libre. J’en consomme des paquets, j’exploite et j’apprends grâce aux dons de cette communauté, mais je n’ai jamais réellement rendu la pareille. J’aimerais vraiment faire partager tous les projets sur lesquels je travaille, les ouvrir à tout le monde. Hélàs ça demande beaucoup de temps de rendre ses outils universels et compréhensibles.
J’ai du pain sur la planche. En guise d’apéritif, voici ma petite contribution aux développeurs PHP, une série de fonctions que j’ai développé pour résoudre pas mal de problèmes qui se posent au quotidien. J’espère qu’elles seront utiles à d’autres que moi.

1. Trouver le nom d’un département à partir de son numéro

Rien de plus simple que de trouver le nom du département à partir de son numéro ou du code postal. Il suffit d’avoir la table de correspondance qu’on garde en global ou qu’on inclut dans une fonction (comme dans cet exemple) :

// La fonction prend les deux premiers numéros passés en argument
// Code proposé par Le Caphar http://www.lepotlatch.org
function departement($codepostal)
{
    $nom_departement = array ( 
		"01" => "Ain", 
		"02" => "Aisne", 
		"03" => "Allier", 
		"04" => "Alpes-de-Haute Provence", 
		"05" => "Hautes-Alpes", 
		"06" => "Alpes Maritimes", 
		"07" => "Ardèche", 
		"08" => "Ardennes", 
		"09" => "Ariège", 
		"10" => "Aube", 
		"11" => "Aude", 
		"12" => "Aveyron", 
		"13" => "Bouches-du-Rhône", 
		"14" => "Calvados", 
		"15" => "Cantal", 
		"16" => "Charente", 
		"17" => "Charente-Maritime", 
		"18" => "Cher", 
		"19" => "Corrèze", 
		"20" => "Corse", 
		"21" => "Côte d'Or", 
		"22" => "Côtes d'Armor", 
		"23" => "Creuse", 
		"24" => "Dordogne", 
		"25" => "Doubs", 
		"26" => "Drôme", 
		"27" => "Eure", 
		"28" => "Eure-et-Loire", 
		"29" => "Finistère", 
		"30" => "Gard", 
		"31" => "Haute-Garonne", 
		"32" => "Gers", 
		"33" => "Gironde", 
		"34" => "Hérault", 
		"35" => "Ille-et-Vilaine", 
		"36" => "Indre", 
		"37" => "Indre-et-Loire", 
		"38" => "Isère", 
		"39" => "Jura", 
		"40" => "Landes", 
		"41" => "Loir-et-Cher", 
		"42" => "Loire", 
		"43" => "Haute-Loire", 
		"44" => "Loire-Atlantique", 
		"45" => "Loiret", 
		"46" => "Lot", 
		"47" => "Lot-et-Garonne", 
		"48" => "Lozère", 
		"49" => "Maine-et-Loire", 
		"50" => "Manche", 
		"51" => "Marne", 
		"52" => "Haute-Marne", 
		"53" => "Mayenne", 
		"54" => "Meurthe-et-Moselle", 
		"55" => "Meuse", 
		"56" => "Morbihan", 
		"57" => "Moselle", 
		"58" => "Nièvre", 
		"59" => "Nord", 
		"60" => "Oise", 
		"61" => "Orne", 
		"62" => "Pas-de-Calais", 
		"63" => "Puy-de-Dôme", 
		"64" => "Pyrenées-Atlantiques", 
		"65" => "Hautes-Pyrenées", 
		"66" => "Pyrenées-Orientales", 
		"67" => "Bas-Rhin", 
		"68" => "Haut-Rhin", 
		"69" => "Rhône", 
		"70" => "Haute-Saône", 
		"71" => "Saône-et-Loire", 
		"72" => "Sarthe", 
		"73" => "Savoie", 
		"74" => "Haute-Savoie", 
		"75" => "Paris", 
		"76" => "Seine-Maritime", 
		"77" => "Seine-et-Marne", 
		"78" => "Yvelines", 
		"79" => "Deux-Sèvres", 
		"80" => "Somme", 
		"81" => "Tarn", 
		"82" => "Tarn-et-Garonne", 
		"83" => "Var", 
		"84" => "Vaucluse", 
		"85" => "Vendée", 
		"86" => "Vienne", 
		"87" => "Haute-Vienne", 
		"88" => "Vosges", 
		"89" => "Yonne", 
		"90" => "Territoire de Belfort", 
		"91" => "Essonne", 
		"92" => "Hauts-de-Seine", 
		"93" => "Seine-Saint-Denis", 
		"94" => "Val-de-Marne", 
		"95" => "Val-d'Oise" 
	); 
	$departement = substr($codepostal,0,2);
return $nom_departement[$departement]; } print departement(35170); // Renvoie Ille-et-Vilaine

2. Trouver la région à laquelle appartient un département

Là encore, rien de sorcier : il suffit de chercher pour quelle région le département fait partie de la liste. Si on place la liste des régions dans un tableau global, on peut facilement faire l’opération inverse : sortir la liste des départements pour une même région.

// Code proposé par Le Caphar http://www.lepotlatch.org
$liste_regions = array (
	"Alsace" => array(67,68),
	"Aquitaine" => array(24,33,40,47,64),
	"Auvergne" => array ("03",15,43,63),
	"Basse-Normandie" => array (14,50,61),
	"Bourgogne" => array (21,58,71,89),
	"Bretagne" => array (22,29,35,56),
	"Centre" => array (18,28,36,37,41,45),
	"Champagne-Ardenne" => array ("08",10,51,52),
	"Corse" => array(20),
	"DOM-TOM" => array(97),
	"Franche-Comté" => array (25,39,70,90),
	"Haute-Normandie" => array (27,76),
	"Ile de France" => array(75,77,78,91,92,93,94,95),
	"Languedoc-Roussillon" => array(11,30,34,48,66),
	"Limousin" => array(19,23,87),
	"Lorraine" => array (54,55,57,88),
	"Midi-Pyrénées" => array("09",12,31,32,46,65,81,82),
	"Nord / Pas-de-Calais" => array(59,62),
	"Pays de la Loire" => array (44,49,53,72,85),
	"Picardie" => array ("02",60,80),
	"Poitou-Charentes" => array (16,17,79,86),
	"PACA" => array("04","05","06",13,83,84),
	"Rhône-Alpes" => array ("01","07",26,38,42,69,73,74)
);

// Renvoie la région à partir du code postal ou du numéro de département
function region($codepostal) 
{
		global $liste_regions;
		$departement = substr($codepostal,0,2);
		
		foreach($liste_regions as $region => $liste_dep) 
		{
			if (in_array($departement, $liste_dep))
			{
				return $region;
			}
		}		
}
print region(35170); 
// Renvoie Bretagne

3. Convertir une date SQL (YYYY-MM-DD) en date lisible

Les bases de données SQL formatent les champs date sous une forme peu explicite pour les utilisateurs français. J’ai pour habitude de convertir tous ces champs dans un format de date plus lisible, soit long (31 décembre 2006), soit court (31/12/2006).

// Renvoie une date en français à partir d'une date SQL (YYYY-MM-DD)
// Code proposé par Le Caphar http://www.lepotlatch.org
function date_fr ($date,$court = FALSE) 
{
	// Format court 12/08/2006
	if ($court == TRUE)
	{
		return substr($date,8,2) . "/" . substr($date,5,2) . "/" . substr($date,0,4);
	}
	
	// Format long 12 août 2006
	$mois_conv = array (
		"01" => "janvier",
		"02" => "février",
		"03" => "mars",
		"04" => "avril",
		"05" => "mai",
		"06" => "juin",
		"07" => "juillet",
		"08" => "août",
		"09" => "septembre",
		"10" => "octobre",
		"11" => "novembre",
		"12" => "décembre"
	);
	if (substr($date,8,2) != "00") 
	{
		$datefr['jour'] = substr($date,8,2);
	}
	if (substr($date,5,2) != "00") 
	{
		// Majuscule au mois s'il n'y a pas de jour défini (00)
		if (!$datefr['jour']) 
		{
			$datefr['mois'] = ucfirst($mois_conv[substr($date,5,2)]);
		}
		else
		{
			$datefr['mois'] = $mois_conv[substr($date,5,2)];
		}
	}
	if (substr($date,0,4) != "0000") 
	{
		$datefr['annee'] = substr($date,0,4);
	}	
	
	if ($datefr) 
    {
		$date = join (" ", $datefr);
		return $date;
	}
}

print date_fr("2006-12-31") ;
// Renvoie 31 décembre 2006

4. Vérifier une adresse e-mail saisie par un utilisateur

Les formulaires de collecte d’e-mails sont sujets à deux problèmes majeurs. D’un côté, il y a les utilisateurs tête-en-l’air ou les novices qui saisissent systématiquement http://monadresse@free.fr. De l’autre il y a les robots spammeurs qui envoient des caractères ésotériques pour tromper le formulaire et récupérer l’e-mail du webmestre. Une simple expression régulière permet de vérifier que l’e-mail est bien construit (attention, elle ne dira pas si l’adresse elle-même est valide…).

// Vérifie la validité de l'email
// Code proposé par Le Caphar http://www.lepotlatch.org
function est_email ($adresse) { 
	$reg = "^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]*[.][a-z]{2,4}$";
	$email = ereg($reg,$adresse);
	if ($email) 
	{
		return TRUE;
	}
}

if (!est_email("http://caphar@lepotlatch.org")) 
{
	print "Ce n'est pas un e-mail";
}

// Renvoie "Ce n'est pas un e-mail"

5. Couper un texte à 100 caractères sans couper un mot

La fonction substr() permet certes de tronquer une chaîne de caractères, mais rien n’est plus désagréable que de voir des mots coupés en d… Comme ça par exemple. Pour éviter cela, cette fonction (pompée sur le Web) coupe sur un espace. C’est plus propre

// Coupe un texte à $longueur caractères, sur les espaces, et ajoute des points de suspension...
// Code proposé par Le Caphar http://www.lepotlatch.org
function tronque($chaine, $longueur = 120) 
{
 
	if (empty ($chaine)) 
	{ 
		return ""; 
	}
	elseif (strlen ($chaine) < $longueur) 
	{ 
		return $chaine; 
	}
	elseif (preg_match ("/(.{1,$longueur})\s./ms", $chaine, $match)) 
	{ 
		return $match [1] . "..."; 
	}
	else 
	{ 
		return substr ($chaine, 0, $longueur) . "..."; 
	}
}
print tronque("Ceci n'est pas un tuyau",12);
// Renvoie Ceci n'est pas...

6. Retourner une ou plusieurs lignes de la base de données en une seule instruction

Lorsqu’on travaille régulièrement avec des bases SQL, on est amené à multiplier les $sql = mysql_query() qu’on parcourt ensuite avec des mysql_fetch_assoc pour créer des tableaux de données, en créant des variables intermédiaires qu’on n’utilise qu’une fois. J’ai personnellement identifié deux usages principaux qui représentent 90% de mes requêtes, et je leur ai créé chacun une fonction en une ligne qui crée les tableaux associatifs voulus :
– ramener une seule ligne identifiée généralement par son id : j’utilise la fonction mysql_ligne()
– ramener une série de lignes de la base dans un tableau, qu’on peut ensuite traiter à la chaîne avec un foreach : j’utilise la fonction mysql_tableau()

// Retourne une seule ligne dans un tableau $array['champ 1']
// Code proposé par Le Caphar http://www.lepotlatch.org
function mysql_ligne($requete,$erreur=NULL)
{
	$result = mysql_query($requete) OR DIE ("Erreur " . $erreur);
	$array = mysql_fetch_assoc($result) ;
	return $array;
}

$article = mysql_ligne("SELECT titre FROM articles WHERE id=8 LIMIT 1");

print $article['titre'];
// Renvoie par ex. "10 fonctions PHP"

// Retourne à partir d'une requête MySQL toutes les lignes dans un tableau $array[ $champ_identifiant ]['champ 1']
// Le plus souvent, le champ identifiant sera le champ id, ce qui donnera $array[123][...]
function mysql_tableau($requete,$champ_identifiant="id",$erreur=NULL)
{
	$results = mysql_query($requete) OR DIE ("Erreur" . $erreur);
	while ($result = mysql_fetch_assoc($results)) 
	{ 
		if ($result[$champ_identifiant]) 
		{ 
			$array[ $result[$champ_identifiant] ] = $result; 
		}
		else 
		{
			$array[] = $result;
		}
	} 
	return $array;
}

$articles = mysql_tableau("SELECT id, auteur FROM articles ORDER BY id DESC");
foreach ($articles as $article)
{
	print $article['id'] . ' : ' . $article['auteur'] . ',';
}
// Renvoie par ex.  8 : Le Caphar, 6 : Toto

7. Retourner une seule valeur dans une ligne de la base de données

Parfois on ne souhaite obtenir qu’une seule colonne pour une ligne dans toute une table. Par exemple, je veux, en plein milieu d’une chaîne print "", insérer le nom d’un collègue dont l’id est le 62… Cette fonction repose sur mysql_ligne() qu’elle complète. Attention : dès qu’il faut obtenir plusieurs colonnes sur une même ligne, mieux vaut faire un tableau avec mysql_ligne(), car chaque requête est gourmande en ressources serveur.


// Ramène la valeur de la colonne $col de la table $table sur la ligne où where= $where 
// La valeur unique est ramenée sous forme de string
// Code proposé par Le Caphar http://www.lepotlatch.org

function mysql_valeur($table,$col,$where)
{
	$result = mysql_ligne("SELECT $col FROM $table WHERE $where LIMIT 1"); 
	return $result[$col];
}

print "L'employé" . mysql_valeur("repertoire","nom","id=62") . "est là";
// Renvoie "L'employé DUPONT est là"

8. Supprimer tous les accents d’une chaîne

Celui-ci a été outrageusement pompé de Arto Bendiken. Faites-lui un gros bisou de ma part pour cette fonction indispensable.

// Retire les accents de la chaîne 
// Code par Arto Bendiken http://bendiken.net/snippets/php
function sans_accent($text){
$trans = get_html_translation_table(HTML_ENTITIES); // Place les entités dans un tableau
foreach ($trans as $literal =>$entity){ // Crée deux tableaux, un pour la forme accentuée, l'autre sans accents
   if (ord($literal)>=192){ // Ne concerne pas les caractères comme les fractions, guillemets, etc...
     $replace[]=substr($entity,1,1); //Récupère le 'E' de la chaîne '&Eaccute' etc.
     $search[]=$literal;}} //Renvoie la lettre accentuée
return str_replace($search, $replace, $text);}

print sans_accent("Belvédère");
// Renvoie Belvedere

9. Mettre en chaîne accentuée en majuscules

PHP est assez réfractaire aux langues accentuées. La fonction strtoupper est ainsi incapable de changer la casse des minuscules accentuées pour en faire des majuscules simples (non accentuées). Ma fonction utilise tout simplement la fonction précédente sans_accent() pour supprimer les accents avant.

//Convertit la chaîne en majuscules, et passe les minuscules accentuées en majuscules non accentuées
// Code proposé par Le Caphar http://www.lepotlatch.org

function majuscules ($chaine) 
{
	return strtoupper(sans_accent($chaine));
}

print majuscules ("L'épopée du Würlitzer");
// Renvoie L'EPOPEE DU WURLITZER

10. Faire un lien automatique sur les adresses e-mails en toutes lettres

Je suis souvent amené à utiliser des textes saisis dans un formulaire par des utilisateurs et contenant des adresses e-mail. A la relecture, il est pratique de convertir automatiquement ces adresses en lien mailto: cliquables. Ce’st possible, grâce aux expressions régulières :

// Convertit les adresses e-mail texte en liens cliquables
// Code proposé par Le Caphar http://www.lepotlatch.org

function liens_email($texte)
{
	$pattern = "/([._a-zA-Z0-9-]*@[.a-zA-Z0-9-]*)/";
	$replace = "<a href=\"mailto:$1\">$1</a>";		  
	$string = preg_replace($pattern, $replace, $texte);	
	return $string;
}

print liens_email("Contactez l'auteur caphar@lepotlatch.org");
// Renvoie Contactez l'auteur caphar@lepotlatch.org

J’ai des scrupules vis-à-vis du logiciel libre. J’en consomme des paquets, j’exploite et j’apprends grâce aux dons de cette communauté, mais je n’ai jamais réellement rendu la pareille. J’aimerais vraiment faire partager tous les projets sur lesquels je travaille, les ouvrir à tout le monde. Hélàs ça demande beaucoup de temps de rendre ses outils universels et compréhensibles. J’ai du pain sur la planche. En guise d’apéritif, voici ma petite contribution aux développeurs PHP, une série de fonctions que j’ai développé pour résoudre pas mal de problèmes qui se posent au quotidien. J’espère qu’elles seront utiles à d’autres que moi.

1. Trouver le nom d’un département à partir de son numéro

2. Trouver la région à laquelle appartient un département
3. Convertir une date SQL (YYYY-MM-DD) en date lisible
4. Vérifier une adresse e-mail saisie par un utilisateur
5. Couper un texte à 100 caractères sans couper un mot
6. Retourner une ou plusieurs lignes de la base de données en une seule instruction
7. Retourner une seule valeur dans une ligne de la base de données
8. Supprimer tous les accents d’une chaîne
9. Mettre en chaîne accentuée en majuscules
10. Faire un lien automatique sur les adresses e-mails en toutes lettres

J’ai des scrupules vis-à-vis du logiciel libre. J’en consomme des paquets, j’exploite et j’apprends grâce aux dons de cette communauté, mais je n’ai jamais réellement rendu la pareille. J’aimerais vraiment faire partager tous les projets sur lesquels je travaille, les ouvrir à tout le monde. Hélàs ça demande beaucoup de temps de rendre ses outils universels et compréhensibles. J’ai du pain sur la planche. En guise d’apéritif, voici ma petite contribution aux développeurs PHP, une série de fonctions que j’ai développé pour résoudre pas mal de problèmes qui se posent au quotidien. J’espère qu’elles seront utiles à d’autres que moi.

1. Trouver le nom d’un département à partir de son numéro

Rien de plus simple que de trouver le nom du département à partir de son numéro ou du code postal. Il suffit d’avoir la table de correspondance qu’on garde en global ou qu’on inclut dans une fonction (comme dans cet exemple) :

 // La fonction prend les deux premiers numéros passés en argument // Code proposé par Le Caphar http://www.lepotlatch.org function departement($codepostal) {     $nom_departement = array ( 		"01" => "Ain", 		"02" => "Aisne", 		"03" => "Allier", 		"04" => "Alpes-de-Haute Provence", 		"05" => "Hautes-Alpes", 		"06" => "Alpes Maritimes", 		"07" => "Ardèche", 		"08" => "Ardennes", 		"09" => "Ariège", 		"10" => "Aube", 		"11" => "Aude", 		"12" => "Aveyron", 		"13" => "Bouches-du-Rhône", 		"14" => "Calvados", 		"15" => "Cantal", 		"16" => "Charente", 		"17" => "Charente-Maritime", 		"18" => "Cher", 		"19" => "Corrèze", 		"20" => "Corse", 		"21" => "Côte d'Or", 		"22" => "Côtes d'Armor", 		"23" => "Creuse", 		"24" => "Dordogne", 		"25" => "Doubs", 		"26" => "Drôme", 		"27" => "Eure", 		"28" => "Eure-et-Loire", 		"29" => "Finistère", 		"30" => "Gard", 		"31" => "Haute-Garonne", 		"32" => "Gers", 		"33" => "Gironde", 		"34" => "Hérault", 		"35" => "Ille-et-Vilaine", 		"36" => "Indre", 		"37" => "Indre-et-Loire", 		"38" => "Isère", 		"39" => "Jura", 		"40" => "Landes", 		"41" => "Loir-et-Cher", 		"42" => "Loire", 		"43" => "Haute-Loire", 		"44" => "Loire-Atlantique", 		"45" => "Loiret", 		"46" => "Lot", 		"47" => "Lot-et-Garonne", 		"48" => "Lozère", 		"49" => "Maine-et-Loire", 		"50" => "Manche", 		"51" => "Marne", 		"52" => "Haute-Marne", 		"53" => "Mayenne", 		"54" => "Meurthe-et-Moselle", 		"55" => "Meuse", 		"56" => "Morbihan", 		"57" => "Moselle", 		"58" => "Nièvre", 		"59" => "Nord", 		"60" => "Oise", 		"61" => "Orne", 		"62" => "Pas-de-Calais", 		"63" => "Puy-de-Dôme", 		"64" => "Pyrenées-Atlantiques", 		"65" => "Hautes-Pyrenées", 		"66" => "Pyrenées-Orientales", 		"67" => "Bas-Rhin", 		"68" => "Haut-Rhin", 		"69" => "Rhône", 		"70" => "Haute-Saône", 		"71" => "Saône-et-Loire", 		"72" => "Sarthe", 		"73" => "Savoie", 		"74" => "Haute-Savoie", 		"75" => "Paris", 		"76" => "Seine-Maritime", 		"77" => "Seine-et-Marne", 		"78" => "Yvelines", 		"79" => "Deux-Sèvres", 		"80" => "Somme", 		"81" => "Tarn", 		"82" => "Tarn-et-Garonne", 		"83" => "Var", 		"84" => "Vaucluse", 		"85" => "Vendée", 		"86" => "Vienne", 		"87" => "Haute-Vienne", 		"88" => "Vosges", 		"89" => "Yonne", 		"90" => "Territoire de Belfort", 		"91" => "Essonne", 		"92" => "Hauts-de-Seine", 		"93" => "Seine-Saint-Denis", 		"94" => "Val-de-Marne", 		"95" => "Val-d'Oise" 	); 	$departement = substr($codepostal,0,2);
return $nom_departement[$departement]; } print departement(35170); // Renvoie Ille-et-Vilaine

2. Trouver la région à laquelle appartient un département

Là encore, rien de sorcier : il suffit de chercher pour quelle région le département fait partie de la liste. Si on place la liste des régions dans un tableau global, on peut facilement faire l’opération inverse : sortir la liste des départements pour une même région.

// Code proposé par Le Caphar http://www.lepotlatch.org $liste_regions = array ( 	"Alsace" => array(67,68), 	"Aquitaine" => array(24,33,40,47,64), 	"Auvergne" => array ("03",15,43,63), 	"Basse-Normandie" => array (14,50,61), 	"Bourgogne" => array (21,58,71,89), 	"Bretagne" => array (22,29,35,56), 	"Centre" => array (18,28,36,37,41,45), 	"Champagne-Ardenne" => array ("08",10,51,52), 	"Corse" => array(20), 	"DOM-TOM" => array(97), 	"Franche-Comté" => array (25,39,70,90), 	"Haute-Normandie" => array (27,76), 	"Ile de France" => array(75,77,78,91,92,93,94,95), 	"Languedoc-Roussillon" => array(11,30,34,48,66), 	"Limousin" => array(19,23,87), 	"Lorraine" => array (54,55,57,88), 	"Midi-Pyrénées" => array("09",12,31,32,46,65,81,82), 	"Nord / Pas-de-Calais" => array(59,62), 	"Pays de la Loire" => array (44,49,53,72,85), 	"Picardie" => array ("02",60,80), 	"Poitou-Charentes" => array (16,17,79,86), 	"PACA" => array("04","05","06",13,83,84), 	"Rhône-Alpes" => array ("01","07",26,38,42,69,73,74) ); // Renvoie la région à partir du code postal ou du numéro de département function region($codepostal) { 		global $liste_regions; 		$departement = substr($codepostal,0,2); 		foreach($liste_regions as $region => $liste_dep) 		{ 			if (in_array($departement, $liste_dep)) 			{ 				return $region; 			} 		} } print region(35170); // Renvoie Bretagne 

3. Convertir une date SQL (YYYY-MM-DD) en date lisible

Les bases de données SQL formatent les champs date sous une forme peu explicite pour les utilisateurs français. J’ai pour habitude de convertir tous ces champs dans un format de date plus lisible, soit long (31 décembre 2006), soit court (31/12/2006).

// Renvoie une date en français à partir d'une date SQL (YYYY-MM-DD) // Code proposé par Le Caphar http://www.lepotlatch.org function date_fr ($date,$court = FALSE) { 	// Format court 12/08/2006 	if ($court == TRUE) 	{ 		return substr($date,8,2) . "/" . substr($date,5,2) . "/" . substr($date,0,4); 	} 	// Format long 12 août 2006 	$mois_conv = array ( 		"01" => "janvier", 		"02" => "février", 		"03" => "mars", 		"04" => "avril", 		"05" => "mai", 		"06" => "juin", 		"07" => "juillet", 		"08" => "août", 		"09" => "septembre", 		"10" => "octobre", 		"11" => "novembre", 		"12" => "décembre" 	); 	if (substr($date,8,2) != "00") 	{ 		$datefr['jour'] = substr($date,8,2); 	} 	if (substr($date,5,2) != "00") 	{ 		// Majuscule au mois s'il n'y a pas de jour défini (00) 		if (!$datefr['jour']) 		{ 			$datefr['mois'] = ucfirst($mois_conv[substr($date,5,2)]); 		} 		else 		{ 			$datefr['mois'] = $mois_conv[substr($date,5,2)]; 		} 	} 	if (substr($date,0,4) != "0000") 	{ 		$datefr['annee'] = substr($date,0,4); 	} 	if ($datefr)     { 		$date = join (" ", $datefr); 		return $date; 	} } print date_fr("2006-12-31") ; // Renvoie 31 décembre 2006 

4. Vérifier une adresse e-mail saisie par un utilisateur

Les formulaires de collecte d’e-mails sont sujets à deux problèmes majeurs. D’un côté, il y a les utilisateurs tête-en-l’air ou les novices qui saisissent systématiquement http://monadresse@free.fr. De l’autre il y a les robots spammeurs qui envoient des caractères ésotériques pour tromper le formulaire et récupérer l’e-mail du webmestre. Une simple expression régulière permet de vérifier que l’e-mail est bien construit (attention, elle ne dira pas si l’adresse elle-même est valide…).

// Vérifie la validité de l'email // Code proposé par Le Caphar http://www.lepotlatch.org function est_email ($adresse) { 	$reg = "^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]*[.][a-z]{2,4}$"; 	$email = ereg($reg,$adresse); 	if ($email) 	{ 		return TRUE; 	} } if (!est_email("http://caphar@lepotlatch.org")) { 	print "Ce n'est pas un e-mail"; } // Renvoie "Ce n'est pas un e-mail" 

5. Couper un texte à 100 caractères sans couper un mot

La fonction substr() permet certes de tronquer une chaîne de caractères, mais rien n’est plus désagréable que de voir des mots coupés en d… Comme ça par exemple. Pour éviter cela, cette fonction (pompée sur le Web) coupe sur un espace. C’est plus propre

// Coupe un texte à $longueur caractères, sur les espaces, et ajoute des points de suspension... // Code proposé par Le Caphar http://www.lepotlatch.org function tronque($chaine, $longueur = 120) { 	if (empty ($chaine)) 	{ 		return ""; 	} 	elseif (strlen ($chaine) < $longueur) 	{ 		return $chaine; 	} 	elseif (preg_match ("/(.{1,$longueur})\s./ms", $chaine, $match)) 	{ 		return $match [1] . "..."; 	} 	else 	{ 		return substr ($chaine, 0, $longueur) . "..."; 	} } print tronque("Ceci n'est pas un tuyau",12); // Renvoie Ceci n'est pas... 

6. Retourner une ou plusieurs lignes de la base de données en une seule instruction

Lorsqu’on travaille régulièrement avec des bases SQL, on est amené à multiplier les $sql = mysql_query() qu’on parcourt ensuite avec des mysql_fetch_assoc pour créer des tableaux de données, en créant des variables intermédiaires qu’on n’utilise qu’une fois. J’ai personnellement identifié deux usages principaux qui représentent 90% de mes requêtes, et je leur ai créé chacun une fonction en une ligne qui crée les tableaux associatifs voulus :
– ramener une seule ligne identifiée généralement par son id : j’utilise la fonction mysql_ligne()
– ramener une série de lignes de la base dans un tableau, qu’on peut ensuite traiter à la chaîne avec un foreach : j’utilise la fonction mysql_tableau()

// Retourne une seule ligne dans un tableau $array['champ 1'] // Code proposé par Le Caphar http://www.lepotlatch.org function mysql_ligne($requete,$erreur=NULL) { 	$result = mysql_query($requete) OR DIE ("Erreur " . $erreur); 	$array = mysql_fetch_assoc($result) ; 	return $array; } $article = mysql_ligne("SELECT titre FROM articles WHERE id=8 LIMIT 1"); print $article['titre']; // Renvoie par ex. "10 fonctions PHP" // Retourne à partir d'une requête MySQL toutes les lignes dans un tableau $array[ $champ_identifiant ]['champ 1'] // Le plus souvent, le champ identifiant sera le champ id, ce qui donnera $array[123][...] function mysql_tableau($requete,$champ_identifiant="id",$erreur=NULL) { 	$results = mysql_query($requete) OR DIE ("Erreur" . $erreur); 	while ($result = mysql_fetch_assoc($results)) 	{ 		if ($result[$champ_identifiant]) 		{ 			$array[ $result[$champ_identifiant] ] = $result; 		} 		else 		{ 			$array[] = $result; 		} 	} 	return $array; } $articles = mysql_tableau("SELECT id, auteur FROM articles ORDER BY id DESC"); foreach ($articles as $article) { 	print $article['id'] . ' : ' . $article['auteur'] . ','; } // Renvoie par ex.  8 : Le Caphar, 6 : Toto 

7. Retourner une seule valeur dans une ligne de la base de données

Parfois on ne souhaite obtenir qu’une seule colonne pour une ligne dans toute une table. Par exemple, je veux, en plein milieu d’une chaîne print "", insérer le nom d’un collègue dont l’id est le 62… Cette fonction repose sur mysql_ligne() qu’elle complète. Attention : dès qu’il faut obtenir plusieurs colonnes sur une même ligne, mieux vaut faire un tableau avec mysql_ligne(), car chaque requête est gourmande en ressources serveur.

 // Ramène la valeur de la colonne $col de la table $table sur la ligne où where= $where // La valeur unique est ramenée sous forme de string // Code proposé par Le Caphar http://www.lepotlatch.org function mysql_valeur($table,$col,$where) { 	$result = mysql_ligne("SELECT $col FROM $table WHERE $where LIMIT 1"); 	return $result[$col]; } print "L'employé" . mysql_valeur("repertoire","nom","id=62") . "est là"; // Renvoie "L'employé DUPONT est là" 

8. Supprimer tous les accents d’une chaîne

Celui-ci a été outrageusement pompé de Arto Bendiken. Faites-lui un gros bisou de ma part pour cette fonction indispensable.

// Retire les accents de la chaîne  // Code par Arto Bendiken http://bendiken.net/snippets/php function sans_accent($text){ $trans = get_html_translation_table(HTML_ENTITIES); // Place les entités dans un tableau foreach ($trans as $literal =>$entity){ // Crée deux tableaux, un pour la forme accentuée, l'autre sans accents    if (ord($literal)>=192){ // Ne concerne pas les caractères comme les fractions, guillemets, etc...      $replace[]=substr($entity,1,1); //Récupère le 'E' de la chaîne '&Eaccute' etc.      $search[]=$literal;}} //Renvoie la lettre accentuée return str_replace($search, $replace, $text);} print sans_accent("Belvédère"); // Renvoie Belvedere 

9. Mettre en chaîne accentuée en majuscules

PHP est assez réfractaire aux langues accentuées. La fonction strtoupper est ainsi incapable de changer la casse des minuscules accentuées pour en faire des majuscules simples (non accentuées). Ma fonction utilise tout simplement la fonction précédente sans_accent() pour supprimer les accents avant.

//Convertit la chaîne en majuscules, et passe les minuscules accentuées en majuscules non accentuées // Code proposé par Le Caphar http://www.lepotlatch.org function majuscules ($chaine) { 	return strtoupper(sans_accent($chaine)); } print majuscules ("L'épopée du Würlitzer"); // Renvoie L'EPOPEE DU WURLITZER 

10. Faire un lien automatique sur les adresses e-mails en toutes lettres

Je suis souvent amené à utiliser des textes saisis dans un formulaire par des utilisateurs et contenant des adresses e-mail. A la relecture, il est pratique de convertir automatiquement ces adresses en lien mailto: cliquables. Ce’st possible, grâce aux expressions régulières :

// Convertit les adresses e-mail texte en liens cliquables // Code proposé par Le Caphar http://www.lepotlatch.org function liens_email($texte) { 	$pattern = "/([._a-zA-Z0-9-]*@[.a-zA-Z0-9-]*)/"; 	$replace = "<a href=\"mailto:$1\">$1</a>"; 	$string = preg_replace($pattern, $replace, $texte); 	return $string; } print liens_email("Contactez l'auteur caphar@lepotlatch.org"); // Renvoie Contactez l'auteur caphar@lepotlatch.org 
Bookmark and Share
Outil de référencement professionnel - essai gratuit Cette entrée a été publiée dans Développement PHP, avec comme mot(s)-clef(s) , , , , . Vous pouvez la mettre en favoris avec ce permalien.

22 réponses à 10 fonctions PHP-MySQL que j’utilise tous les jours

  1. hurlante nova dit :

    très chouette merci

  2. Poil dit :

    Convertir une date YYYY-MM-DD

    Pourquoi ne pas la mettre en timestamp et faire un strftime tout simplement ?

    $toto=strtotime($madate);
    $madate=strftime(%D);

  3. Caphar dit :

    Poil : parce que strftime ne me donne pas la date en français type "12 novembre 2006".
    Après, j’imagine qu’on peut améliorer ma fonction. Peut-être que ça allègerait le code d’une ligne ou deux mais je ne me suis pas concentré sur cet aspect, davantage sur la présentation des valeurs de retour.
    Merci de ta suggestion.

  4. pc249 dit :

    j’ai dans une table XXX une rubrique date prenom etc la rubrique date contient un chiffre 13471 comment trouver à quelle date ce chiffre correspond? est-ce que c’est directement lié au script qu’il l’a crée ou existe-il une fonction php pour la transformer en jour-mois-année?
    Merci

  5. Damien Ravé (le Caphar) dit :

    pc249, après un petit calcul il me semble que le chiffre indique le nombre de jours écoulés depuis le 1er janvier 1970. En effet, si on divise 13271 jours par 365, on obtient 36 et quelques années, donc quelque chose comme 2006. On a l’habitude de calculer le nombre de secondes plutôt qu’en jours (c’est le timestamp unix), mais pourquoi pas.

    Le plus simple, c’est de transformer cette valeur en timestamp unix en multipliant par le nombre de secondes par jour, puis à le passer en argument de getdate(), qui te renvoie un array :

    $date =  getdate(13271*86400); print_r ($date); // Renvoie : Array ( [seconds] => 0 [minutes] => 0 [hours] => 2 [mday] => 3 [wday] => 3 [mon] => 5 [year] => 2006 [yday] => 122 [weekday] => Wednesday [month] => May [0] => 1146614400 )

  6. pc249 dit :

    merci pour l’info! mais je voudrais la mettre dans une boucle
    mais comment aficher seulement la date le mois et l’année dans la colonne Date
    voici une partie du script.
    while($row = @mysql_fetch_array($result)){
    $Prenom = $row[3];
    $Date = $row[0];
    echo "<tr>\n
    <td bgcolor=’silver’>$Prenom</td>\n
    <td bgcolor=’yellow’>$Date</td>\n
    <tr bgcolor=’black’>$Note</tr>\n";
    }
    // Deconnexion de la base de donnees
    @mysql_close();

  7. Damien Ravé (le Caphar) dit :

    Si la première colonne correspond bien à ta date en chiffre (13471), essaie un truc comme ça :

     while($row = @mysql_fetch_array($result)){ $Prenom = $row[3]; $Date = getdate($row[0] * 86400) ; echo "<tr> <td bgcolor='silver'>$Prenom</td> <td bgcolor='yellow'>" . $Date['mon'] . "/" . $Date['year'] . "</td> <tr bgcolor='black'>$Note</tr>"; } // Pas besoin de fermer la connexion MySQL : PHP la ferme automatiquement à la fin de ton script 

  8. pc249 dit :

    merci ça fonctionne mais dans le tableau j’obtiens:
    Array 19/11/2006
    peut-on enlever "Array" ?

  9. milk dit :

    ca c un bon tuto !! surtout pour plusieurs ligne dans un tableau car on peut ensuite le personnalisé comme on le souhaite !!

    foreach ($articles as $article)
    {

    mysql_query("Update gestion_site set stats=’0′ WHERE membre_id=’2’");

    ca c bien !! merci pour ce tuto ;) génial
    un moment jai posté sur un forum.. et j’ai eu a faire a des begueule qui comprenait pas ce que je voulai dire…
    merci ;)

  10. domi dit :

    Merci pour ces sources bien utiles.

    Pour les départements, j’ai ajouté à la fin :
    if (in_array ($departement, $nom_departement))
    return $nom_departement[$departement];
    else return $departement;
    Au cas ou le paramètre passé ne corresponde à rien

  11. Domi dit :

    Rectificatif :
    array_key_exists !!

  12. JF dit :

    Très pratique, merci encore.
    (Tu peux en mettre des nouveaux dans une rubrique "top 20" par exemple)

    / JF

  13. orch1d dit :

    Pour ce qui est des dates il est encore plus simple et efficace de les entrer sous format yyyymmdd dans un champ INT(8), ainsi, il suffit de trier les nombres en ordre croissant ou décroissant pour trier les dates.

  14. DLD dit :

    Merci pour cet article , on utilise certaines techniques identiques mais j’ai appris quelques trucs intéressants.
    Et hop, un nouveau blog dans mon agrégateur

  15. fluxe dit :

    9. Mettre en chaîne accentuée en majuscules

    Je préfére passer par la propriété CSS "text-transform: uppercase" si je dois mettre un texte en majuscule dans une page. C’est plus rapide que de passer par des fonctions PHP plus lourdes, et permet les caractères eccentués sur les majuscules.

  16. Damien Ravé - Le Caphar dit :

    Certes mais les majuscules accentuées ne sont pas forcément souhaitables. La secrétaire de rédaction du magazine que nous éditons nous en a interdit l’usage.

  17. Papa dit :

    bonjour, merci pour ce billet interesant (comme souvent !) ; heureusement que tu as perecise : "attention, elle ne dira pas si l’adresse elle-meme est valide" :) on aurait eu dun mal a saisir l’esssentiel :)

  18. Nicolas dit :

    Je me demandais dans quel cas hypothétique la partie "else" était utilisée dans la fonction mysql_tableau

    while ($result = mysql_fetch_assoc($results))
    {
    if ($result[$champ_identifiant])
    {
    $array[ $result[$champ_identifiant] ] = $result;
    }
    else
    {
    $array[] = $result;
    }
    }

    En fait je ne saisis pas quand est ce que la condition

    if ($result[$champ_identifiant])

    ne pourrait pas être vérifiée (cela veut bien dire que par exemple : si $result[‘id’] n’est pas NULL ?)

  19. Damien Ravé - Le Caphar dit :

    Si tu ne spécifies pas d’identifiant, il cherchera la colonne id. Or si ta requête ne renvoie pas d’id, il empile les lignes de résultat dans le tableau array().

    Cette condition a été intégrée pour le cas où la requête ne renvoie pas de colonne id, et où aucune autre colonne ne peut faire office d’identifiant unique. Prenons l’exemple d’une requête qui renvoie les 10 dernières visites d’un site, par exemple « SELECT login, date FROM stats_log ORDER BY date DESC ». Si tu utilises la colonne login comme identifiant, un même visiteur « bidule » qui passe 7 fois représentera certes 7 lignes de résultat, mais le tableau $array[‘bidule’] sera écrasé à chaque itération de la boucle qui ne gardera que la dernière ligne. En revanche, si tu lui laisses l’identifiant par défaut, il cherchera une colonne id qui n’existe pas, et passera directement à la deuxième proposition, qui conservera l’intégralité des enregistrements.

    La vraie question est plus : pourquoi ne pas supprimer la première option ? Car avec l’expérience, je n’ai finalement presque jamais besoin de connaître la clé du tableau. Cette option peut éventuellement servir à pointer rapidement une ligne genre $array[123][‘date’] en connaissant l’id 123, mais tu peux faire ce type de chose dans une boucle foreach($array as $num_ligne => $ligne), ou tout simplement récupérer $ligne[‘id’] dans une boucle foreach ($array as $ligne)…

  20. Raton dit :

    Bonjour,

    A propos de la conversion des dates, l’idéal est d’enregistrer le timestamp dans la BDD (prévoir un champ de 10 caractères de long). A partir de là, avec la fonction date() on peut obtenir la date dans le format qu’on veut sans toucher aux chiffres contenu dans la BDD.

    Exemple : avoir une date au format jj/mm/yyyy
    => date(‘d/m/Y’, $timestamp);

    Si on veut seulement le jour, l’heure et les minutes :
    => date(‘d à H:i’, $timestamp);

    Remarquez qu’on ne touche pas à $timestamp, ce qui est très pratique : on peut extraire n’importe quelle date à partir du même nombre. C’est magique ;)

    Un tuto sur le timestamp : http://www.siteduzero.com/tuto-3...

  21. mobidyc dit :

    Bonjour,

    une petite fonction plus simple pour transformer une date mysql en date lisible (sous linux/unix):
    function sqltime2php($sqltime) {
    $in_timestamp = strtotime($sqltime);
    setlocale(LC_TIME,"fr_FR.utf8"); // locale -a pour la liste des locales existantes
    return strftime("%A %d %B %G &agrave; %Hh%M",$in_timestamp);
    }

    mettre le format de sortie désiré dans la fonction.
    echo sqltime2php(2008-03-18 11:48:10);

    retournera:
    mardi 18 mars 2008 à 11h48

  22. Eymer dit :

    Très bien , merci
    Personnellement, je galère pour extraire des départements alphabétique dans des lignes comportant aussi les région donc par exemple Charente (quelque fois en minuscule) avec Poitou Charente mais aussi « Loire-Atlantique » (avec ou sans tirets …
    @+

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>