Précédent   Forum du club des développeurs et IT Pro > Autres langages > Perl > SGBD
SGBD Toutes vos questions sur l'interaction entre Perl et les bases de données (SQL, mysql, postgresql, ORACLE, ...) Avant de poster, veuillez consulter les FAQs perl, les cours Perl.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 31/12/2012, 15h33   #1
zerros
Membre régulier
 
Inscription : septembre 2003
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 245
Points : 75
Points : 75
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 :
DBD::mysql::st fetchrow_hashref failed: fetch() without execute() at ./daemon_pl line 44.
Voici mon code:
Code :
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 :
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 ?
zerros est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/01/2013, 18h19   #2
djibril
Responsable Perl et Outils

 
Avatar de djibril
 
Homme
Inscription : avril 2004
Messages : 13 563
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 33
Localisation : France

Informations forums :
Inscription : avril 2004
Messages : 13 563
Points : 31 778
Points : 31 778
Bonsoir,

pourquoi ceci : au lieu de ?
Car si il y a une erreur à ce niveau, tout le reste du programme échouera.
__________________
Pas de questions technique par messagerie privée (lisez les règles du forum Perl) et pour les nouveaux !
djibril est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/01/2013, 07h40   #3
zerros
Membre régulier
 
Inscription : septembre 2003
Messages : 245
Détails du profil
Informations forums :
Inscription : septembre 2003
Messages : 245
Points : 75
Points : 75
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 ?
zerros est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2013, 15h15   #4
salivie
Candidat au titre de Membre du Club
 
Homme Guadi
Ingénieur développement logiciels
Inscription : septembre 2009
Messages : 30
Détails du profil
Informations personnelles :
Nom : Homme Guadi
Localisation : Maroc

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

Informations forums :
Inscription : septembre 2009
Messages : 30
Points : 11
Points : 11
tu réutilise le $sth sont avoir fait un $sth->finish();
salivie est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h09.


 
 
 
 
Partenaires

Hébergement Web