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

Web Perl Discussion :

problème traitement formulaire cgi(débutant)


Sujet :

Web Perl

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut problème traitement formulaire cgi(débutant)
    bonjour,

    j'écris un script d'authentification en html perl/cgi


    mon script html se présente comme çà:


    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
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <title>logclient.html</title>
    <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
    </head>
     
    <body>
    <form name="f1" action="logcli.cgi" method="post">
    login :<input type="text" name="login"><br />
    password:<input type="password" name="pass"><br />
     
    <input type="submit" value="Go">
     
    </form>
    </body>
    </html>

    mon script de traitement cgi se présente comme-ci
    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
    #!/usr/bin/perl
     
    use CGI;
     
    $page= new CGI::new();
     
    print $page->header(),
          $page->start_html();
     
    $log=$page->param("login");
    $pass=$page->param("pass");
     
    $part='nfa054/part.txt';
     
    if(open(part,$part))
    {
    while($lignes=<part>)
    {
    ($log,$pass)= split(/,/;lignes);
     
    if($log eq $page-> param('login'));
    { 
     if ($pass == param('pass'))
    {
    print $reg->p('identification r\u00e9ussie');
    } 
    else
    {
    print $reg->p('mauvais mot de passe!');
    }
    }
    }
    }
    et çà marche pas! ou ai-je bien pu faire une erreur ou des erreurs?

    cordialement,

  2. #2
    Responsable Perl et Outils

    Avatar de djibril
    Homme Profil pro
    Inscrit en
    Avril 2004
    Messages
    19 820
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 19 820
    Points : 499 184
    Points
    499 184
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/usr/bin/perl -w
     
    use strict;
    use Carp;
    use CGI;
    change ton entete et reteste. tu verras des messages d'erreurs dans les log!

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    merci du conseil, mais j ai toujours un internal server error.....

  4. #4
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    A mon avis tu as copié collé des bout de divers scripts sans trop vérifier la cohérence... ($req, $page, rien du tout ...)

    Indente ton code, dis-nous quelles sont les erreurs exactes que te rapporte ton serveur (regarde les logs d'Apache) et nous pourrons t'aider.

    --
    Jedaï

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    exact j ai bricolé mon traitement du formulaire,, je débute un peu avec le manuel sur les genoux et c'est dur... j'ai mis $page partout

    sinon voici mon fichier log.error

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    [Wed Jun 28 22:11:51 2006] [error] [client 127.0.0.1] syntax error at /home/shyboy/public_html/cgi-bin/logcli.cgi line 19, near "/,/;", referer: http://localhost/~shyboy/cgi-bin/logclient.html
    [Wed Jun 28 22:11:51 2006] [error] [client 127.0.0.1] syntax error at /home/shyboy/public_html/cgi-bin/logcli.cgi line 21, near ");", referer: http://localhost/~shyboy/cgi-bin/logclient.html
    [Wed Jun 28 22:11:51 2006] [error] [client 127.0.0.1] Execution of /home/shyboy/public_html/cgi-bin/logcli.cgi aborted due to compilation errors., referer: http://localhost/~shyboy/cgi-bin/logclient.html
    [Wed Jun 28 22:11:51 2006] [error] [client 127.0.0.1] Premature end of script headers: logcli.cgi, referer: http://localhost/~shyboy/cgi-bin/logclient.html
    [Wed Jun 28 22:27:42 2006] [error] [client 82.96.96.3] Attempt to serve directory: /var/www/

  6. #6
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Mets la dernière version de ton script bien indentée sur le forum. Sinon pour l'instant ce qui lui pose problème c'est le ";" (au lieu de ",") en plein dans ton split().

    --
    Jedaï

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    comment indenter ?(je bosse avec gedit).... je suis un peu dans la M.. je dois rendre mes scripts cgi lundi!!!!

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    test d 'indentation
    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
     
     
     
    1#!/usr/bin/perl -w
    2use strict;
    3use carp;
    4use CGI;
    5
    6$page= new CGI::new();
    7
    8print $page->header(),
     9     $page->start_html();
    10
    11$log=$page->param("login");
    12$pass=$page->param("pass");
    13
    14$part='nfa054/part.txt';
    15
    16if(open(part,$part))
    17{
    18while($lignes=<part>)
    19{
    20($log,$pass)= split(/;/,$lignes);
    21
    22if($log eq $page-> param('login'));
    23{ 
     24if ($pass == param('pass'))
    25{
    26print $page->p('identification r\u00e9ussie');
    27} 
    28else
    29if($log eq $page-> param('login'));
    30{
    31print $page->p('mauvais mot de passe!');
    32}
    33}
    34}
    35}

  9. #9
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Citation Envoyé par Shyboy
    comment indenter ?(je bosse avec gedit).... je suis un peu dans la M.. je dois rendre mes scripts cgi lundi!!!!
    Avec la touche tabulation... Dans tout éditeur qui se respecte l'indentation est automatique (ou presque automatique : par exemple dans emacs par défaut les lignes sont non-indenté mais avec une pression sur tabulation il te fait l'indentation adaptée)

    Par ailleurs il y a des utilitaires qui savent indenter tout seul un script Perl comme "perltidy" par exemple (il y a un paquet perltidy pour chaque distribution Linux à ce que j'en ai vu).

    Ton script bien indenté donnerait :
    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
     
    #!/usr/bin/perl
     
    use CGI;
    use strict; use warnings;
     
    my $cgi = CGI::new();
     
    print $cgi->header(),
          $cgi->start_html();
     
    my $login = $cgi->param("login");
    my $pass = $cgi->param("pass");
     
    my $part = 'nfa054/part.txt' ;
    open my $login_file, '<', $part
        or die "Can't open $part : $!\n";
     
     
    while( my $line = <$login_file>) {
     
        chomp($line);
        my ($real_login,$real_pass)= split /,/, $line;
     
        if($real_login eq $login and $real_pass eq $pass) {
            print $cgi->p('identification réussie');
        }
        else {
            print $cgi->p('mauvais mot de passe!');
        }
    }
    __END__
    J'ai corrigé les très nombreuses fautes de syntaxe présente dans ton fichier (fais "perl -c tonscript.pl" pour que Perl te dise où sont tes fautes de syntaxe sans exécuter le script). J'ai également utilisé les pragma strict et warnings pour que Perl n'accepte plus qu'une syntaxe plus propre où par exemple tu es obligé de déclarer chaque variable avant de l'utiliser (avec my() pour les variables lexicales et our() pour les variables globales que je te déconseille d'utiliser avant de savoir ce que tu fais).

    --
    Jedaï

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    il marche pas chez moi le script, c'est normal?

  11. #11
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    Citation Envoyé par Jedai
    Avec la touche tabulation... Dans tout éditeur qui se respecte l'indentation est automatique (ou presque automatique : par exemple dans emacs par défaut les lignes sont non-indenté mais avec une pression sur tabulation il te fait l'indentation adaptée)

    Par ailleurs il y a des utilitaires qui savent indenter tout seul un script Perl comme "perltidy" par exemple (il y a un paquet perltidy pour chaque distribution Linux à ce que j'en ai vu).

    Ton script bien indenté donnerait :
    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
     
    #!/usr/bin/perl
     
    use CGI;
    use strict; use warnings;
     
    my $cgi = CGI::new();
     
    print $cgi->header(),
          $cgi->start_html();
     
    my $login = $cgi->param("login");
    my $pass = $cgi->param("pass");
     
    my $part = 'nfa054/part.txt' ;
    open my $login_file, '<', $part
        or die "Can't open $part : $!\n";
     
     
    while( my $line = <$login_file>) {
     
        chomp($line);
        my ($real_login,$real_pass)= split /,/, $line;
     
        if($real_login eq $login and $real_pass eq $pass) {
            print $cgi->p('identification réussie');
        }
        else {
            print $cgi->p('mauvais mot de passe!');
        }
    }
    __END__
    J'ai corrigé les très nombreuses fautes de syntaxe présente dans ton fichier (fais "perl -c tonscript.pl" pour que Perl te dise où sont tes fautes de syntaxe sans exécuter le script). J'ai également utilisé les pragma strict et warnings pour que Perl n'accepte plus qu'une syntaxe plus propre où par exemple tu es obligé de déclarer chaque variable avant de l'utiliser (avec my() pour les variables lexicales et our() pour les variables globales que je te déconseille d'utiliser avant de savoir ce que tu fais).

    --
    Jedaï
    impec jedai, le script marche trés bien mais la le while lis et affiche que le mot de passe st maivais tant qu'il n'a pas trouvé le bon, tu vois pas comment faire pour qu'il mette soit mauvais mot de passe tout de suite ou bon mot de passesans afficherà chaque fois qu'il rencontre un login qu'il est mauvai ou non?

  12. #12
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Désolé, dans mon enthousiasme à corriger tes erreurs de syntaxe (il y en avait justement une au niveau du if) je suis allé trop loin et j'en ai rajouté une de logique...
    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
     
    #!/usr/bin/perl
     
    use CGI;
    use strict; use warnings;
     
    my $cgi = CGI::new();
     
    print $cgi->header(),
          $cgi->start_html();
     
    my $login = $cgi->param("login");
    my $pass = $cgi->param("pass");
     
    my $part = 'nfa054/part.txt' ;
    open my $login_file, '<', $part
        or die "Can't open $part : $!\n";
     
     
    while( my $line = <$login_file>) {
     
        chomp($line);
        my ($real_login,$real_pass)= split /,/, $line;
     
        if($real_login eq $login) {
            if($real_pass eq $pass) {
                print $cgi->p('identification réussie');
                last;
            }
            else {
                print $cgi->p('mauvais mot de passe!');
                last;
            }
        }
     
    }
    __END__
    Ceci assume bien sûr que chaque login est unique.

    --
    Jedaï

  13. #13
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    119
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 119
    Points : 47
    Points
    47
    Par défaut
    Merci jedai, j'ai encore une colle, coment ferais tu dans ce script pour déposer un cookie de session si l'accès est valide? moi avec toute les imbrications j'ai du mal!

  14. #14
    Expert éminent
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Points : 8 586
    Points
    8 586
    Par défaut
    Juste après (ou juste avant) la ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    print $cgi->p('identification réussie');
    mais avant la ligne :
    Parce que celle-ci quitte immédiatement la boucle while (pour éviter les tests inutiles).

    --
    Jedaï

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/07/2007, 23h07
  2. Débutant: Problème sous formulaire
    Par jrogron dans le forum Access
    Réponses: 14
    Dernier message: 03/08/2006, 20h26
  3. [débutant]problème de formulaire
    Par maitreblitosaure dans le forum IHM
    Réponses: 4
    Dernier message: 12/06/2006, 14h05
  4. Problème d'accent avec formulaire cgi
    Par vodevil dans le forum Web
    Réponses: 3
    Dernier message: 15/04/2006, 11h48
  5. [débutant]petit problème sur formulaire avec onglets
    Par Christophe93250 dans le forum Access
    Réponses: 2
    Dernier message: 06/01/2006, 10h46

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