Perl: afficher le résultat d'une requête sql - Perl - Programmation
Marsh Posté le 07-02-2012 à 11:34:01
Bonjour,
Le retour du $prep->execute est défini, et vaut une valeur non nulle?
Que donne un appel à $prep->err() après le $prep->fetchrow_hashref?
A+,
Marsh Posté le 07-02-2012 à 21:13:42
Bonsoir,
Tout d'abord merci de votre réponse, ensuite j'ai choisi au final la méthode array et le problème venait du fichier texte en lui-même .
En effet, la particularité est qu'il y a retour chariot et j'ai complétement oublié donc de supprimer le dernier caractère pour la variable $nom_interface_choisie.
Pour répondre à ta question, oui pour prep -> execute la valeur est non nulle
Cependant je fais face à un nouveau problème (hé oui mais promis c'est le dernier pour ce script ) . je vais détailler chaque partie pour faire simple :
Code :
|
jusqu'à l'execute pas de problème, je vide le tableau pour pouvoir faire autant de graphique qu'il y a de ligne
Code :
|
J'ai remplacé ici la méthode hashref par array (difficulté à comprendre la notion encore ) , les résultats (2 résultat plus précisément ex: 55 correspondant au ping, 56 à la mémoire, sachant qu'un service peut être lié à 2 fichiers) renvoyée par la requête sont stockées dans le tableau @tab_donnees. Pourquoi une variable pour une cellule?
La raison est simple, car je veux l'utiliser à la suite pour créer un graphique sachant que la plupart du temps 2 fichiers correspondent à un service.
Code :
|
Là c'est du bash, on remarque que j'utilise les variables perl précédemment citées. Le script bash a déjà été testé auparavant, il fonctionne, sauf pour le nom de l'image ce sera la première fois. Lorsque je lance tout ce jolie petit script perl il m'affiche une erreur, celle que $result2 n'est pas initialisé je l'ai fait une fois et cela n'a rien changé. Je suppose que si $result2 a un problème, $result aussi :x
Voilà si tu as une idée, tu es le bienvenu
Encore merci pour ton aide et bonne soirée
P.S : It's the only neet thing(...) = kamisama no memochou?
Marsh Posté le 07-02-2012 à 23:24:32
A vue de nez, c'est quelque chose comme ceci que vous voulez, non?
Code :
|
A+,
P.S. Tout a fait.
Marsh Posté le 08-02-2012 à 10:50:19
Bonjour,
Encore merci pour l'aide .
Ensuite pour la variable "@donnees" pourrais-tu me dire pourquoi tu l'utilise de cette façon, je la déclare toujours comme "$donnees" vu que c'est la variable scalaire qui va tout récupéré afin de mettre le tout dans le tableau @tab_donnees. De plus le push, tu met un tableau dans un autre, cela n'en revient-il pas au-même?
j'ai essayé ta solution, lors de l'éxécution du script on me conseille de passer "@donnees" à "$donnees" et je te remercie de prendre le temps de répondre à mes questions
Enfin j'ai trouvé une chose j'ai fais un print de $result et $result2 et j'ai remarqué que le tableau n'a pas été vidé, je pensais qu'il n'y aurait qu'à le réinitialiser au debut de la boucle (sachant qu'il est déclaré en dehors)
D'où le problème de création du graphique si on met 2valeurs collées ensemble pour créer le graphique c'est sûr que ça marchera pas .
Code :
|
cela ne suffit il pas pour vider le tableau?
Je cherche actuellement d'autres solutions pour vider le tableau, aprés avoir trouvé cette solution je pense que le script fonctionnera mieux .
Merci et bonne journée
Marsh Posté le 08-02-2012 à 12:44:21
$prep->fetchrow_array renvoie des choses distinctes selon que l'on l'utilise en contexte scalaire ou array, c'est dans la doc:
Citation : @ary = $sth->fetchrow_array (); |
et ce me semble être le tableau que vous voulez exploiter.
Citation : De plus le push, tu met un tableau dans un autre, cela n'en revient-il pas au-même? |
Non, si c'est un scalaire que vous mettez dans le tableau, ça ne va y mettre qu'une seule valeur, pas plusieurs. Pour mettre un tableau dans un autre avec push, il faut que le second argument soit un tableau.
En Perl, un tableau ne peut pas être représenté par un scalaire. Tout au plus vous pouvez représenter une référence a un tableau par un scalaire.
my @tab; #un tableau
my $tabref = \@tab; #une reference à @ tab, auquel on peut accéder comme @{$tabref}
Citation : $tableau =(); |
vu que $tableau ne peut pas être un tableau (vu le $ initial), je ne sais pas comment perl comprends cela, mais il y a rien à vider.
Vous avez bien mis
use strict;
use warnings;
en debut de script afin que l'interpréteur vous signale les erreurs?
A+,
Marsh Posté le 08-02-2012 à 14:47:02
Concernant :
Code :
|
faute de frappe
Code :
|
bien sûr @tableau étant un exemple
Ensuite lors du parcours d'un tableau, je suis obligé d'utiliser le $
Code :
|
puis concernant le print je remarque que $donnees[0] prend deux valeur , $donnees[1] n'en prend aucune alors que je veux que la première valeur soit dans $donnees[0] et la seconde valeur dans $donnees[1]
Par exemple :
J'ai le service interface il est composé de deux choses : le traffic entrant et le traffic sortant.
Chacun de ces traffics correspondent à une "metric_id" particulière(ex: metrics_id du traffic entrant =54, et sortant = 55), la méthode est bonne, cependant je retrouve les 2 metric_id de l'interface dans $donnees[0] ( 5455) alors que je veux la metric_id du traffic entrant dans $donnees[0] (54) et la metric_id du traffic sortant (55) dans $donnees[1].
Je dois certainement utiliser une méthode de type split pour arranger ça mais comment l'utiliser s'il n'y a rien pour les séparés :x
Encore merci et bonne journée
Marsh Posté le 08-02-2012 à 15:16:42
Si je fais comme ça :
Code :
|
cela stocke (en reprenant l'exemple d'au-dessus) 5454 dans $tab_donnees[0] (aucune idée pourquoi 2 fois la même valeur uniquement pour cette cellule) et 55 dans $tab_donnees[1]
aprés la méthode est-elle la bonne par rapport à l'autre? ^^"
Maj: La méthode pour vider le tableau était mauvaise j'ai remplacé par :
Code :
|
Résultat le coup de la valeur noté deux fois dans la 1ere cellule a disparu
Malgré le bon affichage, j'ai cette erreur pour chaque cellule que je met en print :
Use of uninitialized value $result in print at fifi.pl line 68, <FILE> line 2
La ligne 68 correspondant a l'affichage du contenu de la cellule (ici $result)
Merci d'avance pour ton aide
Marsh Posté le 08-02-2012 à 15:44:45
Citation : Maj: La méthode pour vider le tableau était mauvaise j'ai remplacé par : |
Non non,
@nomdutableau=undef; ça met l'objet tableau à null
@nomdutableau=undef; ça met l'objet tableau à une liste vide.
Dans les deux cas, ça vide le tableau.
Citation : puis concernant le print je remarque que $donnees[0] prend deux valeur , $donnees[1] n'en prend aucune alors que je veux que la première valeur soit dans $donnees[0] et la seconde valeur dans $donnees[1] |
Si le résultat d'un fetchrow_array renvoie tout dans un seul élémént, alors il va falloir splitter le contenu de cet élément selon ce qui vous arrange.
Tout je que je sais, c'est que ce qui est renvoyé est le champ metrics.metric, je ne sais pas ce qu'il y a dans ce champ, c'est vous qui devez connaitre la structure des données et savoir si le contenu d'un champ doit être splitté.
A+,
Marsh Posté le 08-02-2012 à 17:42:12
Bon grâce à toi je sais comment avancer dans le script correctement et j'ai pu apprendre quelques notions. Je posterai la partie du script corrigé lorsqu'il sera terminé.
Donc merci, bonne soirée et à la prochaine.
Marsh Posté le 08-02-2012 à 18:06:08
Bonsoir
Note: je pense que $prep->fetchrow_array ca renvoie ses données dans un array quand le select renvoie plusieurs champs, chacun étant dans un element de l'array.
Quand le select renvoie un seul champ, il est probable que ca doit aussi marcher avec un scalaire, mais il faut tester.
A+,
Marsh Posté le 10-02-2012 à 09:06:15
Bonjour,
Comme promis voici le script
Code :
|
Pour la répétition de la même valeur, c'était juste le mauvais tableau qui a été utilisé : @tab_donnees au lieu de @donnees
Ensuite le graphique était placé au mauvais endroit, il fallait effectuer l'éxécution en dehors de la boucle while et déclarer(+ initialiser) les variables $result et $result2 aussi.
Tout ce jolie script dont la boucle while se trouve dans la boucle foreach citée plus haut. Car l'execution concerne chaque ligne du fichier copier dans le tableau.
Enfin pour le problème du nom du graphique créer, c'était juste un problème de casse, il fallait donc substituer la partie du nom qui ne passait pas avec la méthode suivante :
exemple : remplacer london par London
Code :
|
Voilà j'espère que cela sera utile aux gens qui ont des problèmes de ce genre
Bonne journée et encore merci pour l'aide apportée
Marsh Posté le 06-02-2012 à 21:59:59
Bonsoir,
Je suis un débutant en Perl depuis 2 semaines environ et je dois dire que je suis bloqué sur un point. Tous d'abord l'OS sur lequel je suis est Debian squeeze, et mon problème provient du résultat que je veux obtenir. je n'arrive pas à l'afficher, pire je n'ai aucune erreur :s
Le but est qu'a partir des données d'un fichier texte je remplisse les champs manquant de ma requête sql, que je l’exécute autant de fois qu'il y a de lignes.
Voici la requête SQL :
Et la partie du code Perl sur lequel j'ai des difficultés :
Admettons que le fichier texte contient ces deux lignes :
Supervision, ping
ServDNS, mémoire
La requête sql s’exécute et prends pour valeur :
index_data.host_name = Supervision
index_data.service_description = ping
Après l’exécution de la requête le résultat renvoyé est stocké dans un tableau, repart dans la boucle pour effectuer la même chose avec la seconde ligne puis affiche la "metric_id" correspondante à chaque "service_description".
Je vous remercie d'avance et bonne soirée