sql : selectall_hashref (sans connaitre le nom des colonnes)

sql : selectall_hashref (sans connaitre le nom des colonnes) - Perl - Programmation

Marsh Posté le 13-06-2010 à 02:08:05    

Salut ! :)
 
voila mon probleme :
 
my $sqlres = $sqlh->selectall_hashref("SELECT * FROM table", "name" );
 
Ensuite, je peux récupérer mes colonnes par des :
$sqlres -> {robert} -> {col}
 
Mais voila, comment je fais pour récupérer toutes les colonnes de robert sans connaitre leur nom à l'avance ?
 
Mon but serait de me créer un hash dont le contenu ressemblerait à ca :
<i>(sans doute grace à l'imbrication de 2 foreach)</i>
 
(
"robert col1", "...",
"robert col2", "...",
"robert col3", "...",
"marcel col1", "...",
"marcel col2", "...",
etc.
)
 
 
MERCI BEAUCOUP PAR AVANCE ! :D


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 13-06-2010 à 02:08:05   

Reply

Marsh Posté le 13-06-2010 à 09:01:45    

Si je comprends bien, $sqlres est une référence sur un hash, et vous cherchez les valeurs des clés de ce hash.
Il va donc d'abord déréférencer pour obtenir le hash: %{$sqlres}, puis obtenir la liste des clés: keys %{$sqlres}
Si la valeur du hash associé à une clé est aussi une référence sur un hash (ce que la double flèche dans $sqlres -> {robert} -> {col} suggère), on utilise la même technique. Une utilisation de Data::Dumper peut permettre de voir quelle est la structure de données exacte de $sqlres, pour la mise au point.
A+,


Message édité par gilou le 13-06-2010 à 09:08:44

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 13-06-2010 à 17:55:04    

salut !
ok, merci je viens de comprendre !
Donc voila ce que ca donne si on veut lister toute la table :
 
foreach( keys(%$sqlres) ){
  my $a = $_;
  print("$a :\n" );
  foreach( keys(%{ $sqlres->{$a} }) ){
    my $b = $_;
    print("  $a : $b : $sqlres->{$a}->{$b}\n" );
  }
}


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 13-06-2010 à 19:45:22    

Oui, c'est ce que je suggérais.
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 14-06-2010 à 06:21:26    

dis moi Gilou, pendant que je te tiens ;) j'aurais juste une autre question qui ne vaut pas la peine de créer un topic....
 
-> comment je suis sensé faire mes requetes do("INSERT ..." ) et UPDATE lorsque le contenu de ma variable n'est pas très safe ?
 
Suffit d'escaper les ' et mettre la variable entre ' ?
je ne sais pas pourquoi mais je sens ca dangereux... (données binaires, ou commande sql qui arrive à passer...)
 
MERCI !


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Marsh Posté le 15-06-2010 à 00:15:28    

bonjour à tous,
 
en dbi le do a les "bind values" : la requête en soit est "safe" (pas de protection particulière à faire), par contre, il faut que la conversion vers le type cible de la colonne soit faisable, sinon l'insert (ou l'update) plantera.
 
Qqchose du style suivant devrait marcher :

Code :
  1. $dbih->do("INSERT INTO toto(col_str,col_int, col_date) VALUES ( ?, ?, ? )",undef,["chaine pourrie contenant des caractères spéciaux : ?, )", 1, "2010/12/12 20:00:00"]);


 
d'ailleurs les binds values sont plus que préconisées pour les perfs d'insert/update, car comme la requête en elle même est "stable" il est quasi certain que la BDD réutilise le même curseur (au moins sur oracle) et donc évite de se retaper le plan d'exec et autres joyeusetés ...


Message édité par dreameddeath le 15-06-2010 à 00:16:33
Reply

Marsh Posté le 15-06-2010 à 00:30:40    

Bonjour dreameddeath et merci !
 
Je vais potasser un peu ca car les bind values sont un concept nouveau que tu me fais découvrir à l'instant :)


---------------
La vie c'est comme une boite de chocolats, on ne sait jamais sur quoi on va tomber. (Forrest Gump)
Reply

Sujets relatifs:

Leave a Replay

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