Bonjour Artotec,
Je ne comprends pas fort bien ce que votre exemple vient faire dans l'histoire.
Afin d'être sûr que nous parlions le même langage, reprenons les bases.
Il existe divers types de variables, c'est vrai en PHP mais aussi dans d'autres langages:
- les
booléens : true/false (traduits parfois par 0/1)
- les
integer : nombres entiers
- les
float : nombres à virgule
- les
string : chaînes de caractère
- les
array : tableaux
etc
Les
données transmises par un formulaire ne peuvent l'être que via 2 méthodes:
-
POST : transmission via les cookies ; invisible aux yeux de l'utilisateur (sauf s'il fouille dans son navigateur)
-
GET : transmission via l'url (directement sous les yeux de l'utilisateur).
Quelque soit la méthode utilisée,
le formulaire envoi toujours des données de type string (ou un tableau contenant lui même des valeurs de type
string ; cas des checkbox et boutons radio).
Du côté de la réception des données, de quels éléments devons-nous tenir compte ?
D'abord de la méthode de transmission des données. Ainsi pour la méthode POST on fera nos checks sur la variable globale
$_POST et bien évidemment on s'adressera à
$_GET pour les autres.
Par contre, quelque soit notre volonté, on obtient des données de type
string (important !).
La première chose à faire est de vérifier de l'existence de la données attendue ; dans le sujet qui nous occupe on vérifiera donc que
$_GET['id'] existe.
La deuxième sera de sécuriser cette donnée au cas où "un petit malin" tentera une injection indésirable ou tout simplement au cas où la donnée serait corrompue (intentionnellement ou non). Pour ce faire Php embarque plusieurs fonctions de vérification comme par exemple
htmlentities() (pour en savoir plus, rdv sur php.net).
Enfin nous utiliserons des opérateurs de comparaison (supérieur, égale, inférieur etc)afin d'être sûr que la données attendue corresponde à nos attentes.
A noter que dans l'exemple qui suit, les deux lignes reviennent au même:
if ("42" > 10) { echo "YEAH !"; }
/* Si 42 de type string est supérieur à 10, afficher le texte */
if (42 > 10 { echo "YEAH !"; }
/* Si 42 de type entier est supérieur à 10, afficher le texte */
/*
===> Ces deux lignes renverront toutes deux le texte "YEAH !"
*/
Voici pour la théorie.
En pratique, voici ce que succinctement cela peut donner en reprenant notre cas sur l'id transmise par l'url:
/* On déclare la variable dont on aura besoin */
$id = '';
/* On vérifie de l'existence de la donnée transmise et on la sécurise */
if (!empty($_GET['id'])) { $id = htmlentities($_GET['id']); }
/* On vérifie que $id est bien hydratée sinon on redirige le visiteur */
if (empty($id)) { header('locate: page_de_selection.php'); }
/* Maintenant on peut travailler avec la variable $id ET
on n'utilise plus jamais $_GET['id'] ! */
/* Enfin, une fois la connexion vers la base de donnée établie,
on s'assurera que $id existe dans la table avant de poursuivre l'affichage et le traitement */
Voilà à peu de choses près comment je procède et je me suis aperçu que beaucoup faisaient pareil ; il doit bien il y avoir une raison, non ?
A parte: bien évidement je ne remets en cause le fait de faire un
cast de la valeur et si vous êtes plus à l'aise ainsi, pourquoi pas. Néanmoins je trouve que cette méthode n'est pas exempt de défaut alors que de la façon que je vous ai décris, le développeur à un meilleur contrôle sur la donnée reçue et son traitement. Et puis je dois l'avouer, je préfère (n'est-ce pas suffisant comme motif ?
)
Note: Il va de soit que pour l'exemple je m'en suis tenu à une version des plus simplistes et que nombre de vérification, fonctions de la situation, peuvent-être implémentées afin de rendre le code plus robuste et le traitement plus sûr.
2nd note: Les chrétiens ont la Bible, les musulmans le Coran, Fidel Castro les cigares [...] nous, nous avons
PHP.NET
Maintenant que nous avons bien revus les bases et que nous nous sommes bien perdus en tergiversation, il serait temps de refaire un point sur la situation. Précisez à nouveau votre problème et re-postez votre code dans son état actuel (en tenant compte tout de même de mes remarques
). A nous tous on devrait bien arriver à résoudre votre chmilblik
Modifié par Greg_Lumiere (18 Apr 2018 - 08:51)