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 :

mauvaise utilisation d'une variable de session


Sujet :

Langage PHP

  1. #1
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut mauvaise utilisation d'une variable de session
    Bonjour,

    au départ, je pensais à un titre de discussion "bug de variable de session", ce qui aurait été plus accrocheur, mais m'aurait attiré des foudres, vu que le problème est certainement du à mon code et non à la variable de session...

    Bref, dans ma page initiale, j'affiche une liste d'erreurs et l'utilisateur a la possibilité d'afficher davantage de détails en cliquant sur un bouton "details" (et de ce fait, aller sur un fichier Details.php). Comme ces détails sont élaborés dans la page initiale et qu'il faut les transmettre au fichier Details.php, comme les détails sont dans une variable de type array, je les transmets via une variable de session. A priori, dans cette variable, j'y mets les données relatives à l'erreur sélectionnée, mais en fait, quelque soit cette erreur, dans la variable de session, on y trouve systématiquement les données relatives à la dernière erreur. Il y a donc vraisemblablement un bug chez moi, mais je ne le trouve pas. Merci pour l'aide.

    Page initiale :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
      $nb_line = 0;
        foreach($result as  $errorname => $line) {
            echo $errorname;
            echo '<br/><br/>';
            echo "line:",$nb_line++."<br/>";
            var_dump($line);echo '<br/><br/>';
            $_SESSION['result'] = $line;
            ?>
     
    <a href = "?action=Details&debug=false" target="_blank"> (details) </a> <br/>
     
    <?php
     
        }

    Details.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class Details
    {
        public function invoke(array $data = [])
        {
            $result = $_SESSION['result'];
     
            foreach($result as $one_result)
                echo $one_result['appliname']." ".$one_result['sesaid']."<br/>";
     
            echo '<br/>';
            ?>
            <a href="#" onclick="window.close()">Close the windows</a>
        <?php
        }
    }
    Le var_dump de la ligne 6 de la page initiale montre que les données sont correctes avant transmission ; par contre, une fois dans le fichier Details.php, la variable de session, copiée dans la variable $result contient systématiquement les données relatives à la dernière erreur. Pourquoi ?

    NB : le lien <a href = "?action=Details... va en fait sur le fichier index.php et le routeur placé dans ce fichier va appeler la méthode invokedu fichier Details.php.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  2. #2
    Membre expert Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2012
    Messages
    1 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 1 928
    Points : 3 694
    Points
    3 694
    Par défaut
    Bonjour
    Citation Envoyé par laurentSc Voir le message
    mais en fait, quelque soit cette erreur, dans la variable de session, on y trouve systématiquement les données relatives à la dernière erreur.
    C'est normal parce que tu n'enregistre que la dérnière erreur avec cette ligne $_SESSION['result'] = $line;.

    il faudrait ajouter des crochets vides afin de stocker toutes les erreurs dans le tableau $_SESSION["result"] : $_SESSION['result'][] = $line;

  3. #3
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    Ca me permet certes de récupérer mes données mais en faisant ça, au lieu une fois dans Details.php de récupérer uniquement les données relatives à l'erreur sélectionnée, je récupère un tableau de 5 lignes : les 2 premières contiennent les données relatives à la dernière erreur, et les 3 suivantes, 3 tableaux contenant les données relatives à toutes les erreurs (au nombre de 3 dans mon cas). C'est obligatoire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  4. #4
    Membre expert Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2012
    Messages
    1 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 1 928
    Points : 3 694
    Points
    3 694
    Par défaut
    La question que tu dois te poser est : est ce que tu as besoin de générer 5 liens de détails d'erreurs ou bien seulement 1.

    Si tu veux quand même garder les 5 liens, et que les paramètres ?action=Details&debug=false sont exploitables dans la méthode invoke de la class Details, pourquoi ne pas ajouter un 3éme paramètre indiquant l'index de l'erreur "?action=Details&debug=false&indexError=<?=$nb_line?>" puis dans la class Details, tu n'as qu'à sélectionner l'erreur en fonction du paramètre indexError.

    Remarque : avec cette méthode, tu dois incrémenter la variable $nb_line APRES la géneration du lien.

  5. #5
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    Je viens de comprendre pourquoi dans la variable de session, je récupère les données relatives à la dernière erreur : à chaque boucle du foreach, je la mets à jour, donc forcément, elle contient les données relatives à la dernière erreur. Mais je ne vois pas comment faire pour qu'elle ne contienne que les données relatives à l'erreur sélectionnée. Tu as une idée ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  6. #6
    Membre expert Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    janvier 2012
    Messages
    1 928
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : janvier 2012
    Messages : 1 928
    Points : 3 694
    Points
    3 694
    Par défaut
    C'est ce que j'ai essayé de t'expliquer dans mon dernier post, non?

  7. #7
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 715
    Points : 2 457
    Points
    2 457
    Par défaut
    Hello,

    Effectivement, c'est ce que @Toufik83 expliquait dans sa première réponse
    D'ailleurs, je rejoins son avis de construire un array d'erreurs et chaque lien passerait l'index de l'erreur en paramètre, un peu comme on le ferait avec un ID et une base de données.

    C'est plus lisible, plus facile à débugger et moins de données à "retravailler" (ce qui évite les erreurs)

  8. #8
    Membre éclairé Avatar de jreaux62
    Homme Profil pro
    Webmaster
    Inscrit en
    juin 2021
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juin 2021
    Messages : 461
    Points : 878
    Points
    878
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    Je viens de comprendre...
    Laurent comprend vite, mais il faut lui expliquer longtemps...

    Bon, j'avais la même solution que Toufik83 et darkstar123456.

    Sachant que :
    • on parle de "details", le nom "result" n'est pas approprié.
    • l'index sera plus simplement $errorname (ce qui permettra aussi de le réafficher dans le "détail")



    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    <?php
    	$nb_line = 0;
    	foreach($result as  $errorname => $line)
    	{
            echo $errorname;
            echo '<br/><br/>';
            echo "line:",$nb_line++."<br/>";
            var_dump($line);echo '<br/><br/>';
     
            $_SESSION['details'][$errorname] = $line;
    ?>
    	<a href = "?action=Details&amp;error=<?= $errorname; ?>&amp;debug=false" target="_blank"> (details) </a> <br/>
    <?php
    	}

    Il faut alors ajouter un paramètre $error à la fonction d'affichage des "détails".

  9. #9
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jreaux62 Voir le message
    Laurent comprend vite, mais il faut lui expliquer longtemps...
    Le problème, c'est que j'ai la mémoire tellement courte que à la fin de l'explication, j'ai déjà oublié le début . Le pire, c'est qu'il y a un peu de vrai là-dedans...

    Revenons aux choses sérieuses.
    J'ai pris en compte vos suggestions :

    page initiale (DisplayErrors.php) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     $nb_line = 0;
        foreach($list_errors as  $errorname => $line) {
            echo $errorname;
            echo '<br/><br/>';
            echo "line:",$nb_line."<br/>";
            var_dump($line);echo '<br/><br/>';
            $_SESSION['details'][] = $nb_line++;
            ?>
     
    <a href = "?action=Details&debug=false&error=<?= $errorname; ?>" target="_blank"> (details) </a> <br/>
     
    <?php
        }

    Details.php :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class Details
    {
        public function invoke(array $data = [])
        {
            $index = $_GET['error'];
            $details = $_SESSION['details'];
            var_dump($details);
            /*
             * inutile de continuer
             */
    inutile de continuer car dans mon cas : $index vaut is not in a valid format for SESA (SESA12345 or SESA123456) alors que $details vaut
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    array(15) {
      [0]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [1]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [2]=>
      array(2) {
        ["appliname"]=>
        array(8) {
          [0]=>
          string(16) "Active Directory"
          [1]=>
          string(7) "Outlook"
          [2]=>
          string(16) "Active Directory"
          [3]=>
          string(6) "bridge"
          [4]=>
          string(6) "bridge"
          [5]=>
          string(3) "Box"
          [6]=>
          string(6) "bridge"
          [7]=>
          string(7) "Outlook"
        }
        ["sesaid"]=>
        array(8) {
          [0]=>
          string(13) "BMC_WS_CORDYS"
          [1]=>
          string(13) "BMC_WS_CORDYS"
          [2]=>
          string(13) "BMC_WS_CORDYS"
          [3]=>
          string(13) "BMC_WS_CORDYS"
          [4]=>
          string(13) "BMC_WS_CORDYS"
          [5]=>
          string(13) "BMC_WS_CORDYS"
          [6]=>
          string(13) "BMC_WS_CORDYS"
          [7]=>
          string(13) "BMC_WS_CORDYS"
        }
      }
      [3]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [4]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [5]=>
      array(2) {
        ["appliname"]=>
        array(8) {
          [0]=>
          string(16) "Active Directory"
          [1]=>
          string(7) "Outlook"
          [2]=>
          string(16) "Active Directory"
          [3]=>
          string(6) "bridge"
          [4]=>
          string(6) "bridge"
          [5]=>
          string(3) "Box"
          [6]=>
          string(6) "bridge"
          [7]=>
          string(7) "Outlook"
        }
        ["sesaid"]=>
        array(8) {
          [0]=>
          string(13) "BMC_WS_CORDYS"
          [1]=>
          string(13) "BMC_WS_CORDYS"
          [2]=>
          string(13) "BMC_WS_CORDYS"
          [3]=>
          string(13) "BMC_WS_CORDYS"
          [4]=>
          string(13) "BMC_WS_CORDYS"
          [5]=>
          string(13) "BMC_WS_CORDYS"
          [6]=>
          string(13) "BMC_WS_CORDYS"
          [7]=>
          string(13) "BMC_WS_CORDYS"
        }
      }
      [6]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [7]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      [8]=>
      array(2) {
        ["appliname"]=>
        array(8) {
          [0]=>
          string(16) "Active Directory"
          [1]=>
          string(7) "Outlook"
          [2]=>
          string(16) "Active Directory"
          [3]=>
          string(6) "bridge"
          [4]=>
          string(6) "bridge"
          [5]=>
          string(3) "Box"
          [6]=>
          string(6) "bridge"
          [7]=>
          string(7) "Outlook"
        }
        ["sesaid"]=>
        array(8) {
          [0]=>
          string(13) "BMC_WS_CORDYS"
          [1]=>
          string(13) "BMC_WS_CORDYS"
          [2]=>
          string(13) "BMC_WS_CORDYS"
          [3]=>
          string(13) "BMC_WS_CORDYS"
          [4]=>
          string(13) "BMC_WS_CORDYS"
          [5]=>
          string(13) "BMC_WS_CORDYS"
          [6]=>
          string(13) "BMC_WS_CORDYS"
          [7]=>
          string(13) "BMC_WS_CORDYS"
        }
      }
      [9]=>
      int(0)
      [10]=>
      int(1)
      [11]=>
      int(2)
      [12]=>
      int(0)
      [13]=>
      int(1)
      [14]=>
      int(2)
    }
    Donc le souci, c'est qu'on a perdu la clé errorname qui était pourtant présente lors du var_dump ligne 6 de DisplayErrors.php

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    array(3) {
      [" is not in a valid format for SESA (SESA12345 or SESA123456)"]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      ["column country ("")    This cell is empty"]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      ["BMC_WS_CORDYS is not in a valid format for SESA (SESA12345 or SESA123456)"]=>
      array(2) {
        ["appliname"]=>
        array(8) {
          [0]=>
          string(16) "Active Directory"
          [1]=>
          string(7) "Outlook"
          [2]=>
          string(16) "Active Directory"
          [3]=>
          string(6) "bridge"
          [4]=>
          string(6) "bridge"
          [5]=>
          string(3) "Box"
          [6]=>
          string(6) "bridge"
          [7]=>
          string(7) "Outlook"
        }
        ["sesaid"]=>
        array(8) {
          [0]=>
          string(13) "BMC_WS_CORDYS"
          [1]=>
          string(13) "BMC_WS_CORDYS"
          [2]=>
          string(13) "BMC_WS_CORDYS"
          [3]=>
          string(13) "BMC_WS_CORDYS"
          [4]=>
          string(13) "BMC_WS_CORDYS"
          [5]=>
          string(13) "BMC_WS_CORDYS"
          [6]=>
          string(13) "BMC_WS_CORDYS"
          [7]=>
          string(13) "BMC_WS_CORDYS"
        }
      }
    }
    <br/><br/>errors list:<br/> is not in a valid format for SESA (SESA12345 or SESA123456)<br/><br/>line:0<br/>array(2) {
      ["appliname"]=>
      array(1) {
        [0]=>
        string(6) "bridge"
      }
      ["sesaid"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    <br/><br/>
    <a href = "?action=Details&debug=false&error= is not in a valid format for SESA (SESA12345 or SESA123456)" target="_blank"> (details) </a> <br/>
     
    column country ("")    This cell is empty<br/><br/>line:1<br/>array(2) {
      ["appliname"]=>
      array(1) {
        [0]=>
        string(6) "bridge"
      }
      ["sesaid"]=>
      array(1) {
        [0]=>
        string(0) ""
      }
    }
    <br/><br/>
    <a href = "?action=Details&debug=false&error=column country ("")    This cell is empty" target="_blank"> (details) </a> <br/>
     
    BMC_WS_CORDYS is not in a valid format for SESA (SESA12345 or SESA123456)<br/><br/>line:2<br/>array(2) {
      ["appliname"]=>
      array(8) {
        [0]=>
        string(16) "Active Directory"
        [1]=>
        string(7) "Outlook"
        [2]=>
        string(16) "Active Directory"
        [3]=>
        string(6) "bridge"
        [4]=>
        string(6) "bridge"
        [5]=>
        string(3) "Box"
        [6]=>
        string(6) "bridge"
        [7]=>
        string(7) "Outlook"
      }
      ["sesaid"]=>
      array(8) {
        [0]=>
        string(13) "BMC_WS_CORDYS"
        [1]=>
        string(13) "BMC_WS_CORDYS"
        [2]=>
        string(13) "BMC_WS_CORDYS"
        [3]=>
        string(13) "BMC_WS_CORDYS"
        [4]=>
        string(13) "BMC_WS_CORDYS"
        [5]=>
        string(13) "BMC_WS_CORDYS"
        [6]=>
        string(13) "BMC_WS_CORDYS"
        [7]=>
        string(13) "BMC_WS_CORDYS"
      }
    }
    Comment faut-il faire ?
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  10. #10
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 715
    Points : 2 457
    Points
    2 457
    Par défaut
    Bonjour,

    Ca arrive à tout le monde même aux meilleurs :p

    Que vaut $list_errors ?

    Il y'a une perte d'info concernant les index :
    $_SESSION['details'][] = $nb_line++; <=== index de 0 à (n-1)

    <a href = "?action=Details&debug=false&error=<?= $errorname; ?>" Ici, dans le lien, on ne lui donne pas l'index mais $errorname alors qu'on ne sait pas ce qu'il vaut
    Et c'est sûrement de la que vient not in a valid format.

    J'écrirais plutôt ça :

    Code php : 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
    22
    23
    24
    <?php
    $nb_line = 0;
    foreach ($list_errors as $errorname => $line) {
        echo $errorname;
        echo '<br/><br/>';
        echo "line:" . $nb_line . "<br/>";
        var_dump($line);
        echo '<br/><br/>';
        // Ici on va définir comment on sauvegarde notre erreur
        // Pour l'exemple j'ai sauvegardé $errorname mais on pourrait ne pas en tenir compte
        $_SESSION['details'][$nb_line] = [
            'name' => $errorname,
            'line' => $line,
        ];
        // Version simplifiliée sans sauvegarder $errorname :
        // $_SESSION['details'][$nb_line] = $line;
        $nb_line++;
        ?>
     
        <!-- ci dessous, on oublie pas d'utiliser $nb_line au lieu de $errorname -->
        <a href = "?action=Details&debug=false&error=<?= $nb_line; ?>" target="_blank"> (details) </a> <br/>
     
        <?php
    }

  11. #11
    Membre éclairé Avatar de jreaux62
    Homme Profil pro
    Webmaster
    Inscrit en
    juin 2021
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juin 2021
    Messages : 461
    Points : 878
    Points
    878
    Par défaut
    Dans le genre : "Pourquoi faire simple quand on peut faire compliqué ?"...

    Pourquoi ne pas ouvrir simplement un TOOLTIP * ?

    C'est SIMPLE, et on ne change pas - inutilement - de page !

    * TOOLTIP = info-bulle :
    • <div> masqué, en position absolute (ou relative),
    • qu'on affiche "au clic" (ou sur :hover)


    Ex. :
    Code HTML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    foreach ($list_errors as $errorname => $line)
    {
    ?>
    	<div>
    		<?= $errorname; ?> 
    		<div class="a-tooltip" onclick="this.querySelector('div').classList.toggle('show')">
    		  <em>(details)</em>
    		  <div><?= $line; ?></div>
    		</div>
    	</div>
    <?php
    }
    Code css : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    .a-tooltip { 
      position:relative; 
      display:inline;
      cursor:help;
    }
    .a-tooltip > div { 
      position:absolute;
      padding:10px; 
      top:110%; left:0; /* en dessous */
      border:1px solid #ccc;
      Background:#fff;
      min-width:250px;
      display:none; /* on masque */
      }
    .a-tooltip > div.show { display:block; } /* on affiche */

  12. #12
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    Bonsoir,
    j'essaierai de regarder ton code (darkstar123456) demain (si possible).

    Néanmoins, tu me demandes ce que vaut $list_errors. Dans les tests que j'effectue, elle vaut (tableau à 3 dimensions ; 1e dimension = array avec 3 éléments) :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    array(3) {
      [" is not in a valid format for SESA (SESA12345 or SESA123456)"]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      ["column country ("")    This cell is empty"]=>
      array(2) {
        ["appliname"]=>
        array(1) {
          [0]=>
          string(6) "bridge"
        }
        ["sesaid"]=>
        array(1) {
          [0]=>
          string(0) ""
        }
      }
      ["BMC_WS_CORDYS is not in a valid format for SESA (SESA12345 or SESA123456)"]=>
      array(2) {
        ["appliname"]=>
        array(8) {
          [0]=>
          string(16) "Active Directory"
          [1]=>
          string(7) "Outlook"
          [2]=>
          string(16) "Active Directory"
          [3]=>
          string(6) "bridge"
          [4]=>
          string(6) "bridge"
          [5]=>
          string(3) "Box"
          [6]=>
          string(6) "bridge"
          [7]=>
          string(7) "Outlook"
        }
        ["sesaid"]=>
        array(8) {
          [0]=>
          string(13) "BMC_WS_CORDYS"
          [1]=>
          string(13) "BMC_WS_CORDYS"
          [2]=>
          string(13) "BMC_WS_CORDYS"
          [3]=>
          string(13) "BMC_WS_CORDYS"
          [4]=>
          string(13) "BMC_WS_CORDYS"
          [5]=>
          string(13) "BMC_WS_CORDYS"
          [6]=>
          string(13) "BMC_WS_CORDYS"
          [7]=>
          string(13) "BMC_WS_CORDYS"
        }
      }
    }
    EDIT : J'ai vu le post de JREAUX62 après avoir écrit ça. Oui, la solution de Jérôme est alléchante...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  13. #13
    Membre émérite Avatar de darkstar123456
    Homme Profil pro
    Développeur Web
    Inscrit en
    mars 2008
    Messages
    1 715
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : mars 2008
    Messages : 1 715
    Points : 2 457
    Points
    2 457
    Par défaut
    Hello !

    Haaa mais j'avais mal lu !!! Quand tu as écrit is not in a valid format for SESA (SESA12345 or SESA123456) je n'avais pas compris que c'était l'index de l'erreur, j'ai cru que c'était l'erreur qui était affichée quand tu voulais accéder à ton tableau dans la SESSION (donc dans la page Details)

    Néanmoins, ça ne change rien à ma réponse précédente si ce n'est que j'avais déjà assez d'infos sans en demander en plus
    Ca confirme ce que je disais : tu crées un lien avec un index numérique alors que dans ton tableau, l'index est un string vu qu'il s'agit de errorname.

    Personnellement, je rejoins l'avis de @Toufik83 de mettre directement tout en session plutôt que de tout mettre dans une variable et ensuite de tout réordonner en session ( sauf si y'a une partie qui oblige à faire comme c'est fait maintenant et qu'on ne connait pas évidemment )

  14. #14
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    Tous comptes faits, même si la solution proposée par dakstar123456 avait l'air satisfaisante, j'ai adopté celle de Jérôme au post #11. Simplement, comme $linen'est pas une simple stringmais un array, j'ai un peu modifié le code (qui marche !)

    Code php : 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
    foreach ($list_errors as $errorname => $line)
    {
        ?>
        <div>
            <?= $errorname; ?>
            <div class="a-tooltip" onclick="this.querySelector('div').classList.toggle('show')">
                <em> (details)</em>
                <div>
                    <?php
                    $lgth = count($line['appliname']);
                    for ($i=0; $i<$lgth; $i++)
                        echo "on ".$line['appliname'][$i]." by SESA".$line['sesaid'][$i]."<br/>";
     
                    ?>
                </div>
            </div>
        </div>
        <?php
    }

    Pour un peu élargir la fenêtre du tooltip, j'ai rajouté une règle width dans le CSS.

    Jérôme a beau trouvé ça simple, ne maîtrisant pas du tout jquery, je risquais pas de le faire sans aide...
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

  15. #15
    Membre éclairé Avatar de jreaux62
    Homme Profil pro
    Webmaster
    Inscrit en
    juin 2021
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webmaster
    Secteur : Arts - Culture

    Informations forums :
    Inscription : juin 2021
    Messages : 461
    Points : 878
    Points
    878
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    EDIT : J'ai vu le post de JREAUX62 après avoir écrit ça. Oui, la solution de Jérôme est alléchante...


    La solution "TOOLTIP" est la plus SIMPLE, et ERGONOMIQUE (un SIMPLE clic ou :hover, et on affiche le détail)

    Pour le CSS (affichage du tooltip), c'est à adapter, bien sûr.
    Si tu utilises Bootstrap 5 par exemple : https://getbootstrap.com/docs/5.0/components/tooltips/

    N.B. Il n'y a PAS de jQuery dans mon code. C'est du JavaScript pur.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    onclick="this.querySelector('div').classList.toggle('show');"
    Explication :
    • onclick="..." : au "clic" sur l'élément,
    • this.querySelector('div') : au <div> qu'il contient
    • .classList.toggle('show') : on affecte ou enlève la classe "show" (qui l'affiche/masque)

  16. #16
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    octobre 2006
    Messages
    9 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : octobre 2006
    Messages : 9 016
    Points : 4 394
    Points
    4 394
    Billets dans le blog
    1
    Par défaut
    C'est vrai qu'il n'y a pas trace de jQuery, mais utilisant peu javascript, j'aurais pas su faire non plus. Par exemple, j'ai découvert querySelectoret classList.
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

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

Discussions similaires

  1. Utilisation tableau dans une variable de session
    Par Etibru dans le forum Langage
    Réponses: 18
    Dernier message: 20/02/2018, 14h09
  2. Réponses: 6
    Dernier message: 09/04/2007, 17h53
  3. [WebForms]Comment utiliser une variable de session depuis JavaScript ?
    Par ThunderBib dans le forum Général Dotnet
    Réponses: 5
    Dernier message: 05/05/2006, 15h01
  4. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 12h23
  5. Réponses: 4
    Dernier message: 05/06/2002, 15h35

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