2009-02-16 4 views

Répondre

1

Quelque chose comme:

sub insertRow 
{ 
    my $table = shift; 
    my $placeholders = join(',', map { "?"; } @_); 
    $dbh->do("INSERT INTO $table VALUES ($placeholders)", undef, @_); 
} 

Modifié: vous devez ajouter undef comme paramètre. Leon Timmermans suggère de ne pas utiliser de prototypes

+0

Downvote parce que votre prototype provoque le dysfonctionnement du code d'une horrible façon horrible. Vous ne devriez pas utiliser de prototypes quand vous ne savez pas exactement ce qu'ils font, et même eux, il n'y a absolument aucune raison d'utiliser le prototype que vous venez de suggérer. –

+0

Mais sauf pour le prototype son bien? –

+0

Quel est le problème? – kmkaplan

0

Passez simplement une référence à un tableau d'arguments. Ensuite, dans insertRow, parcourez ce tableau pour obtenir les arguments ...

4

La meilleure solution est probablement d'utiliser un système ORM tel que DBIx::Class. Ils rendent la manipulation de SQL beaucoup plus facile.

Si vous choisissez de rester sur DBI cru, je vous conseille d'utiliser des déclarations préparées comme ceci:

my $query = sprintf 'INSERT INTO %s VALUES(%s)', dbh->quote_identifier($table), join ',', ('?') x $columns; 

my $sth = $dbh->prepare($query); 

for my $row (@rows) { 
    $sth->execute(@{$row}); 
} 

Ce sera un avantage de vitesse et de robustesse.

Vous pouvez tout emballer dans un sous-marin, mais un ORM offre probablement une meilleure solution de toute façon.

+0

Y a-t-il une faute de frappe à la fin de sprintf ou est-ce juste un mini buggy d'opéra? –

+0

Vous avez raison, c'est une faute de frappe. Je l'ai réparé. –

+0

Je ne comprends pas complètement le code. Qu'est-ce que @ $? Et quelque chose manque-t-il à la fin de la requête? –

0

Le paramètre qui passe une partie est assez facile:

sub foo { 
    my $table = shift; 
    my @stuff_to_insert = @_; 

    # Do stuff here 
} 

Peu importe si vous passez un paramètre, ou cinq, ou cinquante, ils font tous dans @stuff_to_insert.

Pour exécuter les requêtes réelles, suivez les conseils de Léon et utilisez les instructions préparées. (ORMs peuvent être maniables, mais, IMO, ils sont surestimés et sont sérieusement exagérés dans les cas simples.)

Questions connexes