0

MySQL データベースからデータを取得する Perl スクリプトがあります。これはコードです:

sub startSession{
    my $self = shift;

    my $dsn = "dbi:".$self{platform}.":".$self{database}.":".$self{host}.":".$self{port};
    print "$dsn\n" ;
    $self{dbHandle} = DBI->connect($dsn,$user,$password);   
}

外部ファイルからすべての情報を提供しました。エラーメッセージが表示されます

DBI connect('dbname:**.**.**.**:3306','',...) failed: Access denied for user 'root'@'dbserver' (using password: NO) at line 89

Can't call method "prepare" on an undefined value at at line 97

ルートはどのホストからでも接続でき、パスワードも正しいと確信しています。

4

3 に答える 3

3

表示される警告の重要な部分は、「using password: NO」です。パスワードが正しく設定されていることを確認してください。

于 2012-05-03T18:20:07.450 に答える
3

まず、あなたの差し迫った問題は、@Sinan Ünürが言うように、に変更する必要があること$self{platform}など$self->{platform}です.

あなたの2番目の差し迫った問題は、どこからともなく取得$userしているように見えることです$password(関数に渡されないため、グローバル変数でない限り未定義です)、using password: NOエラーの一部を説明します。たぶんそれらは と である必要が$self->{user}あり$self->{password}ますか?

次のようなエラーを自動的にキャッチするために、少なくとも開発中にこれをモジュールの先頭に配置することを検討する必要があります。

use warnings qw(all);
use strict;

しかし、設計の観点からは、DSN を不透明な文字列として扱うべきだとも言いたいです。各データベースには独自の DSN 形式があります。したがって、別のデータベースをターゲットにしたい場合は、別の DSN 形式が必要になります。または、いつの日か MySQL が別の形式を使用するようになるでしょう (既に 2 種類あります)。いずれにせよ、さまざまな部分を連結する各場所を追跡するよりも、構成ファイル内の 1 つの場所を変更する方がはるかに簡単です。

于 2012-05-03T18:30:34.607 に答える
2

おそらく、プレーンハッシュではなくハッシュリファレンスであり、警告$selfはありません。そのため、それらをオンにして、などを使用します。$self->{platform}

于 2012-05-03T18:22:23.287 に答える