2012-09-18 25 views
1

我想使用單個查詢插入多個值到相同的字段。下面的代碼中是否有錯誤?下面的代碼有什麼不對嗎?

my $dbh = DBI->connect("DBI:mysql:accounting:localhost", 'username', 'password', 
     {RaiseError => 1}); 
my @id = [1,18,976,90]; 
my @name = ['ss','dc','ws','rd']; 
my @data = ([@id],[@name]); 
my $ab = $dbh->prepare("insert into table (id,name) values (?,?)";); 
for my $datam (@data) { 
    $ab->execute(@$datam); 
} 
$ab->finish(); 

我收到以下錯誤:DBI::st=HASH(0*a16f774) for prepare語句。什麼可能導致這個?

+1

這不是一個錯誤消息。你究竟得到了什麼? – ikegami

+0

我不認爲你的數據結構「@ data」是用你認爲它的結構創建的。 '@ data'只包含兩個條目,都是對數組的引用。 – mttrb

回答

6

真的不能回答你的問題,因爲你實際上沒有給出錯誤,但是我發現你的代碼存在問題。你做

$ab->execute([1,18,976,90]); 
$ab->execute(['ss','dc','ws','rd']); 

當你明明想做

$ab->execute( 1, 'ss'); 
$ab->execute(18, 'dc'); 
$ab->execute(976, 'ws'); 
$ab->execute(90, 'rd'); 

修復:

my @id = (1,18,976,90); 
my @name = ('ss','dc','ws','rd'); 

for my $i (0..$#id) { 
    $ab->execute($id[$i], $name[$i]); 
} 
+0

爲我的$我(0 .. $ id){正確?我沒有得到你.. – SSS

+0

不,沒有變量'$ id',所以這顯然是錯誤的。另一方面,'$#id'表示數組'@ id'的最後一個索引,這正是需要的。 – ikegami

+0

非常感謝你..它的工作原理 – SSS

3

我注意到,你的結構:

my @id = [1, 18, 976, 90]; 

是陣列與一個元素,這是數組引用。您可以通過模塊Data::Dumper檢查變量的結構。所以,你只需要簡單的數組:

my @id = (1, 18, 976, 90); 

使用數據::自卸車

use Data::Dumper; 
print Dumper(\@id); 

$VAR1 = [ 
     [ 
     1, 
     18, 
     976, 
     90 
     ] 
    ]; 

解決方案

use List::MoreUtils qw(each_array); 

my @id = (1, 18, 976, 90); 
my @name = ('ss', 'dc', 'ws', 'rd'); 

my $data = each_array(@id, @name); 

... 
while (my ($id, $name) = $data->()) { 

    $ab->execute($id, $name); 
}