IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Avantages de cet algo


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut Avantages de cet algo
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if(isset($_GET['id'])){
      $id =(int)$_GET['id'];
      unset($_GET['id']);
      //Suite du code avec $id
      ...
    }
    A quoi peut vraiment servir ce bout de code ? Pourquoi détruire $_GET['id'] et pour le reste du code bosser avec $id ?

    Merci d'avance...

  2. #2
    Expert éminent
    Avatar de transgohan
    Homme Profil pro
    Développeur Temps réel Embarqué
    Inscrit en
    Janvier 2011
    Messages
    3 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Temps réel Embarqué

    Informations forums :
    Inscription : Janvier 2011
    Messages : 3 146
    Points : 9 387
    Points
    9 387
    Par défaut
    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.

  3. #3
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Ya quand même plus simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(isset($_GET['id']))
        $_GET['id'] = intval($_GET['id']);
    comme çà quelque-soit le code qui utilise la variable passée en paramètre elle est bien nettoyée. De plus cela permet de conserver un fonctionnement normal d'application sans se casser la tête.

  4. #4
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $id = isset($_GET['id']) && is_numeric($_GET['id']) ? intval($_GET['id']) : 0;

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Bjr,
    Pour les données provenant d'un formulaire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $id =$_POST['var'];
    unset($_POST['var']);
    Ceci ne résoudrait pas le problème de rafraichissement d'une page recevant les données d'un formulaire ?

  6. #6
    Expert éminent
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Points : 7 762
    Points
    7 762
    Par défaut
    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.

  7. #7
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Salut

    Ceci ne résoudrait pas le problème de rafraichissement d'une page recevant les données d'un formulaire ?
    Théoriquement non.
    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.

  8. #8
    Membre expert
    Avatar de ThomasR
    Homme Profil pro
    Directeur technique
    Inscrit en
    Décembre 2007
    Messages
    2 230
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2007
    Messages : 2 230
    Points : 3 972
    Points
    3 972
    Par défaut
    Ceci ne résoudrait pas le problème de rafraichissement d'une page recevant les données d'un formulaire ?
    Non car le navigateur va exécuter la requête HTTP précédente, et pas à partir de la réponse HTTP.

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    if (isset($_POST['valider']))
     
    {
    // traitement du formulaire
     
    header('Location: '.$_SERVER['PHP_SELF']); //redirection vers la page en cours
    }

  10. #10
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par ABCIWEB
    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
    Pour le rafraichissement, d'accord, mais si l'internaute reviens petit à petit en arrière via l'historique (page précédente), il reviendra à un moment au même formulaire, donc quelque part le soumettre une 2ème fois.
    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.

  11. #11
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    mais si l'internaute reviens petit à petit en arrière via l'historique (page précédente), il reviendra à un moment au même formulaire
    Je n'ai pas fais le test mais dans ton historique de navigation, tu devrais n'avoir que le formulaire et la page de destination de la redirection, pas l'etape de traitement.
    donc si tu fais précedent, tu reviendras sur le formulaire et il faudra cliquer explicitement sur valider pour avoir une double insertion.

  12. #12
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Pour le rafraichissement, d'accord, mais si l'internaute reviens petit à petit en arrière via l'historique (page précédente), il reviendra à un moment au même formulaire, donc quelque part le soumettre une 2ème fois.
    ...
    Donc quelque part un header() ne serait pas vraiment l'arme absolue du problème assez courant de la double insertion en Bdd.
    Essayes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    <?php
    if (isset($_POST['valider']))
    {
    header('Location: '.$_SERVER['PHP_SELF']);
    }
    ?>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <title>Document sans titre</title>
    </head>
     
    <body>
    <form method="post" action = "#">
    <input type = "text" name= "nom" />
    <input type = "submit" name = "valider" value= "valider" />
    </form>
    <a href="index.php">index</a>
    </body>
    </html>
    envoies le formulaire puis balade toi sur le lien index.php, reviens en arrière autant de fois que tu veux, ou rafraichis le formulaire, mais bon moi jamais le navigateur ne me propose de re soumettre le formulaire

  13. #13
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Citation Envoyé par sabotage
    donc si tu fais précedent, tu reviendras sur le formulaire et il faudra cliquer explicitement sur valider pour avoir une double insertion.
    Et bien justement, observe des gens plutôt novices coté Web, et bien ils ne comprennent pas vraiment ce que le message indique (soit revalider le formulaire), et il y 1 chance sur 2 qu'ils cliquent sur "Oui" ou "Non".
    Donc une chance sur 2 que ça refasse le même traitement.

    C'est à mon sens beaucoup courant qu'on ne le croit.

  14. #14
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    Et bien justement, observe des gens plutôt novices coté Web, et bien ils ne comprennent pas vraiment ce que le message indique (soit revalider le formulaire), et il y 1 chance sur 2 qu'ils cliquent sur "Oui" ou "Non".
    Donc une chance sur 2 que ça refasse le même traitement.

    C'est à mon sens beaucoup courant qu'on ne le croit.
    Nan... il n'y aura pas de message, essayes le code plus haut et dit moi dans quelles conditions le navigateur t'envoies un message ? Moi je n'en vois jamais.

  15. #15
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    mais bon moi jamais le navigateur ne me propose de re soumettre le formulaire
    Je fais aussi comme ça (un header) absolument partout pour les formulaire (et plus même), ça fonctionne plutôt bien, effectivement.

    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.

  16. #16
    Membre émérite
    Avatar de Eric2a
    Homme Profil pro
    Technicien
    Inscrit en
    Septembre 2005
    Messages
    1 225
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Corse (Corse)

    Informations professionnelles :
    Activité : Technicien

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 225
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Pareil car la fonction header redirige et les données (POST dans l'exemple) ne sont plus passées.

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 389
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 389
    Points : 10 422
    Points
    10 422
    Par défaut
    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

  18. #18
    Membre confirmé
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2006
    Messages
    985
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2006
    Messages : 985
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par RunCodePhp Voir le message
    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.
    Quelles genres de précautions preniez-vous ?

  19. #19
    Membre expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Points : 3 947
    Points
    3 947
    Par défaut
    Quelles genres de précautions preniez-vous ?
    Je ne vais pas pouvoir te les énumérer comme ça, de plus, il n'y a rien d'extraordinaire.

    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.

Discussions similaires

  1. Aide sur complexité de cet algo
    Par laureat dans le forum Débuter
    Réponses: 4
    Dernier message: 18/09/2009, 13h33
  2. Que me renvoie cet algo Kruskal?
    Par arnoctambule dans le forum Général Java
    Réponses: 2
    Dernier message: 17/01/2008, 14h46
  3. Votre avis sur cet algo tres simple
    Par JoloKossovar dans le forum Général Java
    Réponses: 3
    Dernier message: 10/01/2008, 18h13
  4. cet algo ma rendu folle, aidez moi svp
    Par sarah_angel dans le forum Algorithmes et structures de données
    Réponses: 2
    Dernier message: 06/11/2007, 22h35
  5. Corriger cet Algo et trier les éléments du tableau en ordre décroissant
    Par PIMPMAX dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 07/01/2007, 19h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo