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 :

authentification formulaire projet


Sujet :

Langage PHP

  1. #1
    Candidat au Club
    Homme Profil pro
    ingénieur développement
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur développement

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut authentification formulaire projet
    Bonjour,

    Je travaille sur un projet d'une application existante php au travail et je rencontre le problème suivant:

    Le fichier admcor.php permet d’entrer dans la page d’administration, après saisie login mot de passe il ne passe rien, la vérification ne fonctionne pas non plus.

    L’authentification en gros ne fonctionne pas et pourtant il y a une table d'utilisateurs (t_users d'une base de données), de plus il n'a aucun message d'erreurs de saisie à l'exécution.

    Pouvez-vous m'aider à résoudre le problème ?

    Merci
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    On ne va pas aller scruter tes 3 fichiers complets.
    Mais si tu nous mets les morceaux de code qui te posent question ici dans des balises code (icone #) on regardera.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  3. #3
    Candidat au Club
    Homme Profil pro
    ingénieur développement
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur développement

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour,

    Voici un extrait du code du fichier admcor.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
    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
    DEFINE("NIV_ADMIN",8) ;
    DEFINE("NIV_CENTRALE",6) ;
    DEFINE("NIV_ACA",4) ;
    DEFINE("NIV_IA",2) ;
    DEFINE("NIV_USER",1) ; // connecté
    DEFINE("NIV_ANONYME",0) ;
     
    DEFINE("MODE_MAJ",true) ; // utilisé aussi dans libsecur
     
    $champs_modifiables = array (
            NIV_IA => 'nom,prenom,grade,tel,fax,iddep,adresse,email,s_fonc,ligne',
            NIV_ACA =>      'nom,prenom,grade,tel,fax,iddep,adresse,email,s_fonc,ligne',
            NIV_CENTRALE => 'nom,prenom,grade,tel,fax,idacad,iddep,adresse,email,s_fonc,ligne',
            NIV_ADMIN =>    'nom,prenom,grade,tel,fax,idacad,iddep,adresse,email,s_fonc,ligne'
    ) ;
     
    $action = @$action?$action:"home";// par defaut, l'action est home
    $params = array (
            'home' => array('home',NIV_ANONYME,'home','Liste'),
            'login'=> array('login',NIV_ANONYME,'home','Connexion'),
            'logout'=> array('logout',NIV_USER,'home','Déconnexion'),
            'pref'=> array('',NIV_USER,'pref','Préférences'),
     
            'get_passwd'=> array('get_passwd',NIV_ANONYME,'get_passwd',''),
            'nou_passwd'=> array('nou_passwd',NIV_IA,'nou_passwd',''),
            'nou_param'=> array('nou_param',NIV_IA,'nou_param',''),
            'ajout_cor'=>array('ajout_cor',NIV_IA,'edit_cor','Ajout d\'un correspondant'),
            'suppr_cor'=>array('suppr_cor',NIV_CENTRALE,'suppr_cor','Suppression d\'un correspondant'),
     
     
            'choix'=>array('choix',NIV_IA,'home','Choix'),
            'ordre'=>array('ordre',NIV_IA,'home','Ordre'),
            'importer'=>array('importer',NIV_IA,'home',''),
     
            'admin'=> array('admin',NIV_CENTRALE,'admin','Administration des comptes'),
            'editcpt'=>array('editcpt',NIV_CENTRALE,'r_editcpt','Édition d\'un compte'),
            'ajoutcpt'=>array('ajoutcpt',NIV_ADMIN,'r_ajoutcpt','Ajout d\'un compte'),
            'suppcpt'=>array('suppcpt',NIV_ADMIN,'r_suppcpt','Suppression d\'un compte'),
            'envoimdpcpt'=>array('envoimdpcpt',NIV_CENTRALE,'admin','Envoi mot de passe d\'un compte'),
     
            'aide'=>array('',NIV_ANONYME,'aide','','Aide')
    );
     
    if (MODE_MAJ)
            $params['edit_cor'] = array('edit_cor',NIV_IA,'edit_cor','Édition d\'un correspondant');
    else
            $params['edit_cor'] = array('edit_cor',NIV_CENTRALE,'edit_cor','Édition d\'un correspondant');
     
    if (!@$params[$action]){ // action inconnue = erreur fatale
       print "<font color='red'>Désolé : commande non disponible<br> </font>";
       exit;
    }
     
    define('DOSSIER','D0160F');
    //define('DOSSIERLIB',dirname(__FILE__).'/../D0001F/'.DOSSIER.'/admcor'); // rep des biblio
    //define('DOSSIERLIBSECURBASE',dirname(__FILE__).'/../D0001F/'.DOSSIER.'/securbase_commun/'); // rep des biblio
     
    require("libsecur.php"); // librairie spécifique, incluant la librairie globale lib.php
     
    //require(DOSSIERLIBSECURBASE."libsecur_test.php"); // librairie spécifique, incluant la librairie globale lib.php
    require("initdb.php");
     
    connect("securbase");
    //print_r($params);
    //-- récupération des variables de session
    session_name ("EDUSCOL_admcor");
    //session_save_path ( DOSSIERLIB.'/sessions/' ) ;
    session_start();
    $user=@$_SESSION['sess_admcor'];
    print_r($user);
    // -----  constantes ------------
    define('APPLI',"admcor"); //nom de l'aplication
    define('CHEMIN',"admcor.php"); //chemin de l'aplication
    define('MAILADMIN',"securite.eduscol@education.gouv.fr");
     
    // ---- initialisations avant boucle des commandes ----
     
    $a_users = array();
    $message = "";
     
    openlog(APPLI,LOG_PID|LOG_CONS,IDLOG);
    syslog(LOG_INFO,"$action ".getenv('REMOTE_ADDR')." ".$user->donnees['login']);
     
    $a_sfonc=array(
    	1=>'correspondant académique sécurité',
    	21=>'correspondant départemental sécurité 1er degré',
      	22=>'correspondant départemental sécurité 2nd degré',
    	3=>'coordonnateur académique risques majeurs',
    	4=>'coordonnateur académique sécurité routière'
    );
    // ----- boucle principale --------
     
    do {
       $suivante = '';
       list($commande,$niveau,$mapage,$titre) = $params[$action];
       $nomenu = 0;
       $fs = array();
       // suivant utilisateur défini ou non ...
       if ($user->defini) {init_si_log();}
       else {session_unset();}
       // vérifier si l'utilisateur est autorisé à effectuer cette action
       if ($err = erreur_niveau($user->fonc)) {break;}
       // traiter les actions spécifiques aux commandes
       if ($commande){$err = $commande();}
       $action = $suivante;
    } while ($action);
     
     //print_r($session_c);
     
    // ---- fin de la boucle principale ---------
     
    // annuler l'authentification si l'une des opérations précédentes a provoqué une erreur de niveau 1
    if ($err && $err->niv) {if ($user) $user->vider(); session_unset(); }
     
    // ------ début des affichages ----
     
    if (!@$nomenu) {include("menuadmcor.php");} // bandeau du menu, sauf indication contraire
    if ($err) {// affichage de la page d'erreur si besoin
       if ($err->page_retour) {$mapage = $err->page_retour;}
       $err->affiche();
    }
    echo $mapage;
    include("templates/$mapage.php"); // affichage de la page associée à l'action
     
     
    closelog();
     
    ?>
    </body>
    </html>
     
    <?
    // =======  FONCTIONS UTILITAIRES  ========
     
    function init_si_log() {
       global $user,$sess_admcor,$session_c,$a_corr;
       //$HTTP_SESSION_VARS['sess_admcor']=$user;
       $sess_admcor=$user;
       session_register('sess_admcor');
       if(!@$session_c){
       $session_c =  new c_listecorr(
           ' t_corr_test, securbase.t_academie ',
           ' * ',
           ' idacad = id_academie '
           );
          //$HTTP_SESSION_VARS['session_c']=$session_c;
          if ((NIV_ACA == $user->fonc) || (NIV_IA == $user->fonc))
              $session_c->choix($user->donnees["gecos"]);
          else
              $session_c->choix();
          session_register('session_c');
       }
       lire_aca();
       lire_ia();
    }
     
    function erreur_niveau($n) { // vérifie le niveau de l'utilisateur
         global $niveau;
         if ($n < $niveau) {
                  if ($n) {return new erreur("clef=niveau");}
                      else {return new erreur("clef=identite");}
            }
         return 0;
    }
    // ---------- gestion du compte par l'utilisteur --------
     
    function login() {// authentification par formulaire
        global $user,$f,$fs,$suivante;
        $user='';
        $fs['login']=$f['login'];
        $user = new c_user('login',$f['login']);
        if ($user->fonc == NIV_ACA || $user->fonc == NIV_IA) $user->init();
        if (! $user->defini ) {return new erreur('login inconnu');}
        if (! $user->verif_passwd($f['passwd'])) {return new erreur("mot de passe incorrect","home",1);}
        syslog(LOG_INFO,"Nouvelle session ".getenv('REMOTE_ADDR')." ".$user->donnees['login']);
        $suivante="home";
    }
     
    ?>
    Voici le code de request_login.php:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <p> Pour pouvoir administrer cette base, vous devez d'abord vous identifier.</p>
    <form method='post' action='<? echo CHEMIN.'?action=login' ?>' name='motpasse'>
    <table>
    <tr><td class="rub">Votre login</td>
    <td><input type='text' name='f[login]' size='10' maxlenght='10' value="<? echo @$fs['login'] ?>"></td></tr>
    <tr><td class="rub">Votre mot de passe</td><td><input type='password' name='f[passwd]' size=10'></td></tr>
    </table>
    <input type='submit' name='envoi' value='envoi'>
    </form>
    <!--<h2>Application fermée : fin de la mise à jour des corrrespondants</h2>-->
    <p><a href="<? echo CHEMIN.'?action=get_passwd' ?>" >Je n'ai pas de mot de passe, ou je l'ai oubli&eacute;</a></p>
    Voici le code de home.php:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    <?php
    /*
     
     $LastChangedBy: legaller $
     $LastChangedDate: 2006-11-14 17:16:21 +0100 (mar., 14 nov. 2006) $
     $LastChangedRevision: 25 $
    */
    if (! $user->fonc){include('request_login.php');}
    else {include('liste_cor.php');}
    ?>
     
    </body>
    </html>

  4. #4
    Candidat au Club
    Homme Profil pro
    ingénieur développement
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur développement

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Voici également un extrait du code de menuadmcor.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
    <h2>ADMINISTRATION CORRESPONDANTS <?php if (isset($_SESSION['sess_admcor'])) echo "- (compte : ".$user->donnees["login"].")" ?></h2>
     
     
    <ul id="menu">
     
        <!--(<?php echo $user->donnees["gecos"]?>)-->
       <? if($user->fonc >= NIV_USER) { // connecté ?>
             <li ><a href="<? echo CHEMIN ?>"> Liste </a></li>
             <? if ($user->fonc >= NIV_IA) { ?>
                   <li><a href="<? echo CHEMIN .'?action=ajout_cor' ?>">Ajouter un correspondant</a></li>
                   <? if ($user->fonc >= NIV_CENTRALE ) { ?>
                         <li><a href="<? echo CHEMIN .'?action=admin' ?>">Admin</a></li>
                   <? } ?>
             <? } ?>
             <li><a href="<? echo CHEMIN .'?action=pref' ?>">Préférences</a></li>
             <li><a href="<? echo CHEMIN .'?action=logout' ?>">Déconnexion</a></li>
             <li><a href="<? echo CHEMIN .'?action=aide' ?>">Aide</a></li>
       <? } ?>
     
       </ul>
     
     
     
    <? echo $message ?>
    <br>

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Quand tu dis qu'il ne passe rien, ça veut dire quoi ? tu reviens sur la page d'accueil sans message d'erreur ? tu obtiens une page blanche ?

    Je n'ai pas complètement compris ton code (il part un peu dans tous les sens), mais si tu as un problème à l'identification, logiquement ça doit coincer au niveau de la fonction login, qui utilise la classe c_user que tu ne nous as pas montré
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  6. #6
    Candidat au Club
    Homme Profil pro
    ingénieur développement
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur développement

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Bonjour,


    Le fichier admcor.php permet d’entrer dans la page d’administration, après saisie login mot de passe et clique sur le bouton envoi il ne passe rien, la page qui se recharge est la même en restant sur le même formulaire en mettant les champs login et mot de passe à vide, il n'y a que l'url qui change:

    Avant le clique le bouton envoi: http://localhost/secrout/secrout/D00...60F/admcor.php

    Après saisie et clique sur le bouton envoi: http://localhost/secrout/secrout/D00...p?action=login

    Vous trouverez en PJ une capture d'écran de la page que j'obtiens

    Voici également la classe c_user:

    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
    //======== objet utilisateur =======
     
    class c_user extends c_objstk {
          var $table='t_users';
          var $typdon = array (
          'id'=>1,
          'fonc'=>1,
          'login'=>2,
          'passwd'=>2,
          'email'=>2,
          'gecos'=>2
          );
          var $extras=array('id','fonc');
          var $obligs=array('login','passwd');
          var $academie;
          var $ia;
     
          function init() {
                if ( NIV_IA == $this->fonc )
                      $li = new c_liststk('eduscol_commun.t_academie, eduscol_commun.t_ia','id_ia, t_academie.lg',
                            '  id_aca = id_academie AND id_ia = '.$this->donnees['gecos'] );
                if ( NIV_ACA == $this->fonc )
                      $li = new c_liststk('eduscol_commun.t_academie, eduscol_commun.t_ia',
                      'id_academie, t_academie.lg, eduscol_commun.t_ia.lg',' id_academie = '.$this->donnees['gecos'] );
                $li->extraire($aca,'simple');
                $this->academie = $aca[$this->donnees['gecos']] ;
                if ( NIV_IA == $this->fonc ) {
                            $li = new c_liststk('eduscol_commun.t_academie, eduscol_commun.t_ia','id_ia, t_ia.lg',
                                  '  id_aca = id_academie AND id_ia = '.$this->donnees['gecos'] );
                            $li->extraire($ia,'simple');
                            $this->ia = $ia[$this->donnees['gecos']] ;
                      }
    //            preprint($this);
          }
          function verif_passwd($p) {return ($p == $this->donnees['passwd']);}
     
    }// fin objet utilistateur
    Images attachées Images attachées  

  7. #7
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonsoir,
    possible d'avoir le code de la classe c_objstk et c_liststk ?

  8. #8
    Candidat au Club
    Homme Profil pro
    ingénieur développement
    Inscrit en
    Mars 2014
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : ingénieur développement

    Informations forums :
    Inscription : Mars 2014
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Voici le code de la classe c_objstk:

    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
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    class c_objstk {
    /**
    * Table mysql contenant les données.
    * Re-déclaration dans la classe étendue : obligatoire
    * Cette propriété contient le nom de la table mysql contenant les données de la fiche
    * @var string
    */
          var $table;
    /**
    * Type des données mysql.
    *
    * Re-déclaration dans la classe étendue : obligatoire
    * Tableau associatif champ=>type. Champ est le nom du champ. Type est un nombre indiquant
    * la façon dont la donnée du champ doit être traitée dans un formulaire.
    * typdon doit regrouper tous les champs de la table mysql, sauf ceux qu'on prévoit de ne
    * jamais utiliser dans un formulaire.
    * Dans c_objstk, le seul champ défini est id. Aussi, la classe doit elle être étendue
    * en fonction des fiches utilisées.
    * Les différents types de données sont :
    *  1. Numérique
    *  2. Chaîne de caractères
    *  3. Date. Il s'agit en fait d'une valeur numérique, représentation unix d'une date.
    *     Format utilisé, par exemple, pour la valeur retournée par la la fonction php time().
    *  4. Une liste d'identificateurs (le plus souvent numériques) séparés par des virgules.
    *     Utile pour les cases à cocher et les menus à choix multiples.
    *  5. Une liste de la forme "id1;v1,id2;v2,id3;v3". id;v représente un couple index
    *     - valeur. Utile pour recevoir les données d'une série de champs déroulants
    * @var array
    */
          var $typdon=array('id'=>1);
    /**
    * Données prises dans la table mysql.
    *
    * Re-déclaration dans la classe étendue : interdite
    * Tableau associatif contenant les données extraites de la table, sous la forme champ=>valeur.
    * Consignes à respecter pour le bon fonctionnement de l'objet :
    * - Eviter de modifier directement les valeurs et laisser ce soin aux méthodes de l'objet.
    * - La classe qui étend c_objstk ne doit pas re-déclarer donnees.
    * - En corollaire de la règle précédente, Il ne faut surtout  pas redéfinir les clefs de donnees.
    * En résumé : on regarde, mais on ne touche pas !
    * @var array
    */
          var $donnees=array();
    /**
    * Champs à valeur prise dans les données.
    *
    * Re-déclaration dans la classe étendue : facultative
    * Cette propriété est un tableau simple contenant la liste des champs de la table que
    * le constructeur définira comme des propriétés supplémentaires  de l'objet.
    * Par exemple, si la table contient un champ " nom ", la valeur du nom est normalement
    * accessible par objet->donnees['nom']. Si, de plus, " nom " figure dans la liste extras,
    * le constructeur créera une propriété nom. Ainsi, la valeur du nom pourra être accessible
    * plus simplement par objet->nom.
    * Noter qu'il ne s'agit que d'une simple facilité d'écriture, au prix d'une consommation
    * plus grande de mémoire puisque la valeur du champ figure deux fois  dans l'objet. Il ne faut
    * donc pas abuser de la propriété extras, et ne l'employer que pour les champs souvent référencés
    * dans le code.
    * Les propriétés définies à partir du tableau extras ne doivent surtout pas être modifiées
    * directement, car ce sont de simples copies des champs de {@link $donnees}, qui ne doit elle même être
    * modifiée que par les méthodes de l'objet.
    * Bien entendu, la propriété extras ne doit contenir aucun nom d'une propriété déjà existante.
    * @var array
    */
          var $extras=array('id');
    /**
    * Liste des données obligatoires.
    *
    * Re-déclaration dans la classe étendue : facultative
    * Cette propriété est un tableau simple contenant les champs à renseigner obligatoirement.
    * Cette liste est utilisée par la méthode {@link saisie()} pour vérifier que les champs obligatoires
    * d'un formulaire sont remplis. Les champs non remplis sont alors marqués dans {@link $obnonaff}.
    * @var array
    */
          var $obligs=array();
    /**
    * Marquage des données obligatoires mais non affectées.
    * Re-déclaration dans la classe étendue : inutile
    * Tableau associatif indexant les champs obligatoires qui n'ont pas été renseignés lors du dernier
    * appel de la méthode {@link saisie()}. La représentation est de la forme champ=>1.
    * obnonaff  n'est utile qu'en lecture seule, pour traiter les erreurs.
    * Exemple : après l'appel objet->saisie($c,$f,&$fs,$m)
    * if (count($objet->obnonaff)) permet de savoir si des données obligatoires n'ont pas été renseignées.
    * if (@$objet->obnonaff['unchamp']) permet de savoir si la donnée "unchamp" n'a pas été affectée.
    * Remarque : seuls les champs déclarés dans la propriété {@link $obligs} sont concernés par $obnonaff.
    * @var array
    */
          var $obnonaff=array();
    /**
    * id du dernier enregistrement.
    *
    * Re-déclaration dans la classe étendue : inutile
    * Cette propriété contient l'index de la dernière fiche ajoutée à la base par l'intermédiaire de
    * la méthode {@link ajouter()}
    * Positionnée par la requête INSERT dans une table contenant un champ auto-increment.
    * Elle contient 0 tant qu'aucune opération d'insertion n'a été effectuée.
    * @var integer
    */
          var $der_index=0;
    /**
    * indique si une fiche a été lue.
    *
    * Re-déclaration dans la classe étendue : inutile
    * Cette propriété indique si une fiche a été chargée ou non. Elle vaut 1 si une fiche a été lue
    * dans la table, 0 si aucune fiche n'a pu être trouvée ou si la méthode {@link vider()} a été appelée.
    * @var integer
    */
          var $defini=0;
    /**
    * Constructeur.
    *
    * Les valeurs de l'objet (en particulier la propriété {@link $donnees}) sont initialisées avec celles de
    * la fiche trouvée dans la table définie par la propriété {@link $table} et correspondant au couple $cle=>$val.
    * Si $cond est affectée, elle est concaténée avec la condition précédente.
    * Cette méthode fait appel à la commande SQL SELECT
    * @param string $cle identificateur de sélection - facultatif
    * @param $val string valeur de sélection - n'a de sens que si  $cle est défini
    * @param string $cond conditions supplémentaires - facultatif
    */
          function c_objstk($cle='',$val='',$cond=''){ // création de l'objet
             $this->vider();
             if(! $val){return;};
             $q = sprintf("select * from %s where %s='%s'",$this->table,$cle,$val);
             if($cond){$q .= " && ($cond)";}
             $res = mysql_query($q)
                 or erreur_fatale("accès à la base impossible : ".mysql_error());
             if($a= mysql_fetch_array($res)){
                 $this->donnees=$a;$this->defini=1;
                 foreach($this->extras as $k){$this->$k=$a[$k];}
             }
         }
    /**
    * Ajoute des données de l'objet dans la table.
    *
    * Cette méthode ajoute une fiche dans la table, à l'aide de la commande SQL INSERT.
    * La commande INSERT est construite avec les champs et les valeurs du tableau associatif $c.
    * Après un appel à ajouter, la propriété {@link $der_index} contient l'index de la fiche enregistrée.
    * $debog est un paramètre optionnel utile pour le débogage, avec les valeurs possibles :
    * · 0 la fiche est ajoutée normalement.
    * · 1 la commande INSERT est affichée, puis exécutée
    * · 2 la commande INSERT n'est pas exécutée (la table n'est donc pas modifiée).
    * · 3 la commande INSERT est affichée, mais pas exécutée. (la table n'est pas modifiée)
    * @param array $c tableau associatif champ=>valeur.
    * @param integer $debog entier compris entre 0 et 3
    */
         function ajouter($c,$debog=0){
             $cle='';$val='';
             foreach($this->typdon as $k=>$v){// date=date courante si non définie}
                  if ($v==3 && !@$c[$k]){$c[$k]=time();}
             }
             if (@count($c)){
                  foreach($c as $k=>$v){if($this->typdon[$k]==2){$c[$k]=addslashes($c[$k]);}}
                  $cle=implode(',',array_keys($c));
                  $val="'".implode("','",array_values($c))."'";
             }
             $q = "insert $this->table ($cle) values($val)";
             if ($debog & 1){echo "$q ";}
             if ($debog & 2){echo '-- simulation ';return;}
             mysql_query($q) or erreur_fatale("ajout impossible : ".mysql_error());
             $res=mysql_query("select LAST_INSERT_ID() from $this->table");
             $a =  mysql_fetch_row($res); $this->der_index=$a[0];
         }
    /**
    * Supprime l'objet dans la table mysql.
    *
    * Cette méthode détruit la fiche dans la table à l'aide de la commande SQL DELETE.
    * Ensuite, la méthode {@link vider()} est appliquée à l'objet.
    * $debog est un argument facultatif qui joue le même rôle que dans {@link ajouter()}.
    * @param integer $debog entier compris entre 0 et 3
    */
         function detruire($debog=0){
             $q = "delete from $this->table where id = $this->id";
             if ($debog & 1){echo "$q ";}
             if ($debog & 2){echo '-- simulation ';return;}
             mysql_query($q) or erreur_fatale("mise à jour impossible : ".mysql_error());
             $this->vider();
         }
    /**
    * Modifie des données de l'objet dans la table mysql.
    *
    * Cette méthode modifie une fiche dans la table, à l'aide de la commande SQL UPDATE.
    * La commande UPDATE est construite avec les champs et les valeurs du tableau associatif $c.
    * $debog est un argument facultatif qui joue le même rôle que dans {@link ajouter()}.
    * @param array $c : tableau associatif champ=>valeur.
    * @param int $debog entier compris entre 0 et 3
    */
         function modifier($c,$debog=0){
             $q = "";
             foreach ($c as $k=>$v) {
                     $this->donnees[$k]=$v;
                     if ($this->typdon[$k]==2){$v=addslashes($v);}
                     $q .= "$k='$v',";
             }
             if (! $q){return;}
             foreach($this->extras as $k){$this->$k=$this->donnees[$k];}
             $q =substr($q,0,-1);
             $q = "update $this->table set $q where id = $this->id";
             if ($debog & 1){echo "$q ";}
             if ($debog & 2){echo '-- simulation ';return;}
             mysql_query($q) or erreur_fatale("mise à jour impossible : ".mysql_error());
         }
    /**
    * Saisie les données de l'objet dans un formulaire.
    *
    * Cette méthode doit être utilisée en association avec un formulaire écrit lui-même en php.
    * Les noms des champs du formulaire doivent être du type f[champ], où "champ" est un champ
    * appartenant ou non à la table définie dans la propriété {@link $table} de l'objet
    * Les valeurs par défaut affichées par le formulaire doivent être dans des variables de la forme
    * $fs["champ"], où "champ" est un champ appartenant ou non à la table. Si "champ" appartient à la table,
    * il doit être mentionné dans la propriété {@link $typdon} de l'objet et traité par le formulaire
    * suivant le type auquel il appartient.
    * $c contient les champs à renseigner, soit sous la forme d'un tableau simple, soit sous la forme
    * d'une chaîne de caractères contenant une liste de noms séparés par des virgules.
    * Seuls les champs contenus dans $c seront traités par la méthode saisie.
    * Les champs définis dans $f mais non inscrits dans $c pourront être exploités par le programme,
    * mais seront ignorés par saisie.
    * Après l'appel de la méthode saisie, la situation est la suivante:
    * . Le tableau associatif $fs a pour champs tous les champs définis dans.
    *   Si un champ fait partie de $f (c'est-à-dire s'il fait partie du formulaire) ET s'il est listé
    *   dans $c, sa valeur associée sera celle transmise par le formulaire. Dans tous les autres cas, ce
    *   sera la valeur contenue dans la propriété {@link $données}.
    *   Ce tableau $fs sert surtout à afficher ou réafficher un formulaire avec les valeurs par défaut
    *   correctes. Dans ce but, le programme peut rajouter des champs à $fs après l'appel à la méthode
    *   saisie.
    * · Le tableau associatif $m contient uniquement les champs listés dans $c et modifiés par le
    *   formulaire. Ce tableau sert généralement de paramètre aux méthodes {@link ajouter()} ou {@link modifier()},
    *   soit directement, soit après vérifications supplémentaires opérées par le programme.
    * · La propriété {@link $obnonaff} pointe tous les champs à renseigner obligatoirement, et qui n'ont
    *   pas été remplis dans le formulaire (voir {@link $obnonaff} et {@link $obligs}).
    * Saisie formate les données renvoyées par le formulaire en fonction du type :
    *   1. Numérique : aucun traitement
    *   2. Chaîne : suppression des espaces en début et fin de chaîne. Suppression des antislashs
    *   3. Date : transformation d'une chaîne de la forme jj-mm-aa en format unix (comme celui renvoyé par time())
    *   4. Série : le formulaire doit renvoyer un tableau (résultat de cases à cocher ou d'un menu déroulant à sélection multiple);
    *      saisie le transforme en chaîne d'index séparés par des virgules.
    *   5. Série avec coefficients : le formulaire doit renvoyer deux tableaux (un pour les index, l'autre pour les valeurs);
    *       saisie le transforme en liste de couples index;valeur.
    * Il faut noter que la propriété saisie ne modifie aucune propriété de l'objet, en dehors de
    * $obnonaff et ne provoque aucun accès à la base, ni en lecture ni en écriture.
    * La modification effective de l'objet n'interviendra qu'après un appel à {@link modifier()} ou {@link ajouter()}.
    * Les données modifiées et formatées sont contenues dans $m, qui peut être transmis
    * directement à modifier() ou ajouter(), ou après un traitement pour des vérifications supplémentaires.
    * En cas d'erreur, saisie retourne un objet de classe {@link c_erreur}.
    * @param array $c : tableau simple ou chaîne contenant la liste des champs à renseigner.
    * @param array $f : tableau associatif envoyé par le formulaire de saisie
    * @param array $fs : tableau associatif passé par référence et contenant le résultat de la saisie après traitement
    * @param array $m : tableau associatif passé par référence et contenant les associations champ=>valeur des champs modifiés.
    * @return mixed
    */
         function saisie($c,$f,&$fs,&$m){
             $err='';
             $m=array();
             $fs=$this->donnees;
             $this->obnonaff=array();
             if (! is_array($c)){$c=explode(',',$c);}
             foreach($c as $k){
               switch($this->typdon[$k]){
                  case 1://type numerique
                  $v=@$f[$k]?$f[$k]:0;
                  break;
                  case 2://type chaine
                  $v=stripslashes(@$f[$k]?trim($f[$k]):'');
                  break;
                  case 3: // type date
                  if (!$v=$this->num_date(@$f[$k])){$err= new erreur('date incorrecte: '.@$f[$k]);}
                  break;
                  case 4://type liste
                  if (! $v=@implode(',',$f[$k])){$v='';}
                  break;
                  case 5://type liste pondérée
                  $a=array();
                  foreach($f[$k] as $champ=>$poids){if($poids){$a[]="$champ;$poids";}}
                  if (! $v=@implode(',',$a)){$v='';}
               }//switch
               if($v != $this->donnees[$k]){$m[$k]=$v;$fs[$k]=$v;}
             }//foreach
             foreach($this->obligs as $k){if (!@$fs[$k]){$this->obnonaff[$k]=1;}}
             return $err;
         }//saisie
    /**
    * Efface les données de l'objet en mémoire, mais pas dans la table mysql.
    *
    * Cette méthode "efface" les données de l'objet. Toutes les valeurs de la propriété {@link $donnees}
    * sont affectées suivant le type du champ :
    *  1. numérique : 0
    *  2. chaîne : chaîne vide
    *  3. date : date courante
    *  4. série : chaîne vide
    *  5. série avec coefficients : chaîne vide
    * L'objet lui même n'est pas détruit.
    * La méthode vider n'efface pas l'enregistrement de la table. Il faut pour cela utiliser la méthode
    * {@link supprimer()} (qui appelle ensuite la méthode vider)
    */
         function vider(){
             foreach($this->typdon as $k=>$v){
                 if ($v==1){$this->donnees[$k]=0;}
                 elseif ($v==3){$this->donnees[$k]=time();}
                 else {$this->donnees[$k]='';}
             }
             foreach($this->extras as $k){$this->$k=$this->donnees[$k];}
             $this->der_index=0;
             $this->defini=0;
         }
    /**
    * Conversion d'une date en un format unix.
    *
    * Vérifie que la chaîne fournie est au format j-m-a (exemple 5-02-02 ou 05-02-02 ou 05-02-2002).
    * j est le jour sur 1 ou 2 chiffres, m est le mois sur 2 chiffres, a est l'année sur 2 ou 4 chiffres.
    * Si le format est correct, la fonction renvoie la date sous le format numérique unix. Sinon, elle
    * renvoie 0.
    * Cette fonction est utilisée par {@link saisie()} pour les données de type 3.
    * Elle peut être aussi appelée sans instanciation de c_objstk (syntaxe c_objstk::num_date($d)).
    * @param string $d chaîne au format jj-mm-aa
    * @return integer
    */
         function num_date($d) {
            $d = trim($d);
            if (! preg_match('/^([0-3]?\d)-([0-1]\d)-((19|20)?\d{2})/',$d,$a)) {return 0;}
            list($dd,$j,$m,$an) = $a;
            if (($m < 1) || ($m > 12))  {return 0;}
            if (($j < 1) || ($j > 31))  {return 0;}
            return mktime(0,0,0,$m,$j,$an);
    }
     
    }// fin de la classe objstk
    et voici le code de c_liststk:

    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
    class c_liststk {
    /**
    * Table mysql contenant les données à extraire.
    */
          var $table;
    /**
    * Liste des champs à extraire.
    *
    * Chaîne de caractères contenant la liste des champs à extraire, séparés par une virgule.
    * Le premier champ de la liste joue un rôle particulier dans l'extraction (voir {@link extraire()}).
    * La liste ne peut pas être vide. Si elle contient '*', tous les champs seront extraits.
    * @var string
    */
          var $champs;
    /**
    * Conditions d'extraction.
    *
    * Si $cond est affectée, elle doit contenir une condtion d'extraction SQL, sans la clause WHERE
    * qui sera rajoutée par le programme.
    * @var string
    */
          var $cond;
    /**
    * Ordre d'extraction.
    *
    * Si $ordre est affectée, elle doit contenir une condtion de tri SQL, sans la clause ORDER BY
    * qui sera rajoutée par le programme.
    * @var string
    */
          var $ordre;
    /**
    * Liste des valeurs extraites.
    *
    * Tableau affecté par la méthode {@link lire()}
    * @var array
    */
          var $liste=array();
    /**
    * Constructeur
    * @param $t affecté à la propriété {@link $table}.
    * @param $c affecté à la propriété {@link $champs}.
    * @param $cond affecté à la propriété {@link $cond}.
    * @param $ordre affecté à la propriété {@link $ordre}.
    */
          function c_liststk($t,$c='*',$cond='',$ordre=''){
             $this->table=$t;
             $this->champs=$c;
             $this->cond=$cond;
             $this->ordre=$ordre;
          }
    /**
    * Extrait les données de la table dans un tableau externe.
    *
    * Construit une requête SQL à partir des propriétés {@link $table}, {@link $champs}, {@link $cond} et {@link $ordre}.
    * chaque ligne extraite de la table est rangée le tableau &$résultat.
    * Si $opt n'est pas défini, chaque ligne est de la forme clef=>tab,
    * où clef est la valeur associée au premier champ défini dans la propriété {@link $champs}.
    * tab est la ligne extraite de la table sous la forme d'un tableau associatif.
    * Si opt=simple, chaque ligne est de la forme clef=>val, où clef est la valeur associée au
    * premier champ défini dans la propriété {@link $champs}, et val la valeur associée au second champ.
    * Si opt=un, &$résultat est un tableau formé des valeurs associées au premier champ de {@link $champs}.
    * Si opt=tableur, &$résultat est un tableau séquentiel des enregistrements extraits, chaque enregistrement
    * étant lui-même un tableau séquentiel de valeurs. Cette option est surtout utilisée quand le résultat
    * doit être exploité par un tableur.
    * @param array $resultat tableau passé par référence pour recevoir le résultat de l'extraction
    * @param string $opt paramètre optionnel pouvant prendre les valeurs : simple,un ou tableur
    *
    */
          function extraire(&$resultat,$opt=''){
             $resultat=array();
             $q="select $this->champs from $this->table";
             if ($this->cond){$q.= " where $this->cond";}
             if ($this->ordre){$q.= " order by $this->ordre";}
    //       preprint($q);
             $res = mysql_query($q)
                    or erreur_fatale("Accès à la base impossible : ".mysql_error());
             if(@$opt=='simple'){while($a = mysql_fetch_row($res)){$resultat[$a[0]]=$a[1];}}
             elseif(@$opt=='un'){while($a = mysql_fetch_row($res)){$resultat[]=$a[0];}}
             elseif(@$opt=='tableur'){while($a = mysql_fetch_assoc($res)){$resultat[]=$a;}}
             else {while($a = mysql_fetch_array($res)){$resultat[$a[0]]=$a;}}
          }
    /**
    * Extrait les données de la table dans un tableau interne.
    *
    * La méthode lire agit de la même façon que {@link extraire()}, mais le résultat est affecté à la
    * propriété {@link $liste} au lieu d'être affecté à une variable passée par référence.
    * @param string $opt chaîne optionnelle pouvant prendre les valeurs 'un' ou 'simple'.
    */
          function lire($opt=''){$this->extraire($this->liste,$opt);}
    /**
    * Renvoie le nombre de d'enregistrements à extraire.
    * Cette méthode renvoie le nombre de lignes de la table mySql définie dans {@link table} et
    * satisfaisant à la propriété {@link cond}.
    * @return integer
    */
          function occur() {
            $res=mysql_query("select count(*)from $this->table where $this->cond");
            $a = mysql_fetch_row($res);
            return $a[0];
         }
    }// fin de la classe c_liststk

  9. #9
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Faudrait utiliser mysqli ou pdo
    mysql est obsolete
    Tu as essayé en mettant les méthodes publiques dans les classes
    et function __construct? (dsl trop de codes a lire)

  10. #10
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    de plus il n'a aucun message d'erreurs de saisie à l'exécution.
    Ok, mais la gestion d'erreurs est-elle activée ?
    Ajoute cette ligne au début de ta page admcor.php pour en avoir le coeur net :

    Il doit te dire que la constante TOTO n'est pas définie.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

Discussions similaires

  1. Réponses: 0
    Dernier message: 22/12/2015, 17h39
  2. Réponses: 7
    Dernier message: 19/10/2004, 16h12
  3. [STRUTS] problème de formulaire
    Par ultimax dans le forum Struts 1
    Réponses: 5
    Dernier message: 09/07/2004, 15h55
  4. [Struts] Problème de formulaire(s) ...
    Par djoukit dans le forum Struts 1
    Réponses: 8
    Dernier message: 10/03/2004, 23h48
  5. Réponses: 12
    Dernier message: 24/09/2003, 15h26

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