On crée un tableau associatif
<?php $users = [ 'jc'=>['name'=>'Jean-Claude','rang'=>1], 'd'=>['name'=>'David','rang'=>2], 's'=>['name'=>'Sandrine','rang'=>3], ]; ?>
On vérifie le tableau avec la fonction print_r()
<?php echo '<pre>'; print_r($users); echo '</pre>'; ?>
Array
( // clé
[jc] => Array
(// Étiquette valeur
[name] => Jean-Claude
[rang] => 1
)
[d] => Array
(
[name] => David
[rang] => 2
)
[s] => Array
(
[name] => Sandrine
[rang] => 3
)
)
Nous avons bien un tableau associatif composé de 3 clés textuelles [jc] , [d] , [s]
Si je veux afficher la valeur 'Jean-Claude', je dois atteindre :
<?php echo $users['jc']['name']; ?>
Jean-Claude
On pourrait stocker la clé dans une variable :
<?php $userId = 'd'; echo $users[$userId]['name'] . ' est au rang ' . $users[$userId]['rang']; ?>
David est au rang 2
Affichons tout le tableau associatif $users avec une boucle foreach()
<?php $users = [ 'jc'=>['name'=>'Jean-Claude','rang'=>1], 'd'=>['name'=>'David','rang'=>2], 's'=>['name'=>'Sandrine','rang'=>3], ]; echo '<ul>'; // la clé associé à la valeur // prend la clé de chaque élément avec toutes les valeurs qu'elle contient foreach($users as $user_cle => $user_elem) { echo '<li><a href="?user=' . $user_cle . '">' . $user_elem['name'] . '</a></li>'; } echo '</ul>'; ?>
Détail :
Au premier passage de boucle :
$user_cle contient : 'jc'
$user_elem contient : 'name'⇒'Jean-Claude' + 'rang'⇒1
Au deuxième passage de boucle :
$user_cle contient : 'd'
$user_elem contient : 'name'⇒'David','rang'⇒2
Au troisième passage de boucle :
$user_cle contient : 's'
$user_elem contient : 'name'⇒'Sandrine','rang'⇒3
Normalement un href est composé d'une partie lien et d'une partie étiquette (le clic) et en html s'écrit de cette façon :
le lien le clic <a href="http://www.mdr.ovh">Le site Free Infos</a>
Exercice en classe
On va utiliser une variable d'URL ?user=la_clé.
On créera un URL qui permettra d'envoyer les couples clé | valeur transmis en paramètre.
La première variable d'une URL est toujours précédée du symbole ? alors que les autres seront précédées du symbole &.
Syntaxe :
si on veut plusieurs valeurs il faudra alors utiliser le & comme ceci :
La limite est de 256 caractères.
Il est préférable de remplacer le & par & dans le code lorsqu'il faut passer des & en valeur car lors de la validation w3C le code ne passera pas.
<?php // var d'URL = clé partie cliquable echo '<li><a href="?user=' . $user_cle . '">' . $user_elem['name'] . '</a></li>'; ?>
Comme on peut le remarquer nous venons de créer une variable d'URL ?user .
La variable d'URL prendra comme valeur la clé de l'élément du tableau $users et aura comme étiquette la valeur comprise dans l'élément 'name' visible
• Jean-Claude • David • Sandrine
En fait dans cet exemple la variable ?user= ne fait que prendre la valeur de la clé dans le tableau $users et elle est balancée par l'URL.
Le site s'appelle monsite.com et la page PHP intitulée est bonjour.php
L'URL a former sera donc monsite.com/bonjour.php pour y accéder.
Si je veux envoyer des infos à travers la barre d'URL il faut que je procède de la sorte :
“monsite.com/bonjour.php?nom=Dupont&prenom=Jean“
nom = Nom du paramètre 1 ou la clé
Dupont = Valeur du paramètre 1
prenom = Nom du paramètre 2 ou la clé
Jean = Valeur du paramètre 2
Le point d’interrogation ? sépare le nom de la page PHP des paramètres. L'esperluette & sépare le couple nom paramètre, valeur paramètre
“monsite.com/bonjour.php?nom=Dupont&prenom=Jean“
| URL | Séparateur | PARAMETRES(couples clé + valeur ) |
|---|---|---|
| monsite.com/bonjour.php? | ? | nom=Dupont&prenom=Jean |
On pourrait très bien envoyer les paramètres à travers la barre d'URL, les récupérer avec $_GET[ ] puis ensuite les ré-envoyer, etc …
Rien de plus facile!
On prend par exemple deux pages PHP, une la page source index.php qui va contenir le lien (donc envoyer les données) et la page cible (qui va recevoir les données) bonjour.php
Sur la page index.php on ajoute le lien suivant qui contiendra (la cible + deux paramètres):
<a href="bonjour.php?nom=Dupont&prenom=Jean">Dis-moi bonjour !</a>
On fait du Ping-Pong ! J'envoie, tu récupère, puis tu renvois et puis je récupère …
On envoi les données par :
En PHP on fait souvent du Ping-Pong, c'est à dire que l'on utilise une page source pour envoyer des données ici index.php et on utilisera une autre page cible bonjour.php pour réceptionner les données envoyées sous forme de variables d'URL si elle sont envoyées par la barre d'URL.
Donc notre page cible bonjour.php va contenir un array associatif (tableau spéciale) GET_[ ] qui va nous permettre de stocker les couples (clé valeur) envoyées par la page source index.php.
Qu'est ce qu'il se passe ?
J'envoie la clé dans la barre d'URL et celle-ci est récupéré dans un array spécial (tableau spécial) appelé $_GET[ ].
$_GET[ ] est un tableaux prédéfini qui contient toute les variables envoyées par une page précédente via l'URL, ce qui inclut les variables de formulaire envoyées par method=“get”.
Si je veux connaître quelle est la valeur de la clé lorsque je clic sur un un des liens de la liste renvoyé par la boucle foreach()
Exercice en classe
<?php print_r($_GET['user']); ?>
dans la barre d'URL j'aurai : renvoie jc si clic sur Jean-Claude get.php?user=jc renvoie d si clic sur David get.php?user=d renvoie c si clic sur Sandrine get.php?user=s
Pour en revenir avec l'envoi de la page source index.php contenant le lien monsite.com/bonjour.php?nom=Dupont&prenom=Jean.
Donc on récupéra les données comme ceci :
| Nom | Valeur |
|---|---|
| $_GET['nom'] | Dupont |
| $_GET['prenom'] | Jean |
Ensuite on pourra s'en servir de la sorte :
<p>Bonjour <?php echo $_GET['prenom']; ?> !</p>
ou encore :
<p>Bonjour <?php echo $_GET['prenom'] . ' ' . $_GET['nom']; ?> !</p>
Attention : un visiteur peut très bien supprimer, modifier tout ce qu'il y a dans la barre d'URL.
Par exemple un visiteur peut très bien tenter d’accéder à : localhost/tests/bonjour.php
Exemple notre URL de base localhost/tests/bonjour.php?non=Dupont&prenom=Jean que l'on essaie de transformer en localhost/tests/bonjour.php?non=Dupont&prenom=Marc !
Cela signifie que l'on ne peut JAMAIS faire confiance aux données que l'on reçoit !!
Si par exemple un visiteur viens à supprimer tous les paramètres de l'URL de la page cible.
Qu'est ce qu'il se passe ?
Pour résoudre ce problème il existe la fonction isset().
Exercice en classe
La fonction isset() permet de contrôler si la variable existe bien, dans notre cas 'user'.
isset() renvoie true ou false.
Si isset() trouve il renverra 1 sinon il ne renverra rien.
Toujours en utilisant notre tableau $users vérifions si le nom des paramètres reçus existent bien.
<?php echo isset($_GET['user']); ?>
affiche 1
<?php echo isset($_GET['uuuser']); ?>
n'affiche rien
On va utiliser la fonction isset() pour tester si une variable quel qu’elle soit existe bien !
if (isset($_GET['prenom']) AND isset($_GET['nom'])) // On a le nom et le prénom { echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !'; } else // Il manque des paramètres, on avertit le visiteur { echo 'Il faut renseigner un nom et un prénom !'; }
Attention : Il est particulièrement important de gérer ce cas concernant la vérification des variables reçues !
On va ajouter dans notre code le nombre de fois que le message doit être répété avec un nouveau paramètre repeter en fin de ligne.
<?php if (isset($_GET['prenom']) AND isset($_GET['nom']) AND isset($_GET['repeter'])) { for ($i = 0 ; $i < $_GET['repeter'] ; $i++) { echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !<br />'; } } else { echo 'Il faut renseigner un nom, un prénom et un nombre de répétitions !'; } ?>
Attention : Si une personne s'amuse à trafiquer l'URL et mettre repeter=9999999999, la machine va alors afficher autant de fois le message et consommer énormément de ressource !
Comment empêcher que l'on trafiquer l'URL en lui mettant une valeur de repeter=9999999999 ???
En étant prévoyant et anticiper différent cas :
Solution le transtypage :
Vérifier que repeter contient bien un nombre en utilisant (int), ce qui va forcer la conversion de la variable en type entier (int);
$_GET['repeter'] = (int) $_GET['repeter'];
Il faut lire le code de droite à gauche, le (int) est en fait ce qui va servir de tuyau de conversion car tout ce qui transite à travers va ressortir en une valeur de type int (entier).
Si la valeur de repeter:
Après avoir exécuté cette instruction, la variable $_GET['repeter'] contient maintenant forcément un nombre entier. Il ne reste plus qu'à vérifier que ce nombre est bien compris entre 1 et 100 à l'aide d'une condition (ce que vous savez faire, normalement !).
if (isset($_GET['prenom']) AND isset($_GET['nom']) AND isset($_GET['repeter'])) { // 1 : On force la conversion en nombre entier $_GET['repeter'] = (int) $_GET['repeter']; // 2 : Le nombre doit être compris entre 1 et 100 if ($_GET['repeter'] >= 1 AND $_GET['repeter'] <= 100) { for ($i = 0 ; $i < $_GET['repeter'] ; $i++) { echo 'Bonjour ' . $_GET['prenom'] . ' ' . $_GET['nom'] . ' !<br />'; } } } else { echo 'Il faut renseigner un nom, un prénom et un nombre de répétitions !'; }
Une URL représente l'adresse d'une page web.
Lorsqu'on fait un lien vers une page, il est possible d'ajouter des paramètres sous la forme bonjour.php?nom=Dupont&prenom=Jean qui seront transmis à la page.
Paramètres = couple clé + valeur
La page bonjour.php dans l'exemple précédent recevra ces paramètres dans un array nommé $_GET[ ] :
Cette technique est très pratique pour transmettre des valeurs à une page, mais il faut prendre garde au fait que le visiteur peut les modifier très facilement.
Il ne faut donc pas faire aveuglément confiance à ces informations, et tester prudemment leur valeur avant de les utiliser.
La fonction isset() permet de vérifier si une variable est définie ou non.
Le transtypage est une technique qui permet de convertir une variable dans le type de données souhaité.
Cela permet de s'assurer par exemple qu'une variable est bien un int (nombre entier).
<?php \\création du tableau associatif $users = [ 'jc'=>['name'=>'Jean-Claude','rang'=>1], 'd'=>['name'=>'David','rang'=>2], 's'=>['name'=>'Sandrine','rang'=>3], ]; // boucle <fc #ff00ff>**foreach()**</fc> echo '<ul>'; foreach ($users as $user_cle => $user_elem) // atteint la clé et toute les éléments et leur valeurs { // crée une variable d'URL echo '<li><a href="?user='. $user_cle . '">'.$user_elem['name'].'</a>'. ' la clé vaut ' . $user_cle . ' et l\'étiquette vaut ' . $user_elem['name'].'</li>'; } echo '</ul>'; // vérifie si user es-xiste bien if(isset($_GET ['user']) && array_key_exists($_GET ['user'],$users)){ $givenId = $_GET['user']; stock la clé dans la variable $givenId echo 'Bonjour '. $users[$givenId]['name'] . ' assit au rang n° ' . $users[$givenId]['rang']; // sans passer par une variable $user } ?>