IV. PHP ETAPE 4▲
Vous avez un formulaire qui propose des saisies au client (client au sens informatique du mot, par opposition à serveur). Disons une dizaine.
Vous vous en souvenez, cela créera une dizaine de variables $_POST['nom_de_l_input'].
Il se trouve que PHP range automatiquement ces variables dans un tableau. Nous y reviendrons à la fin de cette étape.
Commençons par voir ce qu'est un tableau :
IV-1. Les tableaux simples▲
Un tableau, c'est un moyen de stocker plusieurs variables, selon un plan qui vous paraît logique.
C'est comparable à un meuble avec ses tiroirs.
Dans le tiroir 0, (oui, le tableau commence par le tiroir zéro), vous rangez la variable lundi par exemple, dans le tiroir 1, vous rangez la variable mardi etc.
En informatique, on appelle index ou indice le numéro de tiroir (la position de la variable dans le tableau), et valeur la valeur de la variable entreposée.
Voici la syntaxe d'un tableau tout simple
<?php
$semaine
=
array
('lundi'
,
'mardi'
,
'mercredi'
,
'jeudi'
,
'vendredi'
,
'samedi'
,
'dimanche'
);
?>
Par cette simple ligne, vous venez de construire un tableau (qui vous le remarquerez, est une variable en lui même puisqu'il commence par $, mais une variable complexe, organisée).
$semaine est le nom du tableau entier.
Vous lui avez affecté des valeurs, (via la commande array, il sait que c'est un tableau).
Et ici, par défaut, l'index commence à 0, donc dimanche aura pour index... 6 et non 7.
Une fois construit ce tableau, comment convoquer une valeur ?
$semaine[2] sera...mercredi et ainsi de suite... selon la règle : $semaine[index]
Vous pouvez le vérifier en tapant la commande suivante :
<?php
echo $semaine
[
2
];
?>
Bien sûr ici, nous avons construit un tableau contenant des variables string (les jours de la semaine) et des indices numériques (0,1,2 etc...).
On peut tout-à-fait ranger des valeurs numériques dans un tableau.
Ainsi ce tableau qui stocke quelques années marquantes de l'histoire de France...
<?php
$dates
=
array
(1789
,
1830
,
1848
,
1851
,
1871
,
1914
,
1918
,
1936
,
1939
,
1945
,
1958
,
1968
);
echo $dates
[
3
];
?>
La commande echo renverra... 1851 ici.
IV-2. Les commentaires▲
Au sein de votre code, il est bon de poser parfois quelques commentaires, quelques lignes d'explication qui ne seront bien entendu pas considérées par la machine comme des lignes de programmation à exécuter mais des lignes qu'elle pourra zapper, et qui ne sont destinées qu'au programmeur, qui remet le nez dans son programme parfois dix ans après et ne sait plus pourquoi ou comment il a conçu son code.
Parfois, c'est une autre personne qui hérite du programme. Dans tous les cas, il faut donc commenter son code.
- Petit commentaire sur une seule ligne // en début de ligne
- Commentaire sur plusieurs lignes /* au début et */ en dernier...
<?php
/*
TOUS LES TABLEAUX
TOUTES LES DATES
TOUS LES PAYS
*/
//tableau dates marquantes en France
$datesF
=
array
(1789
,
1830
,
1848
,
1851
,
1871
,
1914
,
1918
,
1936
,
1939
,
1945
,
1958
,
1968
);
//tableau dates marquantes aux Etats-unis
$datesUS
=
array
(1861
,
1865
,
1917
,
1918
,
1929
,
1934
,
1941
,
1945
,
1959
,
1975
);
?>
PS : à partir de maintenant dans ce tuto, les commentaires me permettront également d'insérer mes commentaires didactiques directement dans mon code...
C'est-y-pas plus facile ?
IV-3. Les tableaux associatifs▲
Ici, la seule différence, par rapport à un tableau simple, c'est que l'index n'est plus numérique, mais lui-même une variable string :
Par exemple, votre tableau veut stocker une adresse.
Sachant que chaque adresse comporte en gros et dans cet ordre, un nom, un prénom, un numéro, une rue, un code postal et une ville...
On peut construire le tableau suivant :
<?php
//On signale que notre variable $adresse4 sera un tableau
$adresse4
=
array
();
//on le remplit
$adresse4
[
'nom'
]=
'DUPONT'
;
$adresse4
[
'prenom'
]=
'Mickaël'
;
$adresse4
[
'num'
]
=
12
;
$adresse4
[
'rue'
]
=
'rue des églantines'
;
$adresse4
[
'cp'
]
=
93000
;
$adresse4
[
'ville'
]
=
'SAINT-DENIS'
;
?>
'num' est ici un index du tableau adresse. 12 est la valeur stockée à l'index 'num'.
<?php
//Pour convoquer 12
echo $adresse4
[
'num'
];
?>
Bien entendu, l'intérêt d'un tableau d'adresses, c'est d'en stocker plus d'une !
Alors nous procèderons... à un tableau de tableaux, un tableau imbriqué en fait...
Nous venons de voir que $adresse4 est un tableau.
<?php
//construction de mon tableau $agenda
$agenda
=
array
($adresse0
,
$adresse1
,
$adresse2
,
$adresse3
,
$adresse4
);
?>
Je procède ensuite en deux étapes :
<?php
//récupérer l'adresse totale de Mickaël
$adresseMick
=
$agenda
[
4
];
/*
En effet, l'adresse de Mickaël se trouve dans notre agenda à l'index 4 (l'index numérique construit automatiquement)...
*/
//Récupérer enfin le nom de famille de Mickaël
echo $adresseMick
[
'nom'
];
?>
Compris ? Allez, même si ça pique un peu la tête, signalons au passage que l'on aurait pu retrouver le nom de Mickaël dans ce tableau de tableaux par la syntaxe suivante, plus condensée :
<?php
echo $agenda
[
4
][
'nom'
];
?>
IV-4. La boucle foreach▲
Bien sûr, l'idéal pour parcourir les valeurs d'un tableau, c'est une boucle.
La boucle foreach (pour chaque élément) présente l'avantage de parcourir la totalité d'un tableau, même si l'on n'a aucune idée du nombre d'éléments qu'il contient.
Reprenons notre tableau des jours de la semaine, comment le parcourir ?
<?php
//construction du tableau semaine
$semaine
=
array
('lundi'
,
'mardi'
,
'mercredi'
,
'jeudi'
,
'vendredi'
,
'samedi'
,
'dimanche'
);
//parcours du tableau
foreach
($semaine
as
$jour
){
echo'- '
.
$jour
.
'<br/>'
;
}
/*
Pour chaque valeur du tableau $semaine, compose la variable $jour et affiche le jour puis va à la ligne...
*/
?>
Copiez, collez maintenant le gros morceau de code qui suit, dont nous avons vu l'essentiel tout à l'heure, la construction à la main d'un agenda d'adresses :
<
html>
<
head><title>
Mon agenda<
/title
></head
>
<
body>
<?php
$adresse0
=
array
();
//on le remplit
$adresse0
[
'nom'
]=
'ZERO'
;
$adresse0
[
'prenom'
]=
'Toto'
;
$adresse0
[
'num'
]
=
10
;
$adresse0
[
'rue'
]
=
'rue des rosiers'
;
$adresse0
[
'cp'
]
=
94000
;
$adresse0
[
'ville'
]
=
'IVRY-SUR-SEINE'
;
$adresse1
=
array
();
//on le remplit
$adresse1
[
'nom'
]=
'AIN'
;
$adresse1
[
'prenom'
]=
'Anne'
;
$adresse1
[
'num'
]
=
11
;
$adresse1
[
'rue'
]
=
'rue des moineaux'
;
$adresse1
[
'cp'
]
=
57000
;
$adresse1
[
'ville'
]
=
'METZ'
;
$adresse2
=
array
();
//on le remplit
$adresse2
[
'nom'
]=
'DEUX'
;
$adresse2
[
'prenom'
]=
'Al'
;
$adresse2
[
'num'
]
=
2
;
$adresse2
[
'rue'
]
=
'rue des arbres'
;
$adresse2
[
'cp'
]
=
88000
;
$adresse2
[
'ville'
]
=
'EPINAL'
;
$adresse3
=
array
();
//on le remplit
$adresse3
[
'nom'
]=
'TROIS'
;
$adresse3
[
'prenom'
]=
'Léa'
;
$adresse3
[
'num'
]
=
3
;
$adresse3
[
'rue'
]
=
'rue des éléphants'
;
$adresse3
[
'cp'
]
=
69000
;
$adresse3
[
'ville'
]
=
'LYON'
;
$adresse4
=
array
();
//on le remplit
$adresse4
[
'nom'
]=
'DUPONT'
;
$adresse4
[
'prenom'
]=
'Mick'
;
$adresse4
[
'num'
]
=
4
;
$adresse4
[
'rue'
]
=
'rue des églantines'
;
$adresse4
[
'cp'
]
=
93000
;
$adresse4
[
'ville'
]
=
'SAINT-DENIS'
;
//on déclare et remplit l'agenda avec toutes les adresses précédentes :
$agenda
=
array
($adresse0
,
$adresse1
,
$adresse2
,
$adresse3
,
$adresse4
);
?>
<
/body
>
<
/html
>
Ceux qui ont suivi le devinent, qui dit tableau de tableaux dit... boucles imbriquées pour la lecture du tableau :
<?php
//pour chaque élément de $agenda crée la variable $adresse
foreach
($agenda
as
$adresse
){
//pour chaque élément de $adresse crée la variable $element
foreach
($adresse
as
$element
){
//écris le $element sur la même ligne avec un tiret et des espaces
echo '- '
.
$element
.
' '
;
}
//A chaque nouveau $adresse, saute une ligne
echo'<br/>'
;
}
?>
Et voici notre agenda qui s'affiche de façon assez lisible...
Bien, nous arrivons maintenant au coeur de notre problème, et nous revenons à notre formulaire :
Comment récupérer des variables $_POST, résultats d'un formulaire de saisie, quand elles sont nombreuses ?
IV-5. Boucle foreach et variables POST▲
PHP construit automatiquement un tableau associatif dès que l'on soumet un formulaire.
Ce tableau se nomme $_POST, chaque élément a pour index le 'name' d'un élément du formulaire, et chaque valeur, la valeur entrée par l'utilisateur dans chaque champ avant de cliquer sur le bouton 'submit'.
On peut donc égrener tranquillement notre tableau de variables POST de cette façon :
<?php
/*pour chaque élement du tableau $_POST,
récupère et affecte la valeur de l'index,
puis récupère et affecte la valeur associée à cet index*/
foreach
($_POST
as
$index
=>
$valeur
){
echo '- '
.
$valeur
.
'<br/>'
;
}
?>
Pour vous en convaincre, reprenons le formulaire sur l'IMC, (correction du TP3) et voyons ce que cette boucle produit :
<
html>
<
head><title>
Votre IMC<
/title
></head
>
<
body>
<
h1>
Déterminez votre IMC et sachez quelle est votre corpulence d'un point de vue médical<
/h1
>
<
h2>
Entrez les données suivantes <
/h2
>
<
form name
=
"
formulaire
"
method
=
"
post
"
action
=
"
tableau.php
"
>
Entrez votre prénom : <
input type
=
"
text
"
name
=
"
prenom
"
/
>
<
br/
>
Entrez votre taille (sous la forme 1.70) : <
input type
=
"
text
"
name
=
"
taille
"
/
>
<
br/
>
Entrez votre poids (en kilos) : <
input type
=
"
text
"
name
=
"
poids
"
/
>
<
br/
>
<
input type
=
"
submit
"
name
=
"
valider
"
value
=
"
OK
"
/
>
<
/form
>
<?php
echo'Vos données entrées : '
.
'<br/>'
;
if
(isset($_POST
[
'valider'
]
)){
foreach
($_POST
as
$index
=>
$valeur
){
echo '- '
.
$index
.
' : '
.
$valeur
.
'<br/>'
;
}
}
?>
<
/body
>
<
/html
>
Ce petit bout de code ne fait qu'afficher la valeur des variables que le client vient d'entrer plus la valeur (permanente) de valider qui est 'ok'...
IV-6. TP4▲
Sur le fichier tp4.php, offrez via un formulaire la saisie du nom, du prénom, de l'âge, de la ville et de l'activité.
Quand l'utilisateur clique sur le bouton valider, il voit apparaître en dessous du même formulaire le message suivant :
'Vous venez de saisir :' puis à la ligne à chaque fois un tiret son nom, un tiret son prénom etc...
Comme d'habitude sans copier... De mémoire seulement...
Par ailleurs, on ne veut pas voir 'ok' dans la liste de ce que l'on vient de saisir...
IV-7. Correction du TP4▲
Veuillez cliquer sur le symbole à droite pour découvrir la solution quand vous aurez fini.