Pour mieux comprendre comment fonctionne PHP, nous allons mettre en place un petit exercice, juste avant d’attaquer la dernière partie qui est la base de données (toujours dans le cadre de cette rubrique « éclairage » du blog.

Imaginons que dans le cadre d’un site Web, nous ayons besoin de calculer l’âge d’une personne.

Pour cela, nous avons deux possibilités :

  1. On calcule l’âge « côté client », c’est-à-dire via le navigateur de l’internaute avec le langage Javascript.
  2. On utilisera le langage côté serveur, dans le cadre de l’ouverture d’une session utilisateur par exemple (« Nous vous souhaitons un joyeux anniversaire », ou « Pour vous 40 ans, voici une offre spéciale »). Et surtout, on utilisera le langage côté serveur… parce que c’est le cours d’aujourd’hui ^^ !

Création d’un formulaire

Créons dans notre précèdent dossier « premier-site », le fichier « calcul-age.php ».

On va bien évidemment commencer par lui proposer d’entrer sa date de naissance par un banal formulaire HTML. On pourra le personnaliser avec toutes sortes de fantaisies, ou plus efficacement faire apparaître un calendrier lors du clic dans le champs date. ; mais faisons simple : jour, mois et année de naissance (JJ / MM/ AAAA).

Nous utiliserons la BOUCLE FOR pour ne pas devoir bêtement saisir tous les nombres possibles (trop fastidieux !).
Le principe de la boucle FOR fonctionne ainsi : pour un nombre donné, ajouter 1 à lui-même jusqu’à ce qu’on rencontre la limite (sinon on tomberait dans une boucle infinie !).

Je vous laisse le soin de lire le détail du script à travers les commentaires.

<H1>Merci d'indiquer votre date de naissance : </H1>

<form action="calcul-age.php" method="post">

<select name="jour">

<?php

// On fabrique une boucle qui va créer le nombre de jour
// L'occasion d'utiliser la boucle FOR
for( $i = 1; $i <= 31; $i++ )  {
echo '<option value="'. $i .'">'. $i .'</option>';
}

?>

</select> /
<select name="mois">

<?php

$moisEnLettres = array(1 => 'janvier', 'février', 'mars', 'avril', 'mai', 'juin', 'juillet', 'août', 'septembre', 'octobre', 'novembre', 'décembre');

// On fabrique une boucle qui va créer le nombre de jour
// L'occasion d'utilisier la boucle FOR
for( $i = 1; $i <= 12; $i++ ) {
echo '<option value="'. $i .'">'. $moisEnLettres[$i] .'</option>';
}

?>

</select> /
<select name="annee">

<?php

// On fabrique une boucle qui va créer le nombre de jour
// L'occasion d'utilisier la boucle FOR

$anneeMoinsUn = date('Y') - 1;

for( $i=$anneeMoinsUn; $i >= 1900; $i-- )
{
echo '<option value="'. $i .'">'. $i .'</option>';
}

?>

</select>

<input type="submit" value="Calculer" />

</form>

Ce qui donnera :

formulaire calcul age en PHP et HTML

Traitement du formulaire

Lorsque que l’internaute va cliquer sur « Valider » ou « Enregistrer », notre programme PHP lui donnera son âge grâce aux instructions que nous allons lui apprendre.

Nous avons donc trois informations (en espérant qu’elles soient vraies) : le jour, le mois et l’année de naissance. Ce qui est certain que la quatrième donnée est fiable : la date du jour (encore qu’elle soit relative, mais c’est une autre histoire ^^).

On peut obtenir la date de jour de plusieurs façons en PHP,  comme obtenir la date du genre JJ/MM/AAAA ou la date en nombre de secondes écoulées depuis le 1er janvier 1970 (ce nombre s’appelle le TimeStamp Unix).
Mais cette dernière façon de faire n’est pas pratique pour les gens nés avant 1970. Dommage, car il aurait fallu simplement convertir la date de naissance en Timestamp. Bon en même temps, comme on ne demande pas les minutes et les secondes de sa date de naissance (hé hé !), on va faire à la louche et partir du principe que la personne est née à minuit 🙂

Notre programme reste donc ultra simple : année actuelle moins l’année de naissance.

Mais, il faut prendre en compte le mois et le jour. Donc, SI la date de naissance se situe AVANT le jour et le mois actuels, elle n’est pas concernée par l’année en cours (la soustraction ci-dessus ne s’applique pas, il faut l’adapter).

La fonction

La bonne pratique est de placer un code qui traitera une tâche précise dans une fonction. En effet, il faut partir du principe que tout code doit être réutilisable sur l’ensemble d’un projet.
C’est le principe de la PROGRAMMATION ORIENTÉE OBJET. Mais pour le moment faisons simple ^^

Voici d’abord la fonction réutilisable :

<?php

function calculAge( $jour, $mois, $annee ) {

// La variable temps désignera si on parle d'année, de mois ou de jour
// Par défaut, elle est réglée sur "année", mais sera remplacée si elle rencontre une nouvelle valeur
$temps = 'an';

if( $mois <= date( 'm' ) && $jour <=  date( 'd' )) {

$age = date( 'Y' ) - $annee;

} else {

$age = date( 'Y' ) - $annee - 1;

}

// Pluriel si nécessaire
$pluriel = ( $age > 1 ) ? 's' : NULL;

return $age .' '. $temps . $pluriel;
}

?>

Le traitement en temps réel

Puis le code qui va traiter l’action :

<?php

if($_POST['annee']) {

extract($_POST);  // on transforme les variables du tableau POST en variables individuelles

// Les variables JOUR et MOIS auront toujours 2 chiffres (ex: 01 au lieu de 1)
$jour = sprintf( "%02d", $jour );
$mois = str_pad($mois, 2, 0, STR_PAD_LEFT); // méthode alternative

// On affiche le calcul

echo '<p>Né(e) le '. $jour.'/'. $mois .'/'. $annee .', vous êtes âgé(e) de '. calculAge( $jour, $mois, $annee ) . ' ! </p>';

}

?>

Alors, vous allez sans doute penser « on aurait pu faire beaucoup mieux ! ». Bien entendu, il ne s’agit que d’un tout petit exercice pour comprendre la façon de raisonner (poser un algorithme) et de l’écrire.

Faites l’essai :

  1. Entrez une date inférieure à la date d’aujourd’hui
  2. Puis postérieure ou égale à la date d’aujourd’hui

L’âge sera correctement calculé… C’est ce qu’on voulait.

Le formulaire reviendra à sa position initiale. Pas terrible… On pourra soit demander à PHP qu’il positionne les éléments SELECT sur la date demandée par l’internaute, soit, utiliser de l’AJAX.

L’AJAX sera la meilleure façon de procéder : la page ne chargera que le résultat (sans toucher au formulaire), grâce à la combinaison de Javascript et de PHP.

Car oui, il est possible de créer un « partenariat » entre 2 langages : Javascript envoie la requête au serveur via PHP (sans que la page entière ne soit rechargée), PHP fait le calcul et envoie à son tour le résultat à Javascript qui l’affiche dans une zone de la page.

Javascript aurait pu faire ça tout seul ? Bien évidemment ! Mais mieux vaut un exemple simple pour aller plus loin par la suite.