2009-11-30 5 views
1

J'ai un hachage et j'essaie d'insérer ses valeurs dans la base de données. Hash est défini comme suit:Comment puis-je insérer des valeurs de hachage dans des colonnes avec DBI de Perl?

my %hash = (
      1 => 'First Word', 
      2 => 'Second Word is correct', 
      0 => 'Third word does not exist', 
      ); 

Je ne sais pas comment insérer des valeurs dans une base de données à l'aide hash. Je remarque que ma question est similaire à this question. Mais, aucune des réponses ne semble être correcte. Lors de l'utilisation de l'une des réponses listées, les valeurs dans hash ne sont pas insérées, à la place, la référence à hash est insérée, c'est-à-dire ARRAY(0x9e63b30). Mais quand je print Dumper @values, les valeurs sont imprimées et non les valeurs de référence.

Des suggestions pour insérer des valeurs et non leur référence? Et, qu'est-ce qui ne va pas dans les solutions énumérées dans les réponses à question.

@values ​​est défini identique à this question ie

my @values = values %hash; 

Edit: Structure Db:

T1:

sid sentence 
1 First Word 
2 Second Word is correct 
0 Third word does not exist 

dans sid ci-dessus est keys de hachage et de phrase est values de hachage.

ce que j'ai essayé (il est l'une des réponses à question):

my @keys = keys %hash; 

my @values = values %hash; 

my $sth = $dbh->prepare("INSERT INTO T1(sid, sentence) VALUES (?,?);"); 

$sth->execute_array({},\@keys, \@values); 

à nouveau, lors de l'insertion @values valeurs de référence sont insérés se.

EDIT:

_ SORTIE _

$VAR1 = 'First Word'; 
$VAR2 = 'Third word does not exist'; 
$VAR3 = 'Second Word is correct'; 

_ CODE _ voici comment j'insérer des valeurs en% hachage

my $x=0; 
foreach my $file(@files){ 
     if ($file =~ /regex/){ 
       push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6 $7"); 
     } 
     elsif ($file =~ /regex/){ 
       push(@{$hash{$x}}, "$1 $2 $3 $4 $5 $6"); 
     } 
     elseif ($file =~ /Hs_(.+)_(.+)_(.+)_(.+)_(.+)_W.+txt/){ 
       push (@{$hash{$x}}, "$1 $2 $3 $4 $5"); 
     } 
$x++; 
} 
+0

Toutes les réponses à cette question sont corrects othe. Avez-vous vraiment besoin d'aide pour mettre à jour une base de données ou avez-vous besoin d'aide pour travailler avec les structures de données standard Perl? – innaM

+0

@Manni: Si les réponses sont correctes, pourquoi les valeurs de référence sont-elles téléchargées dans db au lieu des valeurs réelles? – birdy

+1

Montrez-nous du code: au moins l'instruction sql et l'instruction execute. Et ensuite parlez-nous de votre base de données. Nous avons maintenant une idée de la façon dont vous voulez que ces valeurs se retrouvent dans votre base de données. Est-ce que les clés désignent des lignes, des colonnes ou aucun des deux? – innaM

Répondre

2

Ce n'est pas ce que vous avez posté à l'origine !!! Vous avez un hachage de référence à des tableaux. Lisez le tutoriel de référence perl (perlreftut) pour en savoir plus.

(Utilisez la commande

perldoc perlreftut 

pour accéder à ce tutoriel)

0

Ma réponse sur l'autre thread vous aviez lié à des œuvres. Je l'ai testé et utilisé à plusieurs reprises. Il n'utilise pas execute_array(), juste execute().

+0

Je veux insérer les clés et les valeurs dans la base de données et votre code ne le fait pas. c'est seulement l'insertion de valeurs. – birdy

+0

Quand vous dites 'clés', vous voulez dire que vous voulez remplir les champs 'sid' et 'phrase' avec leurs valeurs, n'est-ce pas? Si vous essayez de faire autre chose, je ne vous aurai pas .. et si c'est ce que vous essayez de faire, l'une des méthodes que nous avons expliquées devrait le couvrir. –

0

Cela devrait fonctionner.

my $key; 
my $value; 
while (($key, $value) = each %hash) { 
    $sth->bind_param(1, $key); 
    $sth->bind_param(2, $value); 
    $sth->execute(); 
} 
+0

Il est préférable d'écrire cette boucle comme 'while (mon ($ key, $ value) = chaque% hash)' – friedo

+0

non encore la référence est téléchargée plutôt que les valeurs réelles. – birdy

+0

Imprimez $ key et $ value dans la boucle pour voir si les valeurs obtenues à partir du hash sont correctes. –

0

MISE À JOUR:

Je suggère que vous prenez l'un des exemples fonctionnels de la thread précédente et le faire fonctionner sur votre machine avec votre base de données. Une fois que vous pouvez obtenir un de ces exemples de travail, vous devriez être en mesure de fixer votre propre code.


Réponse précédente:

Ma réponse sur l'autre thread qui utilise execute_array() fonctionne aussi, je l'ai testé avant de poster.

+0

cela fonctionne, mais, comme je l'ai mentionné, il télécharge des valeurs de référence au lieu des valeurs réelles. – birdy

+0

Si nous pouvions voir plus de votre code, nous pourrions peut-être vous aider. –

+0

J'ai ajouté un peu plus de mon code. ajouté comment im créer% hachage – birdy

Questions connexes