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 :

Explication de code


Sujet :

Langage PHP

  1. #1
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut Explication de code
    Bonjour,

    j'étudie cet exemple de la FAQ

    Je ne comprends pas ou plutôt ne vois pas l'intérêt du deuxieme if contenant ctype_digit ?

    Merci de m'expliquer

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    Si ça peut te rassurer, en effet il y a quelques incohérences dans ce script de la FAQ.

    Sinon si c'est "pourquoi ctype_digit ?" :
    Une donnée externe à un script (cookie, get/post, db, fichier) est toujours typée en String. Ce qui fait que si tu veux vérifier que tu as bien un entier, is_int() ne fonctionnera pas.
    De même is_numeric() ne fait pas la différence entre un entier ou un décimal, il n'est donc pas fiable.
    ctype_digit() est la fonction la plus adaptée pour déterminer qu'une chaine est bien constituée uniquement de chiffres, donc un entier.

  3. #3
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Merci de ta réponse.

    Oui, je connais ctype_digit mais dans le cas présent, j'aurais sauté ce bloc d'instructions ou alors commencé par quelque chose comme ca non ?

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if( isset($_SESSION['id_aleatoire']) && ctype_digit($_SESSION['id_aleatoire']) && $_SESSION['id_aleatoire'] === $_COOKIE['id_aleatoire'])
     ....

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    C'est justement une des incohérences que j'ai relevé dans le script de la FAQ.

    On commence par tester $_SESSION['id_aleatoire'] avec ctype_digit() et quelques lignes plus loin, on vérifie qu'il existe... C'est pas logique

    Pour ton test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( isset($_SESSION['id_aleatoire']) && ctype_digit($_SESSION['id_aleatoire']) && $_SESSION['id_aleatoire'] === $_COOKIE['id_aleatoire'])
    - isset($_SESSION['id_aleatoire']), OK
    C'est utile de vérifier que l'index existe.

    - ctype_digit($_SESSION['id_aleatoire']) , KO !
    Problème majeur. $_SESSION est un tableau sérialisé/désérialisé. Les variables qui sont passées en session gardent leur type (a contrario des variables GET/POST, etc. cf. mon post précédent). ctype_digit() n'accepte que des chaînes (j'avais pas fait gaffe à ça dans mon post précédent) et renverra false si tu lui passes un int.

    - $_SESSION['id_aleatoire'] === $_COOKIE['id_aleatoire']), KO !
    Le test strict ne peut pas fonctionner. $_SESSION['id_aleatoire'] est un int, $_COOKIE['id_aleatoire']) est un string.
    Il faut se limiter au test ==

    Accessoirement tu n'as pas testé que $_COOKIE['id_aleatoire']) existait.
    À la limite on est pas obligé de rajouter un isset. On peut se contenter de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['id_aleatoire'] == @$_COOKIE['id_aleatoire']
    si $_COOKIE['id_aleatoire'] n'existe pas, l'expression équivaudra à $_SESSION['id_aleatoire'] == null, ce qui ne devrait jamais être le cas
    (méfiance quand même, il est peut-être préférable que l'id_aléatoire ne puisse jamais être égal à 0, je suis pas sûr)

    En espérant ne pas m'être embrouillé en cours d'explication...

    HTH

  5. #5
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Citation Envoyé par Petibidon Voir le message
    - ctype_digit($_SESSION['id_aleatoire']) , KO !
    Problème majeur. $_SESSION est un tableau sérialisé/désérialisé. Les variables qui sont passées en session gardent leur type (a contrario des variables GET/POST, etc. cf. mon post précédent). ctype_digit() n'accepte que des chaînes (j'avais pas fait gaffe à ça dans mon post précédent) et renverra false si tu lui passes un int.

    Jolie explication je savais pas cela

    Mis à part que ce script est pas très bien codé, la méthode de gestion d'id identique dans $_COOKIE et $_SESSION te parait elle fiable comme méthode ? Je compte utiliser une méthode similaire pour un site

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    625
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 625
    Par défaut
    A priori c'est fiable comme méthode. A moins que ton navigateur refuse les cookies.

    Sinon tu peux aussi passer ton jeton en GET, mais
    1) c'est chiant à programmer
    2) ça interdit l'utilisation des boutons back/forward du navigateur

    Je sais pas trop ce qu'il en est avec les cookies concernant le n°2

  7. #7
    Membre Expert Avatar de Madfrix
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 326
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 326
    Par défaut
    Ok merci j'essaierai alors.
    De toute manière ce sera toujours mieux que rien

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Explication de code
    Par sacco dans le forum C
    Réponses: 2
    Dernier message: 12/04/2006, 23h13
  2. Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 1
    Dernier message: 20/03/2006, 09h58
  3. Shell - Explication de code
    Par claralavraie dans le forum Linux
    Réponses: 13
    Dernier message: 13/01/2006, 16h03
  4. Explication de code - RE
    Par deedoo dans le forum Général Python
    Réponses: 23
    Dernier message: 29/07/2005, 14h00
  5. Explication de code simple
    Par Clad3 dans le forum OpenGL
    Réponses: 3
    Dernier message: 20/03/2005, 11h31

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