Questions débutant DBI + Suivi de variables

Questions débutant DBI + Suivi de variables - Perl - Programmation

Marsh Posté le 21-07-2004 à 22:10:05    

Bonjour à tous..
 
J'ai commencé le perl il y a 3 jours, je consulte quelques docs, mais ces questions me hantent ce soir, et comme je n'ai pas trouvé tout de suite, j'espère que vous allez pouvoir m'aider
 
Question 1 : DBI
 
hop une fraction de code :  

Code :
  1. #x lignes de code avant
  2. my $sth = $dbh->prepare("select nom,prenom from elv where nationalite like '$nom_rech%' order by nom" );
  3. #x lignes de code avant
  4. $sth->execute();
  5. #x lignes de code avant
  6. @res;


Juste après, suit en principe ma ligne de récup des données, du genre @res[$i]= $sth->fetchrow; le tout dans une boucle pour choper tous mes résultats. Ceci marche ( c'est peut être sale comme manière dsl :x ).
 
Mais si je fais un select de 2 colonnes, puis je choper les résultats dans un tableau en 2 dimensions ? j'ai essayé et ça ne marchait pas..
 
 
Question 2 : Variables
Je cree en réalité un formulaire, html/perl..
Mon formulaire se compose d'une suite de .pl, avec un code type de départ du type :

Code :
  1. #!/usr/local/bin/perl
  2. use CGI qw(:standard);
  3. use DBI;
  4. print "Content-type: text/html\n\n";
  5. open (F, "< rens1.html" );
  6. my @page = <F>;
  7. my $page = join(" ", @page);
  8. print "$page\n";


Sur le html est toute la mise en forme, les questions, les menus déroulants pour les choix, etc.. et sur les perl le traitement des données.
La question arrive
Admettons sur mon fichier 1.pl->1.html, j'ai 3 input avec du texte.. Je récupère dans le fichier 2.pl, sans aucun problème, les données du formulaire d'avant, avec des lignes du type my $nom_rech = param("nom_rech" );.
Mais j'ai essayé, dans le 3.pl par exemple, je n'ai plus accès à cette variable ! Je comprends bien, celle ci n'est plus envoyé à nouveau ... J'ai entendu parlé d'utilisations de champ invisibles contenant les variables pour les faire suivre dans ce cas... Est ce la voie ou voyez vous une autre solution ? Le but du jeu est d'avoir à la page n.pl toutes mes variables dispo pour un update de base de données...
 
Merci à tous pour les, j'espère, futures réponses.
 
++
 
 

Reply

Marsh Posté le 21-07-2004 à 22:10:05   

Reply

Marsh Posté le 21-07-2004 à 23:28:38    

pour ta premiere question, regarde du coté de fetchroaw_arrayref, fetchraw_hashref et compagnie
 
pour ta seconde question je ne suis pas vraiment au point sur les CGI et compagnie, mais une chose est sure: tu ne peux pas passer de variable d'un script à l'autre sans systeme de persistance (yen a, mais c'est plus chiant à faire que des simple CGI (genre http://search.cpan.org/~vipul/CGI- [...] sistent.pm ). Dans ton cas je pense que les champs hidden sont la meilleure solution.

Reply

Marsh Posté le 22-07-2004 à 09:13:57    

Salut
Merci pospos, en effet les champ hidden sont une solution correcte, ça marche..
Par contre je fais comme ça :

Code :
  1. print '<input type="hidden" value="';
  2. print "$specib";
  3. print '" name="specib"></form>';


Sinon il ne reconnait pas la variable... Il n'y aurait pas moyen de faire ça en une ligne ? Ca serait bcp plus élégant ..
 
Pffffffff trouvé  
print '<form><input type="hidden" value="',"$specia",'"name="specia">';
fonctionne..
 
j'ai rien dit ;) merci


Message édité par emrys-fr le 22-07-2004 à 09:17:52
Reply

Marsh Posté le 22-07-2004 à 11:37:26    

et tu peux enlever les "" autour de ta variable (a remettre l'espace que tu a viré devant 'name=')
En gros tout ca donnera le meme resultat, à toi de choisir:
 

Code :
  1. print '<form><input type="hidden" value="', $specia, '" name="specia">';
  2. print "<form><input type=\"hidden\" value=\"$specia\" name=\"specia\">";
  3. ou meme :
  4. print "<form><input type='hidden' value='$specia' name='specia'>";

Reply

Marsh Posté le 22-07-2004 à 15:06:30    

En effet c'est un peu plus clair comme ça, nickel, merci )
 
une nouvelle question, si je peux me permettre..
 
Mettons page 1, on a un choix avec des input de type radio ..
On récupère la valeur dans la page 2.pl, et selon la valeur, on veut pouvoir charger une page html différente..
 
On a qqchose comme ça au chargement de la page

Code :
  1. print "Content-type: text/html\n\n";
  2. open (F, "< select1.html" );
  3. my @page = <F>;
  4. my $page = join(" ", @page);
  5. print $page;


Ci dessus c'est le cas de base..
 
Là, je voudrais en fait d'abord charger une page html de départ, contenant quelques boutons & co, et selon la valeur de mon choix précédent, y ajouter une autre page, où on trouvera d'autres menus déroulants, enfin tout un tas de trucs...
 
Je tatonne avec les join, et ça ne marche pas trop là :s
 

Reply

Marsh Posté le 22-07-2004 à 15:23:10    

pourkoi tu fais pes des fonctions que tu appel et qui print ce qu'elles veulent?
 
 
bon, sinon pour ton chargement de fichier tu fais des etapes inutiles
 
tu peux faire:
 

Code :
  1. open (F, "< select1.html" );
  2.   print join(" ", <F> );


 
ou bien mieux (plus rapide et consommant moins de ram) :

Code :
  1. open (F, "< select1.html" );
  2.   print do { local $/; <F> };


 

Reply

Marsh Posté le 22-07-2004 à 15:44:09    

pospos a écrit :

pourkoi tu fais pes des fonctions que tu appel et qui print ce qu'elles veulent?


C'est mon maître de stage qui veut que je travaille comme ça, il tient à séparer un maximum le html du perl.. Pour faire plus propre dans son idée je pense ;)
 
Et merci pour le do je vais tester :) Mais que fait il exactement ?


Message édité par emrys-fr le 22-07-2004 à 15:46:23
Reply

Marsh Posté le 22-07-2004 à 16:13:49    

si tu veux vraiment un truc propre alors regarde du coté de Mason, c'est un framework excellent:
http://search.cpan.org/~drolsky/HTML-Mason-1.26/
 
alors le do:
kand tu lis <F> en contexte de liste (par exemple avec un print ou en l'assignant à un array) Perl va créer une liste des lignes du fichiers. Donc à chaque "\n" (ou autre retour de ligne) il crait un nouvel element. Mais en fait tu peux lui donner un autre separateur que \n (par exemple '-' ou autre...) grace à la variable $/ (donc par defaut $/="\n" ).
Et si tu vide $/ alors Perl ne decoupera plus rien du tout et te renverra le fichier entier comme seule element du tableau.
donc:
$/=undef;
$fichier = <F>;
 
mais $/ est une vairable globale, donc si tu la modifie ici ca va foutre la merde partout, donc il faut mettre un local et mettre tout ca dans une portée pour ne pas affecter le reste:
 
{
  local $/; # inutil de le mettre à undef, local le fait d'office
  $fichier = <F>;
}
 
et le do() a ici le meme role que les {} : faire que la modification de $/ soit locale au do(). do() va retourner la derniere valeure evaluée, et voila


Message édité par pospos le 22-07-2004 à 16:14:40
Reply

Marsh Posté le 23-07-2004 à 15:38:02    

Re bonjour, merci pospos encore une fois pour les détails..
 
je poste une nouvelle question, je préfère ne pas faire de nouveau sujet ;)
 
Alors mon projet est bien avancé..
J'ai maintenant un problème étrange.. Mais alors étrange -_- j'explique :
j'en suis vraiment tout à la fin.. je récup une donnée de la bdd :

Code :
  1. my $req_dipder = $dbh->prepare("select diplome from elv where nom='$nom' and prenom='$prenom'" );
  2. $req_dipder->execute();
  3. my $dipder_temp = $req_dipder->fetchrow;
  4. print " dipder_temp : $dipder_temp<br>";


J'ai mis le print du dessus pour vérifier qu'il recevait les bonnes chaines, c est le cas.
 
Ensuite, tout bêtement, j'adapte le code reçu à coup de if elsif else... Du moins je voudrais bien !
Voilà mon code :

Code :
  1. my $dipder;
  2. if ($dipder_temp = 'ATS')
  3. {
  4. $dipder='E';
  5. }
  6. elsif ($dipder_temp = 'DUT')
  7. {
  8. $dipder='C';
  9. }
  10. elsif ($dipder_temp = 'LICENCE')
  11. {
  12. $dipder='Z';
  13. }
  14. else{
  15. }
  16. print "$dipder";


 
En sortie, pour dipder_temp qui m'écrit DUT, j'ai E en dipder  :heink: Il rentre dans le premier if et s'en fout complètement du reste .. Si je mets des suite de if au lieu des elsif/else, j'ai toujours en sortie la valeur résultante du dernier if ... on dirait vraiment qu'aucun test n'est fait.. Je comprends très, très mal..
 
j'ai testé simple =, ==, mettre des quote à la place des ", ne rien mettre, etc... Rien ne marche jusqu'ici.
Ca me fait un effet bizarre de planter sur un if de base alors que la bdd sur laquelle je m'arrachais les cheveux en C se passe en une ligne en perl  :??:

Reply

Marsh Posté le 23-07-2004 à 15:41:53    

pour comparer des chaines de caracter il faut utiliser 'eq' et non '='

Reply

Marsh Posté le 23-07-2004 à 15:41:53   

Reply

Marsh Posté le 23-07-2004 à 15:42:40    

et d'ailleurs ca serait plutot '==' que '='!
la tu fais une simple assignation.
mais dans tous les cas c'est 'es' qu'il te faut ici

Reply

Marsh Posté le 23-07-2004 à 15:46:35    

oui tout à fait == , mais c'était au cas où :p
 
En fait j'ai trouvé la réponse une minute après avoir posté, la recherche google n'avait pas été super fructueuse et rapide :s
 
Merci une fois de plus.. J'aurai appris un détail important là ;)

Reply

Marsh Posté le 26-07-2004 à 17:07:51    

Allez on reprend les mêmes, et on recommence !
 
Mon update final de base de données ne marche pas, et je ne comprends pas du tout pourquoi -_-  
Chaque champ a été vérifié juste avant la commande finale, avec des print, et ils sont tous conformes...
 

Code :
  1. my $req_update=$dbh->prepare("update elv2 set idetu =?, compos=?, inspr=?, regime=?, bac=?, acabac=?, anbac=?, situpre=?, curpar=?, paripa=?, cp_etu=?, paypar=?, cp_par=?, pcspar=?, echang=?, diplom=?, niveau=?, specia=?, specib=?, specic=?, reimma=?, ansup=?, cometu=?, comref=?, lcometu=?, lcomref=?, profil=?, typrepa=? where promo=? and numero_ordre=?" );
  2. $req_update->execute($idetu,$compos,$inspr,$regime,$bac,$acabac,$anbac,$situpre,$curpar,$paripa,$cp_etu,$paypar,$cp_par,$pcspar,$echang,$diplom,$niveau,$specia,$specib,$specic,$reimma,$ansup,$cometu,$comref,$lcometu,$lcomref,$profil,$typrepa,$promo,$num);


La bdd n'est pas updatée :(
 
perl ne me donne aucune erreur à l interprétation
Je suis en autocommit au niveau de la connexion bdd... mais même en l enlevant, et en committant à la main derrière la requête, rien ne se passe ..
 
Quand je tente le même genre d update à la main sous sqlplus, ça marche :s
( Oracle 9i inside )
 
Je suis désespéré :p

Reply

Marsh Posté le 26-07-2004 à 17:32:28    

souvent dasn ce genre de probleme la bonne demarche est de chercher à isoler ce qui merde: essai avec des updates plus petis, ou sur un table de test, ou sans preparer ta requete, etc...

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed