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.orgGoogle+

très chouette merci
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);
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.
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
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 :
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();
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 scriptmerci ça fonctionne mais dans le tableau j’obtiens:
Array 19/11/2006
peut-on enlever "Array" ?
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
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
Rectificatif :
array_key_exists !!
Très pratique, merci encore.
(Tu peux en mettre des nouveaux dans une rubrique "top 20" par exemple)
/ JF
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.
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
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.
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.
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
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 ?)
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)…
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...
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 à %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