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

SGBD Perl Discussion :

requête tant que


Sujet :

SGBD Perl

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut requête tant que
    bonjour j'ai besoin d'aide sur du perl et sgbd

    voila je reprends un code qui existe déjà mais qui pour le moment envoie des mails d'alerte. à terme on m'a demandé qu'il n'y ait plus de mail mais que les infos soient récupérées et stockée dans une BDD

    Je cherche à finaliser une requête qui ferait ceci
    récupère les valeurs qui sont stockées dans le script et envoyées dans le mail
    et fait:
    tant que $Hostname est différent de vide
    récupère les autres variables et insère les dans la bdd
    et je veux une boucle while pour que le script boucle tant qu'il n'a pas de valeur $Hostname vide.

    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
     
    // format de sortie des infos qui sont envoyées ensuite par mail
    format STDOUT_TOP =
    @<<<<<<<
    Date, $Time
     
    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    Hostname, Volume, Label, Size, Frees, Freep
    .
     
    format STDOUT =
    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    $host, $Volume, $Label, $Size, $Frees, $Freep
     
    // requête tant que $host n'est pas vide boucle et insère les données lignes par lignes
    while (my $Host != ""){
    $req->execute ($Time, $Host, $Volume...) or die "requete impossible";
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    sniff personne pour m'aider

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    27
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 27
    Points : 17
    Points
    17
    Par défaut
    Essai avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while (defined $Host){
    $req->execute ($Time, $Host, $Volume...) or die "requete impossible";
    }

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    je vais testé et je dirai si c'est résolu

    en tout cas merci

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut suite des évènements
    j'ai insérer ton morceau de code, il récupère bien les infos, mais ça récupère seulement les infos du 1er host et ça boucle résultat, 11000 identiques lignes dans ma bdd :p

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut suite
    j'ai essayé ceci, il ne boucle que 29 fois (soit le nombre total de serveurs surveillés) mais il inscrit dans ma BDD 29 fois les mêmes infos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while (<>){
    $req->execute ($Time, $Host, $Volume...) or die "requete impossible";
    }

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut en fait
    il a bouclé 188 fois

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut suite
    j'ai changé le while (<>) par foreach(<STDOUT>)

    et là il m'a inclue la première ligne mais il n'a pas bouclé et il a planté

    Je sais que je dois implémenter un compteur, mais je sais pas comment compter le nombre de ligne dans le STDOUT



  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    pour le moment oublie la sql query fait juste un print avec ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    while ($hostname ne ""){
        print "\n $hoostname";
    }
    Q: comment initialise-tu ton $hostname ?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut j'y avais pensé
    j'ai testé ton code tel que tu me le donne (et effectivement il ne prend que le host de la première ligne et boucle indéfiniement dessus)

    mon format de STDOUT donne ça de visu

    Date :2008-05-21
    Hostname |Volume |Label | Size | Frees |Freep
    __________________________________________________
    sapa108 | FDATA-Loca| 26.0 GB| 1.8 GB | 7%
    sapa129 | DDATA |135.7 GB|12.6 GB| 9%
    sdpa103 | EData | 42.4 GB| 2.5 GB | 6%

    et avec ton print il me donne

    sapa108
    sapa108
    sapa108
    sapa108
    ....... à l'infini comme s'il n'était pas capable une fois la fin de ligne atteinte de passer à la suivante


  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    puis-je avoir la ligne d'initialisation de ta variable $hostname, pas l'affichage.

    je pense que l'erreur viens de la.

    P.S : fait attention a ne pas avoir des espaces dans ta variable ou des \n

    Cdlt,

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut mon code complet
    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
     
    # script modifié par A.ROUSSEL le 16 05 2008
    use DBI;
     
    my $db = 'DBI:mysql:essai:127.0.0.1';
    my $user = 'root';
    my $pass = '';
    my $dbh = DBI->connect($db, $user, $pass) 
      or die "connexion impossible";
    use POSIX qw(strftime);
    $Time = strftime "%Y-%m-%d", localtime;
    $Seuil="10%"; 
    # récupère les informations du fichier plat
    while (<>) {
        undef @free;
        chomp;
        if ( /System information for \\\\(.*)\:/ ) {
            $host = $1;
    #initialisation de la variable $host
        }
     
        if ( /Fixed/ ) {
    	push @free, split ();
        } else {
    	next;
        }
     #met les infos dans un tableau et split   
        $Volume = $free[0];
        $Type   = $free[1];
        $Format = $free[2];
    #correspondance des variables avec les variables du tableau    
        if ( $#free == 7 ) {
    	$Size = "$free[3] $free[4]";
    	$Frees = "$free[5] $free[6]";
    	$Freep =$free[7];
        }
     
        if ( $#free == 8 ) {
    	$Label = $free[3];
    	$Size = "$free[4] $free[5]";
            $Frees = "$free[6] $free[7]";
            $Freep =$free[8];
        }
    #on récupère uniquement les valeurs des disques dur et pas les cd-rom ou disquette
        if ($Freep <= $Seuil){
    #on ne récupère que les infos pour les serveurs dont l'espace disque est inférieur ou égale à 10%
        write STDOUT;
    #on écrit dans un STDOUT qui est envoyé dans un mail    
        my $req = $dbh->prepare("INSERT INTO checkfs VALUES(?, ?, ?, ?, ?, ?, ?)");
    #on prépare la requête
     
    while (<>){
      $req->execute( $Time, $host, $Volume, $Label, $Size, $Frees, $Freep )
        or die "requete impossible";
    	}
    #on récupère les variables que l'on veut pour les insérer dans la bdd	
    $dbh->disconnect();
        }
     
    }
     
    format STDOUT_TOP =
    @<<<<:@<<<<<<<<<
    Date, $Time
    @<<<<<<<<<|@>>>>>|@<<<<<<<<|@>>>>>>>|@>>>>>>|@>>>>
    Hostname, Volume, Label, Size, Frees, Freep
    @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    __________________________________________________
    .
     
    format STDOUT =
    @<<<<<<<<<|@>>>>>|@<<<<<<<<|@>>>>>>>|@>>>>>>|@>>>>
    $host, $Volume, $Label, $Size, $Frees, $Freep
    .
     
    __END__
    voila

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    1- utilise (tu as des variable non initialisées comme il faut. (ajout my devant $time et $seuil)

    2- n'utilise pas $_ (golden rules perl) utilise des nom de variables (1 mois plutard tu oublie tout a fait comment marche ton script alors...)

    3- dans ton while utilise la syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    while($entry=<HND_FILE>){
       chomp($entry);
       print "|".$entry."|"; # pour vérification  
       traitement;
    }
    comment start tu ton script ?

    Puis-je avoir une fihcier d'entrée pour faire le test ?

    Cdlt

  14. #14
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut avancement
    si j'utilise use strict;
    j'ai ce type d'erreur
    Global symbol "$Time" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 11.
    Global symbol "$Seuil" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 12.
    Global symbol "@free" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 15.
    et
    Bareword "Freep" not allowed while "strict subs" in use at C:\Program Files\EastPHP1-8\www\test\freespacedb.pl line 64.

    j'initialise mon code comme çà
    C:\Documents and Settings\adminbatch>cat "C:\Program Files\EasyPHP1-8\www\test\freespace-PSATOOLS-20080518.txt" | perl "C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl"

    avec ton bout de code il m'affiche bien toutes mes infos

    Date :2008-05-21
    Hostname |Volume|Label | Size| Frees|Freep
    __________________________________________________
    sapa108 | FDATA-Loca| 26.0 GB| 1.8 GB| 7%
    sapa129 | DDATA |135.7 GB|12.6 GB| 9%
    sdpa103 | EData | 42.4 GB| 2.5 GB| 6%
    calapp020 | DData | 50.1 GB| 3.0 GB| 6%

    ci joint le fichier texte
    Fichiers attachés Fichiers attachés

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    si j'utilise use strict;
    j'ai ce type d'erreur
    Global symbol "$Time" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 11.
    Global symbol "$Seuil" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 12.
    Global symbol "@free" requires explicit package name at C:\Program Files\EasyPHP1-8\www\test\freespacedb.pl line 15.
    et
    Bareword "Freep" not allowed while "strict subs" in use at C:\Program Files\EastPHP1-8\www\test\freespacedb.pl line 64.
    - il faut tout dabord corriger tout les problèmes évoqués par l'utilisation de use strict (des variables non declarées comme $time et autre)

    - utilise autre chose que $_ avec tes <>

    avec ton bout de code il m'affiche bien toutes mes infos
    bon pas bon ??

    je vais voir le reste

    Cdlt

  16. #16
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut
    j'ai corrigé le problème des variables et ça c'est bon

    ensuite ça m'affiche bien le résultat que je veux, c'est bon aussi

    du coup j'ai réactivé la partie du code qui fait un insert vers la bdd et là paf rien qui est inséré

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    ton probleme viens de cette partie

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        if ( /Fixed/ ) {
                chomp();
                    print ;
                push @free, split ();
        } else {
                next;
        }
    ton split n'est pas bon et tu ecrase ta variable $_ avec des fausse data

    utilise des variable et pour ton split prend en compte qu'il n'y a pas un seul espace entre tes differents champs.

    si je zape cette partie j'ai tout tes host et pas de blocage du while moi.


    Cdlt

  18. #18
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut il semble
    ça marche j'ai bien l'affichage mais ma requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $req->execute( $Time, $host, $Volume, $Label, $Size, $Frees, $Freep )
       or die "requete impossible";
    dans
    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
     
        if ($Freep <= $Seuil){
        write STDOUT;
     
        my $req = $dbh->prepare("INSERT INTO checkfs VALUES(?, ?, ?, ?, ?, ?, ?)");
     
    while ($entry=<HND_FILE>){
    	chomp($entry);
    	print "|".$entry."|";	
    $req->execute( $Time, $host, $Volume, $Label, $Size, $Frees, $Freep )
       or die "requete impossible";
    	}
     
    $dbh->disconnect();
        }
    ne se fait plus :/

  19. #19
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    132
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 132
    Points : 69
    Points
    69
    Par défaut ça marche mais j'ai fait un truc que je capte pas
    j'ai repris mon code avec tes corrections et j'ai juste déplacé

    le $dbh-->disconnect(); d'un niveau (je l'ai mis dans la boucle while et j'ai sortie la requête de la boucle et là ça marche)

    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
     
    # script modifié par A.ROUSSEL le 16 05 2008
    use Strict;
    use DBI;
     
    my $db = 'DBI:mysql:essai:127.0.0.1';
    my $user = 'root';
    my $pass = '';
    my $dbh = DBI->connect($db, $user, $pass) 
      or die "connexion impossible";
    use POSIX qw(strftime);
    my $Time = strftime "%Y-%m-%d", localtime;
    my $Seuil="10%"; 
     
    while (<>) {
        undef @free;
        chomp;
        if ( /System information for \\\\(.*)\:/ ) {
            $host = $1;
        }
     
        if ( /Fixed/ ) {
        	chomp();
    	push @free, split ();
        } else {
    	next;
        }
     
        $Volume = $free[0];
        $Type   = $free[1];
        $Format = $free[2];
     
        if ( $#free == 7 ) {
    	$Size = "$free[3] $free[4]";
    	$Frees = "$free[5] $free[6]";
    	$Freep = $free[7];
        }
     
        if ( $#free == 8 ) {
    	$Label = $free[3];
    	$Size = "$free[4] $free[5]";
            $Frees = "$free[6] $free[7]";
            $Freep = $free[8];
        }
        if ($Freep <= $Seuil){
        write STDOUT;
     
        my $req = $dbh->prepare("INSERT INTO checkfs VALUES(?, ?, ?, ?, ?, ?, ?)");
        $req->execute( $Time, $host, $Volume, $Label, $Size, $Frees, $Freep )or die "requete impossible";
    while ($entry=<HND_FILE>){
    	chomp($entry);
    	print "|".$entry."|";	
    $dbh->disconnect();
    	}
     
     
        }
     
    }
     
    format STDOUT_TOP =
    @<<<<:@<<<<<<<<<
    Date, $Time
    @<<<<<<<<<|@>>>>>|@<<<<<<<<|@>>>>>>>|@>>>>>>|@>>>>
    Hostname, Volume, Label, Size, Frees, Freep
    @<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
    __________________________________________________
    .
     
    format STDOUT =
    @<<<<<<<<<|@>>>>>|@<<<<<<<<|@>>>>>>>|@>>>>>>|@>>>>
    $host, $Volume, $Label, $Size, $Frees, $Freep
    . 
    __END__
    Je suis sur le cul mais c'est ce que je voulais merci t'es un

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    134
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 134
    Points : 107
    Points
    107
    Par défaut
    bon ben voila c'est une bonne chose

    ne pas oublier [ RESOLU]

    Cdlt

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 30/10/2014, 12h27
  2. Variable en tant que nom de colonne requête SQL
    Par hugoclo dans le forum Langage
    Réponses: 12
    Dernier message: 07/03/2014, 22h32
  3. Réponses: 10
    Dernier message: 27/09/2010, 17h54
  4. requête SQL qui ne marche pas en tant que vue (view)
    Par charlesz dans le forum MS SQL Server
    Réponses: 7
    Dernier message: 01/08/2008, 14h25
  5. Réponses: 5
    Dernier message: 03/03/2008, 08h34

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