SPARQL Protocol and RDF Query Language/Travail pratique/PHP les fonctions
Introduction
modifierDans ce TP, nous allons acquérir quelques bases de programmation PHP pour utiliser des fonctions.
Ce TP a pour objectif de pouvoir utiliser des librairies de fonctions plus facilement par la suite.
À savoir avant de commencer
modifierLes fonctions
modifierDéfinition
modifierImaginons que le code suivant est utilisé dans plusieurs pages de votre site Web :
<?php
//Construisons un tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);
echo 'Vos notes du trimestre :<br />';
foreach($notes as $note){
echo '- '.$note.'<br />';
}
?>
Votre code affichera les notes d'un élève, mais on veut :
- mettre en rouge toutes les notes (strictement) inférieures à 10.
- mettre en vert toutes les notes supérieures (ou égales) à 15.
Cela veut dire qu’à chaque apparition d'une note, il faut la tester et lui appliquer la couleur adéquate.
Comme c’est une tâche répétitive, on va la mettre en forme dans une fonction.
Une fonction est une portion de code représentant un sous-programme, qui effectue une tâche ou un calcul relativement indépendant du reste du programme.
Utilisation
modifierUtilisation d'une fonction :
- On place la fonction au début du code(au sein de balises PHP).
- PHP ne parcourt qu'une seule fois le code. Si la fonction n’est pas définie avant son utilisation, PHP génère une erreur.
- On ne la crée qu'une fois, tandis qu'on la convoque autant de fois que l’on veut.
Syntaxe
modifierVoici la coquille de la fonction pour résoudre notre problème :
function colore($nombre){
//toutes les instructions se situeront à l'intérieur de ces accolades;
//et se termineront par un ;
}
Pour écrire une fonction :
- il est obligatoire de commencer par écrire function,
- ensuite vient le nom. On va lui donner un nom simple à retenir.
- comme les variables, les noms de fonctions sont libres, il faut simplement bannir les espaces et les accents.
- le nom de votre fonction est sensible à la casse, c'est-à-dire que vous devenez respecter les majuscules et les minuscules quand vous appelez votre fonction.
- Et, entre parenthèses, le paramètre (une variable imaginaire, $nombre, dont on ne connaît pas encore la valeur)...
On fait, comme si $nombre existait déjà.
Voici un exemple de code qui effectue ce que l’on veut obtenir :
<?php
/**
* Fonction qui affiche une note en couleur.
*/
function colore($nombre){
if($nombre<10){
echo'<span style="color:red;">'.$nombre.'</span>';
}elseif($nombre>=15){
echo'<span style="color:green;">'.$nombre.'</span>';
} else{ //cas par défaut(noir)
echo $nombre;
}
}
?>
On peut maintenant appeler notre fonction dans une page Web :
<?php
//Construisons notre tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);
//Et maintenant, précisons notre boucle foreach pour y convoquer notre fonction.
echo 'Vos notes du trimestre :<br />';
foreach($notes as $note){
echo '- '.colore($note).'<br />';
}
?>
Voici notre page Web en entier avec la définition de notre fonction avant l'appel de la fonction dans le code :
<html>
<head><title>Notes du trimestre</title></head>
<body>
<?php
//Cette fonction colore en rouge les notes<10
//et en vert les notes >=15
function colore($nombre){
if($nombre<10){
echo'<span style="color:red;">'.$nombre.'</span>';
}
elseif($nombre>=15){
echo'<span style="color:green;">'.$nombre.'</span>';
}
//cas par défaut(affiche sans modifier couleur)
else{
echo $nombre;
}
}
//Construisons notre tableau de notes :
$notes=array(2,5,7,10,11,13,15,17,18);
//La boucle foreach scanne le tableau
//en appliquant la fonction colore
echo 'Vos notes du trimestre :<br />';
foreach($notes as $note){
echo '- ';
colore($note);
echo '<br />';
}
?>
</body>
</html>
Bien que votre fonction se définissait avec "colore($nombre)", vous pouvez l'appeler avec "colore($note)". Cela ne pose aucun problème. Le nom de la variable utilisée comme paramètre au sein de la fonction est celui que vous voulez.
Plusieurs paramètres
modifierLes fonctions peuvent être définies avec plusieurs paramètres.
Par exemple, je peux définir une fonction "moyenne annuelle" :
<?php
function MoyenneAnnuelle($trim1, $trim2, $trim3){
$MA=($trim1+$trim2+$trim3)/3;
echo 'Votre moyenne annuelle : '.$MA;
}
?>
Dans ce cas, pour la convoquer, on pourra écrire :
<?php
MoyenneAnnuelle(8,10,12);
//ceci aura pour résultat :
// Votre moyenne annuelle : 10
?>
Valeur de retour
modifierSi on ne veut pas une fonction qui affiche, mais une fonction qui, par exemple, calcule et renvoie une valeur, on utilisera le mot clé return.
Par exemple, réalisons une fonction qui nous indique si un nombre est pair ou impair.
Voici un formulaire de saisie et une analyse du nombre entré :
<html>
<head><title>Pair ou impair ?</title></head>
<body>
<?php //fonction qui fait le diagnostic
function parite($nombre){
//si le reste de la division est zéro, c’est pair,
//on initialise les deux valeurs de verdict
if (($nombre%2)==0){
$verdict='pair';
}else{
$verdict='impair';
}
return $verdict; //on renvoie le verdict, tout à la fin
}
?>
<form method="POST" action="fonction.php">Entrez votre nombre<input type="text" name="num"/>
<input type="submit" name="valider" value="OK"/>
</form>
<?php //si user a cliqué OK
if(isset($_POST['valider'])){
$nombre=$_POST['num']; //récupère la valeur entrée
$toto=parite($nombre); //place dans $toto la valeur de retour de ma fonction
echo 'Ce nombre est '.$toto.'.'; //affiche le verdict entier
}
?>
</body>
</html>
Le mot clé return :
- stoppe la fonction
- on peut le placer à tout moment dans la fonction, mais pour une meilleure lisibilité du code, il ne faut l’utiliser qu'une fois et comme dernière instruction de la fonction (juste avant l'accolade finale qui ferme la fonction)
- ne peut renvoyer qu'une seule valeur
- libre à vous de rendre cette valeur complexe comme un tableau ou un objet.
Penser à "ranger" la valeur retournée dans une variable de "réception".
Importer des fonctions
modifierSi votre fonction est utilisée dans au moins deux pages Web, vous pouvez mettre vos fonctions dans un autre fichier et partager votre fonction dans plusieurs pages Web. Il vous suffit de convoquer le fichier une seule fois au tout début de chacune de vos pages PHP.
Avec une fonction include, vous pouvez insérer le code d'un autre fichier dans votre page :
<?php
include('fonctions.php');
?>
ou require, qui lève une erreur s'il ne trouve pas le fichier :
<?php
require('fonctions.php');
?>
ou require_once, qui lève une erreur s'il ne trouve pas le fichier, mais qui ne charge qu'une fois ce fichier. Cela évite de recharger inutilement ce fichier. si require_once est appelé plusieurs pour charger le même fichier.
<?php
require_once('fonctions.php');
?>
Ceci vous permet d'appeler n’importe quelle fonction définie dans votre fichier.
Par exemple, vous avez développé un site et vous souhaitez sur chacune des pages signaler votre dernier magazine. Vous pourriez créer la fonction suivante :
<?php
function DernierMag(){
echo'Dernière parution mise à jour :<br />
PIF GADGET<br />
le 10/01/2009';
}
?>
Dans chacune des pages de votre site où vous souhaitez que le message apparaisse, vous devrez :
- 1 ajouter la ligne suivante :
<?php
DernierMag();
?>
- 2 ne pas oublier d'insérer "require_once('fonctions.php');" au début de votre page.
Cela vous permettra de mettre à jour toutes vos pages en modifiant une seule fois votre texte dans fonctions.php.
La fonction DernierMag n'a pas de paramètres. C'est une simple fonction d'affichage. Une fonction sans paramètre conserve toutefois des parenthèses vides, dans sa définition comme à chaque convocation.
La commande switch
modifierLa commande switch gère les conditions multiples. Cela évite d’utiliser inutilement d'imbriquer les instructions if, elseif et else.
Exemple :
<?php
switch($corpulence){
case 'denutrition':
$verdict='Vous êtes en dénutrition.';
//placer ici un lien vers un centre d'aide aux troubles du comportement alimentaire
break;
case 'maigre':
$verdict='Vous êtes maigre.';
//placer ici quelques conseils d'hygiène de vie
break;
Default :
$verdict='Vous avez une corpulence normale.';
//placer "Continuez comme ça"
break;
}
?>
Traduction :
- Dans le cas (case) où la variable $corpulence est égale à :
- 'denutrition' alors affecter le texte 'Vous êtes en dénutrition.' à la variable $verdict
- 'maigre' alors affecter une autre valeur à $verdict
- une autre valeur que 'denutrition' ou 'maigre' alors les instructions dans le cas Default seront utilisées
- On sait que ces conditions s'excluent l'une l'autre grâce à l'instruction break, qui signifie : 'quand tu as fini, sors de ce switch'.
Exercices
modifierLecture d'une liste depuis un formulaire
modifierOn veut qu’un utilisateur puisse mettre autant de mots-clés qu’il souhaite par expérience dans son CV.
- Vous allez laisser un seul champ pour les mots clés de manière à pouvoir les écrire en les séparant par des espaces.
- Utiliser la function explode($separateur,$text) pour convertir cette liste en un tableau.
- Afficher les mots-clés dans le CV, séparés par des virgules, avec la fonction implode($glue,$arrayMotsCles) qui retourne du texte.
- Si vous rencontrez un bug, afficher le contenu de votre variable avec :
echo print_r($mots_cles)
Voici la correction :
Dans le fichier formMonCV.html
<html>
<head><title>Mon CV</title></head>
<body>
<form name="inscription" method="post" action="monCV.php">
Entrez votre : <br />
Nom : <input type="text" name="nom"/> <br />
Prénom : <input type="text" name="prenom"/> <br />
Adresse : <input type="text" name="adresse"/> <br />
Code postal : <input type="text" name="code_postal"/> <br />
Ville : <input type="text" name="ville"/> <br />
Téléphone: <input type="text" name="telephone"/> <br />
Dernière expérience professionnelle : <br />
Date de début (aaaa-mm-jj) : <input type="text" name="date_debut"/> <br />
Toujours en poste : <input type ="checkbox" name="poste_actuel" >
ou Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin"/> <br />
Poste : <input type="text" name="poste"/> <br />
Employeur : <input type="text" name="societe"/> <br />
Description : <br /><textarea name="description" cols="50" rows="5"></textarea> <br />
<!-- On modifie juste cette ligne -->
Mots-clés : <input type="text" name="mots_cles"/> <br />
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>
Dans le fichier monCV.php
<html>
<head><title>Mon CV</title></head>
<body>
<?php
echo 'Vos données entrées : '.'<br />';
if(isset($_POST['valider'])){
foreach($_POST as $index=>$valeur){
if ($index!='valider'){
echo '- '.$index.' : '.$valeur.'<br />';
}
}
}
//Initialisation des variables
if(isset($_POST['valider'])){
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = $_POST['adresse'];
$code_postal = $_POST['code_postal'];
$ville = $_POST['ville'];
$telephone = $_POST['telephone'];
$date_debut = $_POST['date_debut'];
$date_fin = $_POST['date_fin'];
$poste = $_POST['poste'];
$societe = $_POST['societe'];
$description = $_POST['description'];
$mots_cles = explode(' ', $_POST['mots_cles']); //<===== découpe la liste des mots clés
$poste_actuel = $_POST['poste_actuel'] == 'on';
}
//affichage
?>
<b><?php echo $nom.' '.$prenom; ?></b><br />
<b><?php echo $adresse; ?></b><br />
<b><?php echo $code_postal.' '.$ville; ?></b><br />
Tel : <b><?php echo $telephone; ?></b><br>
Expériences : <br />
<?php
if ($poste_actuel == true){
echo '<b>Depuis le '.$date_debut.'</b>';
}else{
echo '<b>Du '.$date_debut.' au '.$date_fin.'</b>';
}
?>
: <?php echo '<b>'.$poste.' ('.$societe.')</b>' ?><br />
<?php echo '<b>'.nl2br($description).'</b><br />' ?>
<!-- Affiche la liste des mots clés -->
Mots clés : <b><?php
//print_r($mots_cles);
echo implode(', ',$mots_cles); ?></b><br />
</body>
</html>
Gestion d'un formulaire dynamique
modifierOn veut qu’un utilisateur puisse indiquer autant d’expériences qu’il le souhaite
Il faut que PHP enregistre, dans des tableaux, les données de toutes les expériences envoyées par un formulaire.
- Ajoutez [] (crochet ouvert puis crochet fermé, sans espace) à la fin du nom de tous les champs qui concernent une expérience dans le formulaire. PHP créera ainsi un tableau poste, date_debut, etc.
- Recopiez dans ces champs votre formulaire pour permettre à l’utilisateur d’écrire trois expériences.
- Dans un fichier fonctions.php, fabriquer la fonction afficheExperience($arrayExperience,$index) pour afficher une expérience.
- Utiliser cette fonction pour afficher le CV.
Voici la correction :
Dans le fichier formMonCV.html :
<html>
<head><title>Mon CV</title></head>
<body>
<form name="inscription" method="post" action="monCV.php">
Entrez votre : <br />
Nom : <input type="text" name="nom"/> <br />
Prénom : <input type="text" name="prenom"/> <br />
Adresse : <input type="text" name="adresse"/> <br />
Code postal : <input type="text" name="code_postal"/> <br />
Ville : <input type="text" name="ville"/> <br />
Téléphone: <input type="text" name="telephone"/> <br />
Dernière expérience professionnelle : <br />
Date de début (aaaa-mm-jj) :
<input type="text" name="date_debut[]"/> <br />
Toujours en poste : <input type ="checkbox" name="poste_actuel[0]" >
ou Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />
Poste : <input type="text" name="poste[]"/> <br />
Employeur : <input type="text" name="societe[]"/> <br />
Description : <br />
<textarea name="description[]" cols="50" rows="5"></textarea> <br />
Mots-clés : <input type="text" name="mots_cles[]"/> <br />
Date de début (aaaa-mm-jj) :
<input type="text" name="date_debut[]"/> <br />
Toujours en poste : <input type ="checkbox" name="poste_actuel[1]" >
ou Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />
Poste : <input type="text" name="poste[]"/> <br />
Employeur : <input type="text" name="societe[]"/> <br />
Description : <br />
<textarea name="description[]" cols="50" rows="5"></textarea> <br />
Mots-clés : <input type="text" name="mots_cles[]"/> <br />
Date de début (aaaa-mm-jj) :
<input type="text" name="date_debut[]"/> <br />
Toujours en poste : <input type ="checkbox" name="poste_actuel[2]" >
ou Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />
Poste : <input type="text" name="poste[]"/> <br />
Employeur : <input type="text" name="societe[]"/> <br />
Description : <br />
<textarea name="description[]" cols="50" rows="5"></textarea> <br />
Mots-clés : <input type="text" name="mots_cles[]"/> <br />
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>
Dans le fichier monCV.php
<html>
<head><title>Mon CV</title></head>
<body>
<?php
include('functions.php');
//Initialisation des variables
if(isset($_POST['valider'])){
$nom = $_POST['nom'];
$prenom = $_POST['prenom'];
$adresse = $_POST['adresse'];
$code_postal = $_POST['code_postal'];
$ville = $_POST['ville'];
$telephone = $_POST['telephone'];
$arrayExperiences = array();
$arrayExperiences['date_debut'] = $_POST['date_debut'];
$arrayExperiences['date_fin'] = $_POST['date_fin'];
$arrayExperiences['poste'] = $_POST['poste'];
$arrayExperiences['societe'] = $_POST['societe'];
$arrayExperiences['description'] = $_POST['description'];
$arrayExperiences['mots_cles'] = $_POST['mots_cles'];
$arrayExperiences['poste_actuel'] = $_POST['poste_actuel'];
}
//affichage
?>
<b><?php echo $nom.' '.$prenom; ?></b><br />
<b><?php echo $adresse; ?></b><br />
<b><?php echo $code_postal.' '.$ville; ?></b><br />
Tel : <b><?php echo $telephone; ?></b><br>
Expériences : <br />
<hr/>
<?php
//print_r($arrayExperiences);
afficheExperiences($arrayExperiences);
?>
</body>
</html>
Et voici le nouveau fichier functions.php :
<?php
function afficheExperiences($arrayExperiences){
//Crée le tableau où chaque ligne sera une expérience
$nbExperience = count($arrayExperiences['poste']);
$newArray = array();
for($i = 0; $i < $nbExperience; $i++){
$newExperience = array();
foreach($arrayExperiences as $index=>$subarray){
if ($index!='valider'){
$newExperience[$index] = $subarray[$i];
}
}
$newArray[] = $newExperience;
}
//Affiche les expériences
foreach ($newArray as $experience){
afficheExperience($experience);
}
}
function afficheExperience($arrayExperience){
//print_r($arrayExperience);
if ($arrayExperience['poste_actuel'] == 'on'){
echo '<b>Depuis le '.$arrayExperience['date_debut'].'</b>';
}else{
echo '<b>Du '.$arrayExperience['date_debut'].' au '.$arrayExperience['date_fin'].'</b>';
}
echo ' : ';
echo '<b>'.$arrayExperience['poste'].' ('.$arrayExperience['societe'].')</b><br />';
echo '<b>'.nl2br($arrayExperience['description']).'</b><br />';
echo 'Mots clés : <b>'. implode(', ',explode(' ',$arrayExperience['mots_cles'])) .'</b><br />';
}
Création du formulaire dynamique
modifierMaintenant qu’on peut afficher n expériences dans un CV, on va faire en sorte que le fichier HTML puisse, à la demande de l’utilisateur, rajouter des expériences.
Insérer dans la page du formulaire le code suivant avant l’élément body :
<script type="text/javascript">
var nb_experience = 0;
function AjouteExperience() {
if(! document.getElementById && document.createElement) { return; }
var divExperiences = document.getElementById("experiences");
var nouvelleExperience = document.createElement("div");
nb_experience++;
nouvelleExperience.innerHTML = '<b>Expérience ' + nb_experience + ' : </b><br /> \
Date de début (aaaa-mm-jj) : <input type="text" name="date_debut[]"/> <br />\
Toujours en poste : <input type ="checkbox" name="poste_actuel[' + (nb_experience - 1) + ']" >ou \
Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />\
Poste : <input type="text" name="poste[]"/> <br />\
Employeur : <input type="text" name="societe[]"/> <br />\
Description : <br /><textarea name="description[]" cols="50" rows="5"></textarea> <br /> \
Mots-clés : <input type="text" name="mots_cles[]"/> <br />';
divExperiences.appendChild(nouvelleExperience);
} // function AjouteExperience()
</script>
Pour indiquer la zone "où insérer les champs pour décrire son expérience et le bouton insérer", on remplace les précédents champs de texte par le code suivant :
Expériences professionnelles : <br />
<input type="button" value="Ajouter une expérience" onClick="AjouteExperience();" />
Voici à quoi ressemble maintenant le fichier formMonCV.html :
<html>
<head><title>Mon CV</title></head>
<script type="text/javascript">
var nb_experience = 0;
function AjouteExperience() {
if(! document.getElementById && document.createElement) { return; }
var divExperiences = document.getElementById("experiences");
var nouvelleExperience = document.createElement("div");
nb_experience++;
nouvelleExperience.innerHTML = '<b>Expérience ' + nb_experience + ' : </b><br /> \
Date de début (aaaa-mm-jj) : <input type="text" name="date_debut[]"/> <br />\
Toujours en poste : <input type ="checkbox" name="poste_actuel[' + (nb_experience - 1) + ']" >ou \
Date de fin (aaaa-mm-jj) : <input type="text" name="date_fin[]"/> <br />\
Poste : <input type="text" name="poste[]"/> <br />\
Employeur : <input type="text" name="societe[]"/> <br />\
Description : <br /><textarea name="description[]" cols="50" rows="5"></textarea> <br /> \
Mots-clés : <input type="text" name="mots_cles[]"/> <br />';
divExperiences.appendChild(nouvelleExperience);
} // function AjouteExperience()
</script>
<body>
<form name="inscription" method="post" action="monCV.php">
Entrez votre : <br />
Nom : <input type="text" name="nom"/> <br />
Prénom : <input type="text" name="prenom"/> <br />
Adresse : <input type="text" name="adresse"/> <br />
Code postal : <input type="text" name="code_postal"/> <br />
Ville : <input type="text" name="ville"/> <br />
Téléphone: <input type="text" name="telephone"/> <br />
Expériences professionnelles : <br />
<input type="button" value="Ajouter une expérience" onClick="AjouteExperience();" />
<input type="submit" name="valider" value="OK"/>
</form>
</body>
</html>