• ベストアンサー

外部ファイルのインクルードについて

外部ファイルにデータベースアクセスの為のユーザ情報を書いておき、DB接続が発生するファイルにのみ、インクルードさせたいと考えております。下記のようなプログラムを記述したのですが、エラーが出てしまいました。自分でネットで調べたのですが、間違っていないように感じます。何か、間違っていますでしょうか? my $dbh = DBI->connect部(グローバル変数が読み込めない)でエラーが発生しております。 #!/usr/local/bin/perl use DBI; require 'db.conf'; $ENV{ORACLE_HOME}='/opt/app/oracle/product/9'; my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT * FROM NAME"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; ~ 省略 ~ ---------db.confの中身(パーミッション755)--------- my $datasrc = "oracle9"; my $username = "test"; my $password = "password"; 1; #return true ----------エラーログ------------------ Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7. 宜しくお願い致します。

  • Perl
  • 回答数3
  • ありがとう数3

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

  • ベストアンサー
  • shimix
  • ベストアンサー率54% (865/1590)
回答No.2

>myを外してみましたが、やはりダメでした。 そうですか・・。ただ、こちらで確認した限りでは   reuqire 'inc.pl';   print $test1 . "<br />";   print $test2 . "<br />"; などとして、   my $test1 = 'test1';   $test2 = 'test2'; を読み込ませると、test2しか表示されないので、いずれにしても「my」はマズイと思われます。 「my」を外したあとでもエラーメッセージは変わりませんか?また   print $datasrc; などで表示させると「期待した値」が表示されますか?

sumisumish
質問者

お礼

myを外したら、問題なく表示させることができました! ありがとうございました。

sumisumish
質問者

補足

shimixさん ご回答ありがとうございます。 やはり、エラーメッセージは変わらなかったです。 文字列の取得はできているっぽいのですが、なぜかエラーになってしまいます。 もちろん、本体のファイル(test.cgi)に直接記述すると問題なく動作しているんですけどね。。。

その他の回答 (2)

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.3

require で読み込むファイルの中で my してしまうと、その名前は そのファイルに限定された範囲でしか有効になりません。 したがって、require した側で同じ名前の変数を使っても、まったく別物になります。 require されているファイルの中で使っているmy をなくしても出ているエラーというのは Global symbol "$datasrc" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$username" requires explicit package name at /web/hthome/cgi/test.cgi line 7. Global symbol "$password" requires explicit package name at /web/hthome/cgi/test.cgi line 7. これですか? このエラーは use strict した状態でないとでないはずなんですが。 また、このエラーが発生したときはスクリプトの実行は一切されないので > 文字列の取得はできているっぽいのですが、なぜかエラーになってしまいます。 文字列の取得もデータベースへの接続もできるはずがないのですが なにか勘違いしてたりしませんか? もし別の種類のエラーならどのようなエラーなのかの説明をお願いします。

sumisumish
質問者

補足

sakusaker7さん 私の勘違いでした。 外部ファイルの中からmyを外したら、問題なく読み込むことができました。ありがとうございました!

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.1

>my $datasrc = "oracle9"; >my $username = "test"; >my $password = "password"; requireで読み込む(最後はexitでreturnしている)のに、「my」でいいんでしょうか(Perlはよく知らないので外していたらごめんなさい)。

sumisumish
質問者

補足

shimixさん ご回答ありがとうございます。 myを外してみましたが、やはりダメでした。 また、何かお気づきの点があればお願いいたします。

関連するQ&A

  • 日本語だけ文字化け

    Solaris上で、Perl(5.005_03)を用い、DB(Oracle10.2.0)のデータを抽出しブラウザで表示させた際に、日本語のみが??????という感じに、半角の"?"で表示されてしまいます。 Solaris上で、cgiファイルを標準出力したり、Perlのデバッガで表示させると問題なく日本語表示されます。また、ブラウザでもDBから抽出した文字以外の日本語は問題なく表示されます。加えて、OUT関数を用いても、やはりDBから抽出した値のみ?表記になってしまいます。 下記に利用したCGIを書き出してみます。(DB接続以降の記述のみ) ------------------ここから--------------------- my $dbh = DBI->connect($datasrc, $username, $password) || die DBI::errstr; my $sql = "SELECT AAA FROM XXXXX"; my $sth = $dbh->prepare($sql) || die $dbh->errstr; $sth->execute || die $dbh->errstr; print "Content-type: text/html\n\n"; print "<HTML>\n<HEAD>\n"; print "<TITLE>DBテスト</TITLE>\n"; print "<meta http-equiv=Content-Type content=text/html; charset=Shift_JIS>\n"; print "</HEAD>\n<BODY>\n"; print "DB接続テスト<P>\n"; # display results my @results; my $count; while($count < 2) { @results = $sth->fetchrow; print "あああ"; print "@results\n<P>"; print ,$count++,"行目\n"; } $sth->finish; $dbh->disconnect; print "\n</BODY>\n</HTML>\n"; ------------------ここまで--------------------- ブラウザ表示の結果は、 DB接続テスト ???????? ???????? となってしまいます。"DB接続テスト"は正常に表示されて、print "@results\n<P>";が????に置換わり、"行目\n"が非出力となってしまいます。DB(AAA列)の値が数字や英数は問題なくブラウザ表示されます。 日本語全てが一律文字が置き換わるのであれば、文字コードの問題だと疑うのですが、SELECT文の日本語のみが、?というのはどうしてなのかがわかりません。また、Solaris上でのデバッガーや標準出力は問題なく、ブラウザやOUT関数でファイルに書き出すと、?になるのもわかりません。 もし、ご存知の方がいらっしゃいましたら、教えてくださいm(_ _)m

  • 警告を消したい

    モジュールなどのロードを必要時だけにするため、useではなくrequireを使うことはよくあると思いますが、ワーニングをオンにしている場合、そのrequireしているパッケージの変数を参照している箇所で Name "~" used only once: possible typo at~ という警告が出てしまいます。 たとえば、 require DBI; : my $dbh = DBI->connect(~) or die $DBI::errstr; というコードだと$DBI::errstrについて警告されてしまいます。 もちろんuseなら警告は出ません。 この警告は、何とかならないものでしょうか。

    • ベストアンサー
    • Perl
  • use strict;

    Global symbol "@exec_test_list" requires explicit package name at ./ctest.pl line 384. Global symbol "@exec_test_no" requires explicit package name at ./ctest.pl line 384. Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 397. Global symbol "@protocol_list" requires explicit package name at ./ctest.pl line 406. Global symbol "$name" requires explicit package name at ./ctest.pl line 413. use strict;を書くと以上のようなエラーメッセージが 出力されます。どうしたら、以上のようなエラーを 回避できるでしょうか?教えてください。

    • ベストアンサー
    • Perl
  • Webからの登録

    oracle初心者ですが、よろしくお願いします。 下記のようなスクリプト(Perl)を作成し、コマンドプロンプトで実行したところoracleへ登録することができましたが、cgiとして実行すると接続の際にエラーがでます。 権限の問題かと思いましたが、windowsでは特にそのような設定はないとのことでした。 また、mysqlで同じようなcgiを作成したところ、成功しました。 どなたかわかる方、教えていただけませんでしょうか? $hDb = DBI->connect("dbi:Oracle:orcl", "test/test") or die "CONNECT ERROR $DBI::ERRSTR"; $sth = $hDb->prepare("UPDATE test SET NAME='$NAME' WHERE ID='$ID'"); $sth->execute; $sth->finish; $hDb->disconnect; こちらの環境は以下の通りです。 ActivePerl5.8.7 windows2003server standard edition oracle9i よろしくお願いします。

  • データベースが返すエラー文字列について

    OSのバージョンUPに伴いoracle、perl、DBI等のバージョンもあげました perl 5.8.7 DBI-1.52 oracle9i perl 5.005_03 DBI-1.13 oracle8.0.5 その関係かはよくわからないのですが、エラー処理の実行結果が異なってしましました $sth = $dbh->prepare("$sql") or die "Cannot prepare: " . $dbh->errstr(); $sth->execute() or die print "データベースエラー"; このSQL文の実行結果はエラーの際、「データベースエラー」というdieメッセージとなります しかしバージョンをあげた方では、メッセージが表示されません $sthを出力してみたところ、空でした エラーでない場合の実行結果は同じになります 原因がわからず困っています 同じようにエラー処理(エラーメッセージを表示させたい)のですが、どのようにしたらよいでしょうか? どなたかご教授ください 宜しく御願いします

    • ベストアンサー
    • Perl
  • perl初心者なのですが

    use strict; use CGI; use DBI; my $dbh = DBI->connect("dbi:ODBC:DB_test"); my $NAME1 = CGI->new(); my $ADDRESS1 = CGI->new(); my $LETTER_NUM1 = CGI->new(); my $TEL_NUM1 = CGI->new(); my $NAME = $NAME1->param('name'); my $ADDRESS = $ADDRESS1->param('address'); my $LETTER_NUM = $LETTER_NUM1->param('letter_num'); my $TELL_NUM = $TEL_NUM1->param('tell_num'); my $sth = $dbh->prepare("INSERT INTO table1(name1,address1,letter_num1,tell_num1) values(?,?,?,?)"); $sth->execute($NAME,$ADDRESS,$LETTER_NUM,$TELL_NUM); $sth->finish; $dbh->disconnect; フォームから受け取ったデータをデータベースに格納したいのですが、うまくいきません。誰か教えてください。

  • perl >> DBI >> DBD >> oracle8でエラー

    perlからDBI経由でoracleに接続したいのですが、 なぜか DBI->connectのところで失敗して下記のようなエラーが出ます。 `CONNECT ERROR ORA-1034: ORACLE not available oas userでtelnetで入り、直接perl scriptを起動すると問題なく動作するの ですが、なぜかOAS経由でブラウザーからCGIとしてcallすると 失敗するのです。 もう2日も悩んでます。 どなたか原因がわかりましたらご教授ください。 ---- 環境 --- perl 5.005_03 OAS 4.0.8.1 DBI 1.30 DBD-Oracle 1.12 OS solaris2.6 接続先DBは別のsolarisマシンに入ってる。 ----------------ソース----------------------------- #!/usr/local/bin/perl use DBI; $dsn = 'DBI:Oracle:orcl'; $user = 'testuser'; $password = 'testuserpass'; $dbh = DBI->connect($dsn, $user, $password) or die "接続できません"; my $sth = $dbh->prepare("select * from munec"); $sth->execute; while(@row = $sth->fetchrow_array) { print "@row\n"; } ---------------

  • useとrequireでエラー

    初歩的な質問で失礼いたします。 下記の記述でプログラムを実行すると正常にプログラムが動きます。(省略以降は全く同一のプログラムです) ■実行問題なし1 #!/usr/local/bin/perl require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- ■実行問題なし2 #!/usr/local/bin/perl use strict; use DBI; --------省略--------------- しかし、下記の記述だとエラーが発生していまいます。 #!/usr/local/bin/perl use strict; use DBI; require 'cgi-lib.pl'; require 'jcode.pl'; --------省略--------------- エラーログは、下記の通りです。 Global symbol "$in" requires explicit package name at search.cgi line 21. Global symbol "$parameter" requires explicit package name at search.cgi line 23. Global symbol "$name" requires explicit package name at search.cgi line 23. Execution of search.cgi aborted due to compilation errors. requireとuseは同時に記述してはいけないのでしょうか? 同時に記述しないと目的のプログラムを実現する方法が大きく変わってきてしまうので、非常に困ってしまいます。 もし、ご存知の方がいらっしゃったら教えてください。 宜しくお願い致します。

  • 外部ファイルの関数を使うには?

    phpで include_once('okok'); なら、そこで定義した関数や変数は使えるのですが、 perlで require "dame.pl"; として、dame.plで定義した変数を使おうとすると、 Global symbol "%hash_hensuu" requires explicit package name at test.pl line 16. となります。 パッケージや変数の輸出?など片言の言葉が思い浮かぶのですが、実際どのように書けば、外部ファイルの関数を使えるようになるのでしょうか?

    • ベストアンサー
    • Perl
  • perlのDBIからmysqlにINSERTINTOをやっても追加されない。help!!

    助けてください、お願いします。 phpadminで管理しているmysqlのDBへ、perlのDBIモジュールを使ってレコードの追加(INSERTINTO)をやっても、phpadminでDBをみてみると追加されていません。 DBIを組み込んだCGIを実行してみてもエラーはでないのですが、DBへの追加ができていません。 色々とやってみたのですが、どうしても追加ができません。考えられる要因があれば教えてください、お願いします。ソースは以下の通りです。 use DBI; $dbh=DBI->connect('DBI:mysql:データベース名:サーバホスト','ユーザ名','パスワード') or die $DBI::errstr; $sthandler = $dbh->prepare("INSERT INTO `table名` (`姓`, `名`, `メールアドレス`, `年齢`) VALUES ('名字', '名前', 'mailaddress', '0')"); $sthandler->execute; $sthandler->finish(); $dbh->commit; $dbh->rollback; $dbh->disconnect; 本当に困っています。どうかお助けください。

    • ベストアンサー
    • MySQL

専門家に質問してみよう