PERLでMYSQLにデータが入りません。


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;

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2012/02/23 17:32:50
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:JULY No.1

回答回数966ベストアンサー獲得回数247

ポイント100pt

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;
}
id:robopit

そのとおりです。
必要だったのはinsertでした。お恥ずかしい限りです

2012/02/23 17:30:53

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません