Web::Scraperで取得したデータを配列に入れて
ループを使ってMYSQLに入れたいのですが、データがなぜか入りません
DB、SQLの接続チェックではエラーはでず
ループの外においても動きません
なぜ、動かないか原因がわからず困っています。
どこに間違いがあるか教えてください
my $dsn = 'DBI:mysql:rank:localhost';
# ユーザ名
my $user = 'ユーザID';
# パスワード
my $password = 'パス';
$dbh = DBI->connect($dsn, $user, $password);
if(!$dbh){
print "接続失敗\n";
exit;
}
省略
my $scr = $scraper->scrape($url);
foreach my $scr_data (@{$scr->{src}}) {
my $sql = "update rankdata set ";
$sql .= "rank='" . $scr_data->{RANK} . "',";
$sql .= "name='" . $scr_data->{name} . "'";
$sth = $dbh->prepare($sql);
$sth->execute;
}
$sth->finish;
$dbh->disconnect;
prepare に渡す $sql の中身は多分、
update rankdata set rank='1',name='abc'
といった具合になると思いますが、これは意図したものになってますか?
この SQL だと、rankdata テーブルのすべてのレコードに対して、rank を '1' に、name を 'abc' にする、という意味になります。ということは、rankdata が空であれば何も起きないし、すでにレコードがあっても、rank と name が、foreach で最後に取り出された時の値で、すべてのレコードが更新されることになります。
ひょっとして、insert したかったのでは?
foreach my $scr_data (@{$scr->{src}}) { my $sql = "insert into rankdata (rank, name) values ("; $sql .= "'" . $scr_data->{RANK} . "',"; $sql .= "'" . $scr_data->{name} . "')"; $sth = $dbh->prepare($sql); $sth->execute; }
そのとおりです。
2012/02/23 17:30:53必要だったのはinsertでした。お恥ずかしい限りです