|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Membre éclairé
![]() Gérard OkonoDéveloppeur Web Inscription : juillet 2006 Messages : 707 ![]() |
Code :
Merci d'avance... |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Baptiste ROUSSELÉtudiant Inscription : janvier 2011 Messages : 802 ![]() |
Il est vrai qu'à part être sûr que la valeur ne pourra être réutilisé sans être épurée et testée il n'y a aucun intérêt.
Mais c'est tout de même un très bon point que d'interdire d'utiliser une variable brute. |
|
|
00
|
|
|
#3 | ||
![]() ![]() Thomas RambaudDéveloppeur Web Inscription : décembre 2007 Messages : 2 140 ![]() |
Ya quand même plus simple :
Code :
|
||
|
00
|
|
|
#4 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Comme l'a dit transgohan on évite d'utiliser directement des variables externes comme $_GET, $_POST, $_COOKIE, puisque celles-ci peuvent être définies directement pas l'utilisateur.
Dans ton exemple $_GET['id'] est transtypé en entier, et donc "id" sera nécessairement un entier. On peut faire aussi comme dit ThomasR, chacun fait suivant ses préférences et suivant ses besoins, mais l'important est de prendre l'habitude de vérifier ses variables avant de les utiliser. Souvent on profite de l'occasion pour attribuer une valeur par défaut, par exemple Code :
$id = isset($_GET['id']) && is_numeric($_GET['id']) ? intval($_GET['id']) : 0;
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#5 | ||
|
Membre éclairé
![]() Gérard OkonoDéveloppeur Web Inscription : juillet 2006 Messages : 707 ![]() |
Bjr,
Pour les données provenant d'un formulaire Code :
|
||
|
|
01
|
|
|
#6 |
![]() ![]() Benjamin DelespierreDéveloppeur Web Inscription : février 2010 Messages : 2 984 ![]() |
Tant que le formulaire est soumis en HTTP classique (et non pas avec un XHR) le rafraichissement de page se produit car le navigateur fait partir une nouvelle requête POST.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même). Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...". Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug. Les boutons et existent, servez-vous en
|
|
00
|
|
|
#7 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Salut
Citation:
Quand on rafraichi (ou actualise) une page contenant un formulaire, les données sont à nouveaux transmises, donc ensuite à nouveau récupérées par le serveur et le même code sera alors exécuté. Ce que ThomasR à suggéré me semble plus judicieux : filtrer la donnée plutôt que la détruire. Ceci dit, quand on regarde comment procède certains FrameWork, ils procèdent en gros de la même manière que tu fais. En gros ils stockent les données GET/POST entre autre dans un Objet, les filtre par la même occasion. Les tableaux $_GET $_POST sont détruits/vidés, et c'est via l'Objet dédié qu'il faut exploiter coté application. Ce n'est pas tous les FrameWork qui le font, mais n'empêche ça se fait.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
01
|
|
|
#8 | |
![]() ![]() Thomas RambaudDéveloppeur Web Inscription : décembre 2007 Messages : 2 140 ![]() |
Citation:
|
|
|
00
|
|
|
#9 | ||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Si l'on te t'a pas parlé de unset($_GET['id']); c'est que cela devait être spécifique au code que tu as pris en exemple : ce n'est pas une manière générique de faire.
On peut effacer cette variable si l'on en as plus besoin (comme toutes les autres variables), mais il est peu fréquent (sauf nécessité spécifique) d'avoir besoin le faire. Pour éviter de re soumettre un formulaire au rafraichissement de la page, tu peux rediriger vers la même page (ou une autre) avec un header Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
||
|
|
00
|
|
|
#10 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Citation:
Voir même 3, 4 fois qui sait pour peu qu'il soit dyslexique. ![]() D'ailleurs, et quand j'observe des personnes pas très initiées, j'ai plutôt tendance à remarquer que l'action de retour en arrière (et plusieurs, genre history -2, -3) serait bien plus utilisée que le rafraichissement de la page. Donc quelque part un header() ne serait pas vraiment l'arme absolue du problème assez courant de la double insertion en Bdd.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
01
|
|
|
#11 | |
![]() ![]() Vincent Inscription : juillet 2005 Messages : 14 929 ![]() |
Citation:
donc si tu fais précedent, tu reviendras sur le formulaire et il faudra cliquer explicitement sur valider pour avoir une double insertion. |
|
|
|
00
|
|
|
#12 | |||
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
Code :
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|||
|
|
00
|
|
|
#13 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Citation:
Donc une chance sur 2 que ça refasse le même traitement. C'est à mon sens beaucoup courant qu'on ne le croit.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
01
|
|
|
#14 | |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Citation:
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
|
00
|
|
|
#15 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Citation:
Mais il me semble qu'il y a quand même des cas où un risque persiste. Difficile de re-tester tout ça vu que de mon coté je prends pas mal de précautions pour justement éviter ces risques de double insertions.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
01
|
|
|
#16 |
|
Membre Expert
![]() Eric GaridacciInscription : septembre 2005 Messages : 1 057 ![]() |
Salut,
Pareil car la fonction header redirige et les données (POST dans l'exemple) ne sont plus passées.
__________________
N'oubliez pas le vote des messages utiles ainsi que le Tag [Résolu].Mon Site Web : Corse - Actualité, Météo, Vidéos, Logiciels, ... |
|
|
00
|
|
|
#17 |
|
Membre Expert
![]() Inscription : septembre 2010 Messages : 1 242 ![]() |
Ben oui, donc jusqu'à preuve du contraire (que je n'ai jamais constatée), il semble bien que la redirection après un post soit l'arme absolue pour éviter les messages du navigateur en cas de rafraichissement ou utilisation des boutons de navigation du navigateur
__________________
- Réalisations - Interface graphique : génération en javascript d'objets défilants, texte et/ou images, mode horizontal ou vertical. |
|
|
00
|
|
|
#18 |
|
Membre éclairé
![]() Gérard OkonoDéveloppeur Web Inscription : juillet 2006 Messages : 707 ![]() |
|
|
|
00
|
|
|
#19 | |
|
Expert Confirmé
![]() Inscription : janvier 2010 Messages : 2 709 ![]() |
Citation:
Une précaution, ça veut dire de faire une (voir plusieurs) vérifications. Cas typique : Vérifier qu'un login et mot de passe n'existe pas avant de faire l'insertion en est une, et tout le monde la connait. Donc vérifier en 1er que quelque chose n'existerait pas déjà fait partie du BABA s'il est spécifier qu'il ne doit pas en avoir 2. Après, ça, et pour le reste, on peu s'appuyer sur des ajouts de données dans des champs cachés pour vérifier celle saisie et celle dans le champ caché. Si c'est la même chose, on ne poursuit pas. On peu s'appuyer sur les session, cookie, etc, etc ... Encore une fois, rien d'extraordinaire, tout ça tu connais déjà j'en suis certain. Faut juste les exploiter si le besoin le demande. Et encore, je n'exploite pas tout ce qui est possible dans ce domaine, car il y a l'intégrité référentielle, de même que les transaction. J'ai pas d'autre choix que d'utiliser MyISAM comme moteur MySQL (et non InnoDB). C'est d'ailleurs en grande partie à cause de ça que ça oblige de le faire "à la mano". En tout cas, ce que je voulais dire c'est que un header() n'est vraiment pas l'arme absolue, car selon des cas, selon la manière dont on effectue certaine opération, on ne peut justement pas faire de header(), donc le risque persiste. Je pense particulièrement à l'Ajax qui sans précaution favorise grandement le risque d'incohérences. Faire une vérif reste la manière la plus fiable. De plus, quand bien même qu'on ait pris soin de mettre un header(), rien n'empêche de revenir au formulaire précédent, qui plus est on aura pris soin de le pré-remplir, et hop, l'utilisateur valide instinctivement. Là encore sans précaution ça débouche sur un doublon. Petite parenthèse tout de même. J'évoque seulement des doublons, qui sous entendent uniquement insertion. Mais les risques sont quasi les même pour les 3 opérations : insertion, mise à jours et suppression.
__________________
Win XP | WampServer 2.2d | Apache 2.2.21 | Php 5.3.10 | MySQL 5.5.20 Si debugger, c'est supprimer des bugs, alors programmer ne peut être que les ajouter [Edsger Dijkstra] |
|
|
|
00
|
Copyright © 2000-2012 - www.developpez.com