Table des matières
Transmettre des données avec l'URL
1. Rappel tableau
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 :
- le nom du tableau qui est $users
- la clé textuelle de l’élément qui est ['jc']
- l'étiquette 'name' à laquelle on aura associer la valeur 'Jean-Claude'
<?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
2. Rappel boucle foreach()
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>
3. Envoyer des paramètres grâce à la variable d'URL
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 :
- ? début d'une variable d'URL
- user nom du paramètre 1
- jc valeur du paramètre 1
si on veut plusieurs valeurs il faudra alors utiliser le & comme ceci :
- ?user = jc & nom = Jean-claude & position = rang
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.
Envoi des paramètres dans 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 …
Créer un lien pour envoyer des paramètres
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):
- la page cible - bonjour.php
- le paramètre nom et sa valeur Dupont (clé | valeur)
- le paramètre prénom et sa valeur Jean (clé | valeur)
<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 …
Plusieurs façons d’envoyer des données en PHP
On envoi les données par :
- la barre d'URL et on récupère avec $_GET[ ]
- avec un formulaire en utilisant la méthode method=“get” ensuite on récupère avec $_GET[ ]
- avec un formulaire en utilisant la méthode method=“post” ensuite on récupère avec $_POST[ ]
4. Récupérer les paramètres en PHP
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>
5. Ne pas faire confiance aux données reçues !
Attention : un visiteur peut très bien supprimer, modifier tout ce qu'il y a dans la barre d'URL.
Tous les visiteurs peuvent trafiquer les 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 !!
Tester la présence d'un paramètre
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 ?
- la page cible arrive avec aucun paramètres (clé | valeur)
- un message d'erreur “Undefined index” du serveur est envoyé car il ne trouve pas d'index (de clé) car elle n'existe pas
Pour résoudre ce problème il existe la fonction isset().
Vérifier si les paramètres existe avec 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 !'; }
- le code teste si les variables $_GET['nom'] et $_GET['prenom'] existent bien
- si elles existent toute les deux, il affiche le message echo avec les valeurs concaténées
- si il manque une des deux, il affiche le message 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 !
Contrôler la valeurs des paramètres
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 !'; } ?>
- on teste le paramètre repeter si il existe avec $_GET['repeter']
- on utilise sa valeur qui est 8 pour boucler 8 fois
- cela va afficher 8 fois Bonjour Jean Dupont !
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 !
Empêcher de trafiquer repeter
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 :
- Cas ou le nombre ou le nombre n'est pas une valeur raisonnable
- on peut dire que si on dépasse 100 fois, c'est trop, et il faut refuser d'exécuter la page
- de même que si je demande de répéter « $-4$ fois » ? Ca ne peut pas être autorisé, il faut absolument que ce soit au moins égal à 1
- Cas ou la valeur n'est pas logique, la valeur de repeter est remplacée par du texte
- repeter=coucou, cela ne devrait pas être autorisé car on a besoin d'un nombre entier positif et pas du texte
- repeter=true, cela ne devrait pas être autorisé car on a besoin d'un nombre entier positif et pas un booléen
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:
- est de 14, elle ne sera pas modifiée !
- est du texte comme coucou, alors la valeur sera 0 !
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 !'; }
6. Résumé
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[ ] :
- $_GET['nom'] aura pour valeur « Dupont » ;
- $_GET['prenom'] aura pour valeur « Jean ».
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).
Exercice dire bonjour complet
<?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 } ?>


