• ベストアンサー
  • 困ってます

MySQLとの接続でfetchrow_arrayがwhile文で使えない

  • 質問No.2092571
  • 閲覧数769
  • ありがとう数1
  • 気になる数0
  • 回答数1
  • コメント数0
こんばんは、皆さん。

MySQLをPerlから使いたいのですが、
以下のようにやっても、$flagに"OK"が入りませんでした。
つまり、whileは一度もループしないで抜けてしまっているようです。
-------------------------------------------------
use DBI;

sub dbtest{
$dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass");
$sql = "select hoge,fuge from t_name where key='value'";
$sth = $dbh->prepare($sql);
$sth->execute;
while( ($hoge, $fuge) = $sth->fetchrow_array ){
    $flag = "OK";
}
$sth->finish;
$dbh->disconnect;
}
-------------------------------------------------
※実際はユーザ名などは変数にしています。

バージョンは現在、
Perl:v5.8.5
MySQL:5.1.6-alpha
となっているようです。

それとちょっと別件ですが、
use autouseの書式は以下でよいのでしょうか?
「use autouse DBI;」
しかし、これだけだとDBIが読み込めてないエラーになるようです。

ご教示よろしくお願いします。

質問者が選んだベストアンサー

  • 回答No.1
  • ベストアンサー

ベストアンサー率 71% (168/235)

> $flagに"OK"が入りませんでした。

入らない原因として考えられるのは

・そのSELECTの結果が空(つまり結果がゼロ件)→だからwhile内が実行されない
・SQL文の文法ミスなどでprepareまたはexecuteが失敗
・そもそもconnectでのデータベースへの接続に失敗している

があります。
どこか失敗していないか確認してみては?

> use autouseの書式は以下でよいのでしょうか?

autouseはモジュールの遅延ロードを行うためのもののようですが、DBIを遅延ロードさせる必要があるのでしょうか?
普通に
use DBI;
でよいと思いますが遅延させたい特別な理由でもあるのでしょうか?

http://slashdot.jp/~nekoie02/journal/
↑を見るとautouse使用時の注意点が2点ほど書かれています。
読んでみてください。
お礼コメント
noname#17299
SQLで持って来れていないようですね。
でも、PerlからでなくコマンドラインからMySQLに接続して、
同じSQL文を実行しても、正常に持ってきていました。
どこかに間違いがあるはずなので、探してみます。

また、遅延ロードというか動的なロードという意味で理解しています。
CGIの動作が重いので、DBにアクセスしないうちは、ロードしないほうが
動作が軽快になると思ったので、指定してみたかっただけです。

回答ありがとうございました。
投稿日時:2006/04/18 23:35
結果を報告する
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。
関連するQ&A

その他の関連するQ&Aをキーワードで探す

ピックアップ

ページ先頭へ