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 :

Requete insertion automatisée


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 Requete insertion automatisée
    bonjour,

    j'aimerai modifié mon code pour que celui ci récupère des lignes d'infos tant que le champs date n'est pas vide. ceci est mon code de départ

    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
    my $dbconnect = DBI->connect($db, $user, $pass) or die "connexion impossible";
    print "Veuillez entrer les infos\n";
    print "Date\n";
    my $Date = <STDIN>;
    print "Host\n";
    my $Hostname = <STDIN>;
    print "Vol\n";
    my $Volume = <STDIN>;
    print "Label\n";
    my $Label = <STDIN>;
    print "Size\n";
    my $Size = <STDIN>;
    print "Freep\n";
    my $Frees = <STDIN>;
    print "Frees\n";
    my $Freep = <STDIN>;
    my $req="INSERT INTO checkfs Values('$Date', '$Hostname', '$Volume', '$Label', '$Size', '$Frees', '$Freep')";
    $dbconnect -> do($req) or die "requete impossible";
     
    $dbconnect->disconnect();

    j'aimerai utiliser la condition tant que le champ $Date est différent de 'vide', continue de récupérer les infos et de les insérer dans la table
    j'ai essayé while (my ($Date) ==<>){.... } mais échec le perl se ferme de suite
    je ne suis pas expert en perl mais si quelqu'un à la solution

  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 A terme
    A terme j'aimerai fusionner 2 bouts de codes :


    use POSIX qw(strftime);
    $Time = strftime "%Y%m%d", localtime;
    $Seuil="10%";
    while (<>) {
    undef @free;
    chomp;
    if ( /System information for \\\\(.*)\:/ ) {
    $host = $1;
    }

    if ( /Fixed/ ) {
    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;
    }
    }

    format STDOUT_TOP =
    @<<<<<<<
    Date, $Time

    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    Hostname, Volume, Label, Size, Frees, Freep
    .

    format STDOUT =
    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    $host, $Volume, $Label, $Size, $Frees, $Freep
    .
    et ça:
    #!/usr/bin/perl
    use strict;
    use DBI;

    my $db = 'DBI:mysql:essai:127.0.0.1';
    my $user = 'root';
    my $pass = '';

    my $dbconnect = DBI->connect($db, $user, $pass) or die "connexion impossible";
    print "Veuillez entrer les infos\n";
    print "Date\n";
    my $Date = <STDIN>;
    print "Host\n";
    my $Hostname = <STDIN>;
    print "Vol\n";
    my $Volume = <STDIN>;
    print "Label\n";
    my $Label = <STDIN>;
    print "Size\n";
    my $Size = <STDIN>;
    print "Freep\n";
    my $Frees = <STDIN>;
    print "Frees\n";
    my $Freep = <STDIN>;
    my $req="INSERT INTO checkfs Values('$Date', '$Hostname', '$Volume', '$Label', '$Size', '$Frees', '$Freep')";
    $dbconnect -> do($req) or die "requete impossible";

    $dbconnect->disconnect();
    pour donner un truc dans le genre:
    #!/usr/bin/perl
    use strict;
    use DBI;

    my $db = 'DBI:mysql:essai:127.0.0.1';
    my $user = 'root';
    my $pass = '';

    my $dbconnect = DBI->connect($db, $user, $pass) or die "connexion impossible";


    use POSIX qw(strftime);
    $Time = strftime "%Y%m%d", localtime;
    $Seuil="10%";
    while (<>) {
    undef @free;
    chomp;
    if ( /System information for \\\\(.*)\:/ ) {
    $host = $1;
    }

    if ( /Fixed/ ) {
    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;
    }
    }

    format STDOUT_TOP =
    @<<<<<<<
    Date, $Time

    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    Hostname, Volume, Label, Size, Frees, Freep
    .

    format STDOUT =
    @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>>
    $host, $Volume, $Label, $Size, $Frees, $Freep
    .

    while( my ($Date) = <>){
    print "Veuillez entrer les infos\n";
    print "Date\n";
    my $Date = <STDIN>;
    print "Host\n";
    my $Hostname = <STDIN>;
    print "Vol\n";
    my $Volume = <STDIN>;
    print "Label\n";
    my $Label = <STDIN>;
    print "Size\n";
    my $Size = <STDIN>;
    print "Freep\n";
    my $Frees = <STDIN>;
    print "Frees\n";
    my $Freep = <STDIN>;
    my $req="INSERT INTO checkfs Values('$Date', '$Hostname', '$Volume', '$Label', '$Size', '$Frees', '$Freep')";
    };
    $dbconnect -> do($req) or die "requete impossible";

    $dbconnect->disconnect();
    comme ça au final ça me permet d'avoir un mail envoyé à des destinataires (code non présent ici) + les infos présentes sur une page intranet

  3. #3
    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
    Ce genre de code est vraiment mauvais...
    Il y a un motif récurrent, il faut l'éliminer, peut-être même le mettre dans un module (et si tu es sous Unix tu as un excellent module pour la tache, IO::Prompt), de plus tu utilises mal le module DBI, préparer la requête une seule fois et la réutiliser sera beaucoup plus rapide. Il y avait également une erreur dans le script originel puisque tu ne faisais pas de chomp() : je doute que tu voulais vraiment des sauts de lignes dans ta base de données...

    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
    #!/usr/bin/perl
    use strict; use warnings;
     
    sub prompt {
      print @_, "\n";
      chomp( my $result = <STDIN> );
      return $result;
    }
     
    use DBI;
     
    my $db = '...';
    my $user = '...';
    my $pass = '...';
    my $dbh = DBI->connect($db, $user, $pass) 
      or die "connexion impossible";
     
    my $req = $dbh->prepare("INSERT INTO checkfs VALUES(?, ?, ?, ?, ?, ?, ?)");
     
    print "Veuillez entrer les infos, concluez en entrant une date vide.\n";
    while( my $Date = prompt "Date\n" ) {
      my $Hostname = prompt "Host\n";
      my $Volume = prompt "Vol\n";
      my $Label = prompt "Label\n";
      my $Size = prompt "Size\n";
      my $Frees = prompt "Freep\n";
      my $Freep = prompt "Frees\n";
      $req->execute( $Date, $Hostname, $Volume, $Label, $Size, $Frees, $Freep )
        or die "requete impossible";
    }
     
    $dbh->disconnect();
     
    __END__
    --
    Jedaï

  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 ça marche mieux mais dis moi
    ton code marche mieux et m'a régler un autre souci: une des infos dans la base de données ne s'affichait pas sur ma page php alors que la requête était correcte.

    corrige moi si je me trompe dans ce que je veux faire comme code

    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
    #!/usr/bin/perl
    use strict; use warnings;
    use DBI;
    use POSIX qw(strftime);
    
    
    partie 1 du code: récupération des infos depuis un fichier plat
    $Time = strftime "%Y%m%d", localtime; $Seuil="10%"; while (<>) { undef @free; chomp; if ( /System information for \\\\(.*)\:/ ) { $host = $1; } if ( /Fixed/ ) { 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; } } format STDOUT_TOP = @<<<<<<< Date, $Time @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>> Hostname, Volume, Label, Size, Frees, Freep . format STDOUT = @<<<<<<<<<;@<<;@<<<<<<<<;@>>>>>>>;@>>>>>>;@>>>> $host, $Volume, $Label, $Size, $Frees, $Freep
    fin de la partie 1 qui envoie le résultat dans un mail
    2e partie du code: récupération des variables pour les intégrer dans une db de manière automatique
    use DBI; my $db = 'DBI:...'; my $user = '...'; my $pass = '...'; my $dbh = DBI->connect($db, $user, $pass) or die "connexion impossible"; my $req = $dbh->prepare("INSERT INTO checkfs VALUES(?, ?, ?, ?, ?, ?, ?)"); while( my $Hostname != "" ) {
    le code est il valable pour récupérer les variables plus haut et les incorporer avec la requête qui suit?
    $req->execute( $Date, $Hostname, $Volume, $Label, $Size, $Frees, $Freep ) or die "requete impossible"; } $dbh->disconnect(); __END__
    merci

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

Discussions similaires

  1. problème sur requete insert
    Par shadowmoon dans le forum Langage SQL
    Réponses: 2
    Dernier message: 09/06/2005, 12h46
  2. ASP + pb requete Insert
    Par cell dans le forum ASP
    Réponses: 4
    Dernier message: 22/04/2005, 12h15
  3. petite aide sur une requete INSERT INTO
    Par bonneti dans le forum Langage SQL
    Réponses: 3
    Dernier message: 14/03/2005, 16h17
  4. Erreur lors d'une requete insert into.. select
    Par Mr N. dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 04/11/2004, 18h32
  5. effectuer une requete insert avec 'values' ET 'select'
    Par delaio dans le forum Bases de données
    Réponses: 4
    Dernier message: 15/08/2004, 20h05

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