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 :

problème d'exécution sql dans une boucle


Sujet :

SGBD Perl

  1. #1
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut problème d'exécution sql dans une boucle
    Bonjour,

    J'essaie de créer un écouteur d’événements en perl. Le fonctionnement est très simple, une requête select est envoyée dans une base *sql (mysql en l'occurrence pour le moment), le contenu de la table est récupérée, puis chaque événement est vidé à l'aide d'un DROP.

    Le problème est que j'ai ce message qui apparaît à chaque fois qu'il trouve un enregistrement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./daemon_pl line 44.
    Voici mon 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
    #!/usr/bin/perl
    use DBD::mysql;
    use Device::SerialPort;
    use Switch;
     
    sub dbConnect {
    	my $dbh = DBI->connect('DBI:mysql:xxxx', 'xxxxx', 'xxxxx' )
    		or print "Could not connect to database: $DBI::errstr";
     
    	return $dbh;
    }
     
    # Serial init
    # my $serial = Device::SerialPort->new("/dev/ttyUSB0") or die "Could not open device /dev/ttyUSB0";
    # $serial->databits(8);
    # $serial->baudrate(9600);
    # $serial->parity("none");
    # $serial->stopbits(1);
     
     
    #switch ($cmd) {
    #	case /^serial/ { print "serial - " . $cmd; }
    #	case /^ring/ { print "ring - " . $cmd; }
    #	case /^sys/ { print "sys - " . $cmd; }
    #	case /^initserial/ { print "initserial - " . $cmd; }
    #	else { print "command not recognized - " . $cmd; }
    #}
     
    while (1) {
    	while (! $dbh) {
    		print "Initialization of connection to DB" . "\n";
    		$dbh = &dbConnect();
     
    		if ($dbh) { print "Connection to DB initialized" . "\n"; }
    		else { print "Failed to initialize DB connection" . "\n";  }
    	}
     
    	$sth = $dbh->prepare('SELECT * FROM evt WHERE type="Send" ORDER BY tstamp')
    		or print $dbh->errstr;
     
    	$sth->execute() or print "Can't execute SQl request: $dbh->errstr" . "\n";
     
    	while ( my $res = $sth->fetchrow_hashref ) {
    		my $idEvt = $res->{idEvt};
    		my $type = $res->{type};
    		my $action = $res->{action};
    		my $hardName = $res->{hardName};
    		my $idHard = $res->{idHard};
    		my $hardKey = $res->{hardKey};
    		my $serial = $res->{serial};
     
    		print "One evt has been poped : $idEvt" . "\n";
    		print "\t- $type" . "\n";
    		print "\t- $action" . "\n";
    		print "\t- $hardName" . "\n";
    		print "\t- $idHard" . "\n";
    		print "\t- $hardKey" . "\n";
    		print "\t- $serial" . "\n";
    		print "\n";
     
    		print "Deleting evt id $idEvt from DB" . "\n";
    		$sth = $dbh->prepare('DELETE FROM evt WHERE idEvt=' . $idEvt)
    			or print $dbh->errstr;
    		$sth->execute() or print "Can't execute SQl request" . "\n";
     
    		print "evt $idEvt has been deleted from DB";
    	}
     
    	$sth->finish();
    }
     
    $dbh->disconnect();
    Ce qui donne quand il trouve un événement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    root@rasp [ ~ ] :: ./daemon_pl
    Connection to DB initialized
    One evt has been poped : 6
    	- Send
    	- test
    	- test
    	- 1234
    	- 134dqqaa543184qzesd84fd5341
    	- 123151851
     
    Deleting evt id 6 from DB
    DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./daemon_pl line 45.
    J'ai essayé de mettre l'init de dbh à l'extérieur de la boucle, et ce n'est pas la cause. J'ai également essayé de mettre en commentaire le finish ou de le mettre en dehors de la boucle, juste avant le disconnect, mais idem, ce n'est pas la cause du message.

    L'outil fonctionne bien, même si le message apparaît, mais je veux faire les choses proprement pour ne pas avoir à me poser 50000 questions le jour où j'aurai un bug.

    Vous auriez une petite idée ?

  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
    Bonsoir,

    pourquoi ceci : au lieu de ?
    Car si il y a une erreur à ce niveau, tout le reste du programme échouera.

  3. #3
    Membre habitué
    Profil pro
    Expert technique
    Inscrit en
    Septembre 2003
    Messages
    328
    Détails du profil
    Informations personnelles :
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert technique

    Informations forums :
    Inscription : Septembre 2003
    Messages : 328
    Points : 159
    Points
    159
    Par défaut
    Bonjour,

    Enf ait, j'ai mis des print au lieu de die pour que le programme continue, même si les requêtes ne passent pas pour que dans la prochaine boucle, la connexion à la database se refasse.

    ce n'est peut-être pas le meilleur moyen, mais pour le moment, je voudrai arriver à résoudre mes problèmes d'erreur avant de le faire plus proprement et de sécuriser ce bout de code.

    Une idée ?

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2009
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 30
    Points : 34
    Points
    34
    Par défaut
    tu réutilise le $sth sont avoir fait un $sth->finish();

Discussions similaires

  1. probléme de requete SQl dans une base SQL Server
    Par sasuma dans le forum Développement
    Réponses: 7
    Dernier message: 09/05/2009, 17h09
  2. Problème de requête SQL dans une boucle While
    Par Astraya dans le forum VB.NET
    Réponses: 3
    Dernier message: 21/01/2009, 17h18
  3. [MySQL] Problème de SQL dans une boucle
    Par Bozomobile dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 01/11/2008, 20h17
  4. [SQL] Boucle SQL dans une boucle for
    Par architecte dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 14/08/2007, 11h47
  5. [MySQL] Requetes SQL dans une boucle PHP
    Par Siteac dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 12/11/2006, 14h35

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