dポイントプレゼントキャンペーン実施中!

こんばんは、皆さん。

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が読み込めてないエラーになるようです。

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

A 回答 (1件)

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



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

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

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

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

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

http://slashdot.jp/~nekoie02/journal/
↑を見るとautouse使用時の注意点が2点ほど書かれています。
読んでみてください。
    • good
    • 0
この回答へのお礼

SQLで持って来れていないようですね。
でも、PerlからでなくコマンドラインからMySQLに接続して、
同じSQL文を実行しても、正常に持ってきていました。
どこかに間違いがあるはずなので、探してみます。

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

回答ありがとうございました。

お礼日時:2006/04/18 23:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!