2017-01-17 5 views
0

私はテーブルからデータを抽出し、O/Pを表示しているコードを持っています。しかし、私は(スクリプトでハードコードされていない)txtファイルから接続文字列を与えたい。誰でも入力ファイルから以下の値を提供する方法をお手伝いできますか?perlスクリプトのテキストファイルからDBI接続パラメータを呼び出す方法は?

$dbh = DBI->connect('dbi:Oracle:DB_INST',"USER","PASS") 
    or die "Database connection not made: $DBI::errstr"; 

マイコード:あなたはプロパティから、データベースの資格情報を解析する

#!/usr/bin/perl 
$ENV{ORACLE_HOME}='/ora/11.2.0.3'; 
$LD_LIBRARY_PATH='/ora/11.2.0.3/lib'; 
use Shell; 
use DBI ; 
use CGI ; 
my $cgi = new CGI; 
print $cgi->header; 
my $dbh; 
$CGI_ST = new CGI; 
#################### FUNCTIONS DECLARATION ######################################################## 
sub Start_HTM 
{ 
     print "<html>\n\n"; 
     print "<title>LOGICAL DATE CHECK</title>\n\n"; 
     print "<body>\n<center>\n"; 
     print "<hr><h1 align=center><font color=#FFA500><u>LOGICAL DATE CHECK</u></font></h1>\n"; 
} 
sub End_HTM 
{ 
     print "<a href=\"#\" onClick=window.close()>Close Window</a></b></small>"; 
     print "</center>\n</body>\n</html>"; 
} 
sub DisBackButton 
{ 
     print "<br><br><br><INPUT TYPE=button value=Back onClick=history.back()>"; 
} 
#################################################################################################### 
print "Content-type: text/html\n\n"; 
open (FILE,"header.asp"); 
my $file = <FILE>; 
close(FILE); 
print "$file"; 
print "<SCRIPT LANGUAGE=JavaScript>"; 
print "</script>"; 
my $environment=$CGI_ST->param("environment"); 
my $product=$CGI_ST->param("product"); 
Start_HTM(); 
if ("$product" eq "2" && "$environment" eq "MPET") { 
print $cgi->start_html(-title=>'Basic CGI'); 
# you should change the connect method call to use the DBD you are 
# using. The following examples all use DBD::ODBC and hence the 
# first argument to the connect method is 'dbi:ODBC:DSN'. 
my $dsn = "DBI:Oracle:$db_inst"; 
$dbh = DBI->connect('dbi:Oracle:DB_INST',"USER","PASS") or die "Database connection not made: $DBI::errstr"; 
my $sql = qq{SELECT logical_date,logical_date_type from logical_date where expiration_date is null }; 
my $sth = $dbh->prepare($sql) || die $dbh->errstr; 
$sth->execute() || die $dbh->errstr; 
print $cgi->table({ -border=>"1" }); 
while (@data = $sth->fetchrow_array()) { 
$Logical_Date_O = $data[0]; 
$Logical_Date_B = $data[1]; 
$Logical_Date_R = $data[2]; 
print "<tr><td><font color='black'>$Logical_Date_O</font></td> 
<td>$Logical_Date_B</td><td>$Logical_Date_R</td></tr>\n"; 
} 
} 
print $cgi->end_table; 
print $cgi->end_html; 
+2

テキストファイルからの行の読み方を尋ねていますか?アディはそれをする! (FILE); ') – ikegami

+0

入力ファイルから 'DB_INST'、 'USER'、 'PASS'を呼び出したいと思います。 値は下に移動します。 DBI-> connect( 'dbi:Oracle:DB_INST'、 "USER"、 "PASS") –

答えて

1

は、ファイルの代わりに、それをハードコーディング。 iniファイルを作成し、資格情報を入力してConfig::IniFilesを使用して値を抽出します。

これらの値をDBIに渡してデータベースに接続できます。

[DATABASE] 
    # DB string 
    DBINST=XXX 
    # database username 
    DBUSER=XXX 
    # database password 
    DBPASS=XXX 
0

がファイルdatabase.confを作成し、簡単にそれを解析できるように、任意の形式、CSV、XLSまたは単純な区切りのフラットファイルに書き込むことができます:ここで

my $cfg = Config::IniFiles -> new(-file => 'path/config/database_config.ini'); 

my $dbinst = $cfg -> val('DATABASE', 'DBINST'); 
my $dbuser = $cfg -> val('DATABASE', 'DBUSER'); 
my $dbpass = $cfg -> val('DATABASE', 'DBPASS'); 

my $dbh = DBI->connect("dbi:Oracle:$dbinst", $dbuser, $dbpass) 
    or die "Database connection not made: $DBI::errstr"; 

は、設定ファイルです。私はデリミタとして '='を使っているフォーマットを考えています。

それを取得するためのコードを、次のあなたのperlスクリプトの使用中の今
# filename database.conf 
HOST=dbi:Oracle:DB_INST 
USER=USER, 
PASSWORD=PASS 

:だから私は本当にないんだけど

open (FILE,"header.asp"); 
my $file = <FILE>; 
close(FILE); 

:あなたはすでにファイルからデータを読み込み、コードを持って

my $db_conf_file = 'database.conf'; 
my $delimiter = '='; # You can change the delimiter accordingly 
my %db; 
open(my $FH, '<', $db_conf_file) or die "Could not open $db_conf_file"; 
while(my $line = <$FH>){ 
    chomp $line; 
    my @fields = split $delimiter , $line; 
    $db->{$fields[0]} = $fields[1]; 
} 
close($FH); 
$dbh = DBI->connect($db->{'HOST'}, $db->{'USER'},$DB->{'PASSWORD'}) 
or die "Database connection not made: $DBI::errstr"; 
.............. 
0

あなたは何の問題があるのか​​確かめてください。

sub get_credentials { 
    my $cred_file = 'credentials.txt'; 
    open my $cred_fh, '<', $cred_file 
    or die "Can't open $cred_file: $!\n" 

    my $data = <$cred_fh>; 
    chomp $data; 
    return split /:/, $data; 
} 

Oracle:DB_INST:USER:PASS 

あなたはこのようになりますget_credentials()と呼ばれるサブルーチンを書くことができます:

のは、あなたがこのようなこのようなファイルと呼ばれるcredentials.txtで詳細を置くことを想定してみましょう

あなたは、このようにそれを呼び出します。

my ($type, $instance, $user, $pass) = get_credentials(); 
my $dbh = DBI->connect("dbi:$type:$instance", $user, $pass) 
    or die "Database connection not made: $DBI::errstr"; 

あなたのコードに関する他のコメント。

常に
  • コード内でuse strictuse warningsが含まれます。
  • なぜuse Shell?私はあなたがそれを使用するとは思わない?
  • 2つのCGIオブジェクト($cgiおよび$CGI_ST)を作成します。あなたは1つだけ必要です。
  • 最後の千年紀以来、Perlコードの中に生のHTMLを置くことはひどい考えです。テンプレートを使ってPerlからHTMLを分離する方法を見てください。
  • 2つのCGIヘッダー(print $cgi->headerprint "Content-type: text/html\n\n")が印刷されています。
  • 常にopen()と字句ファイルハンドル(open (my $fh, '<', 'header.asp') or die ...)の三引数バージョンを使用しopen()open (FILE,"header.asp") or die ...
  • からの戻り値を確認します。
  • より良いif ($product eq "2" && $environment eq "MPET")を書かれているprint "$file"が良く書かれprint $fileif ("$product" eq "2" && "$environment" eq "MPET")です(不必要な変数を引用しないでください。
  • 私はあなたが$cgi->start_table()、ない$cgi->table()を意味だと思う。しかし、HTML generation functions have been deprecated。それらを使用しないでください。

最後に、最も重要なことは、CGIは古い技術です。CGI::Alternativesを読んで、PSGIに基づいた最新の技術に切り替えてください。

関連する問題