【復活求む!】惜しくも解散してしまったバンド|J-ROCK編 >>

perlからDBIを使用して、データベースにアクセスしたいと思っていますが、connectで下記のようなエラーが出力され接続できません。
↓↓↓↓↓↓apacheのエラーログ↓↓↓↓↓↓↓
DBI connect('dbname=[mscdb]','[postgres]',...) failed: FATAL: database "[mscdb]" does not exist
at /web/member/cgi-bin/dbitest.pl line 8
↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑
mscdbがないとエラーが出力されているように思いますが、mscdbは存在します。どういった原因が考えられるでしょうか?


プログラムには以下のように記述しています。
#!/usr/bin/perl
use DBI;

use constant DBNAME => 'DBI:Pg:dbname=[mscdb]';
use constant DBUSER => '[postgres]';
use constant DBPASS => '[××××]';

DBI->connect( DBNAME, DBUSER, DBPASS, { AutoCommit => 0 });

print "Content-Type: text/plain\n\n";
print $DBI::errstr? $_: 'Done';


環境は以下の通りです。
   perl v5.8.2
   postgres v8.1.2
vine linux
dbd v1.49

このQ&Aに関連する最新のQ&A

A 回答 (2件)

postgresqlのpg_hba.confにてどのような接続形態を許可していますか。


また、postmasterの起動オプションはどうなっているでしょうか。

この回答への補足

(1)pg_hba.confは、以下のようにしています。
 Webサーバと、DBサーバは同一のマシンに格納していますので、localhostからの接続は、許可しました。
# TYPE DATABASE USER CIDR-ADDRESS METHOD

# "local" is for Unix domain socket connections only
local all all trust
# IPv4 local connections:
#host all all 127.0.0.1/32 trust
# IPv6 local connections:
#host all all ::1/128 trust

host all all 192.168.1.0/24 trust
host all all 192.168.3.0/24 trust
host all all 192.168.4.0/24 trust
host all all 127.0.0.1 255.255.255.255 trust

(2)postgresは、マシン起動時にあがるようにinit.dに以下のようなファイルを置き起動しています。
#!/bin/sh
#
# PostgreSQL start and shutdown script
#
# chkconfig: 345 90 11
# description: PostgreSQL start and shutdown script

. /etc/init.d/functions

case "$1" in
start)
su - postgres -c "pg_ctl -l /usr/local/pgsql/log/log${$}.txt -D /usr/local/pg
sql/data/ -o \"-S -i\" start"
touch /var/lock/subsys/postgres
;;
stop)
su - postgres -c "pg_ctl stop -D /usr/local/pgsql/data/ -m fast"
rm -f /var/lock/subsys/postgres
;;
*)
echo "Usage: /etc/rc.d/init.d/postgres {start|stop}"
esac

補足日時:2006/08/23 14:07
    • good
    • 0

もしデータベースの名前が "[mscdb]" でなく "mscdb" ならば


dbname=mscdb
と書きますが、そこは大丈夫でしょうか。ユーザ名とパスワードも同様です。

この回答への補足

[mscdb]をmscdbに修正したら正常に動きました。
お恥ずかしい限りです(--)ありがとうございます!!

補足日時:2006/08/23 14:47
    • good
    • 0

このQ&Aに関連する人気のQ&A

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aと関連する良く見られている質問

Q数値かどうかの判定方法

$aに代入されているものが数値かどうかを判定するにはどのようにしたらよいのでしょうか?

Aベストアンサー

$a =~ /^[0-9]*$/
上記の場合、*は「直前のパターンの0回以上の繰り返し」の意味なので、0から9がなくても、つまり$aが空でもマッチしてしまいます。
なので、
$a =~ /^[0-9]+$/
としましょう。
(+は「直前のパターンの1回以上の繰り返し」)
また、0-9は\dで表すこともできるので
$a =~ /^\d+$/
と書くこともできます。

Qperlのdbi-connect処理のエラー

active perlでdbi-connect処理から戻ってきません。教えてください。
以下のテスト的なプログラムで試しました。
Xには、数字が入ります。(会社のファイルサーバーになります)
DBI->connectから戻ってきていないようです。(hhhhhhhhが表示されません)
ちなみにDBI->connectをコメントにすれば表示されます。

申し訳ありませんが、どなたかご存知の方いらっしゃらないでしょうか?
エラーがかえってこないと、何が悪いかわかりません。
困っています、宜しくお願いします。

ちなみにPerlは、Ver. 5.8.7.813でdbi,dbd-oracleは、昨日ppmでダウンロードしました。

# DBへコネクトする
my $datasource = 'dbi:oracle:usrDB:xxx.xxx.x.xx:8080' ;
my $usr = 'usrname' ;
my $pass = 'usepass' ;

my $dbh = DBI->connect($datasource,$usr,$pass) ;
print "hhhhhhhhhhhh\n" ;
if( ! $dbh ){
print "gggggggggggg\n" ;
}
$dbh->disconnect();

active perlでdbi-connect処理から戻ってきません。教えてください。
以下のテスト的なプログラムで試しました。
Xには、数字が入ります。(会社のファイルサーバーになります)
DBI->connectから戻ってきていないようです。(hhhhhhhhが表示されません)
ちなみにDBI->connectをコメントにすれば表示されます。

申し訳ありませんが、どなたかご存知の方いらっしゃらないでしょうか?
エラーがかえってこないと、何が悪いかわかりません。
困っています、宜しくお願いします。

ちなみにPerlは、Ver. 5.8.7.813で...続きを読む

Aベストアンサー

http://search.cpan.org/~pythian/DBD-Oracle-1.27/Oracle.pm
ここらへんを見ると
$dbh = DBI->connect("dbi:Oracle:host=xxx.xxx.xxx.xxx;sid=usrDB;port=8080",$user, $pass);
みたいに書くようですよ。ただ、Oracleは使ったことないんで間違っているかもしれません。

ところで、8080ポートに接続しているということはWebプロキシに接続に行っているみたいなんですが、ポート番号は合っていますか?

ちなみに、SQLiteの例ですが、トレースを出したいときは以下のようにします。Oracleでも似たような出力を出すことができると思います。以下、表示がくずれすので空白2文字を全角空白で書いていることに注意。
use strict;
use warnings;
use DBI;

# DB Name
my $db_name = 'sqlite_test.db';

# Disable buffering
$| = 1;

# Connect to the database
my $dbh = DBI->connect(
  'dbi:SQLite:dbname=' . $db_name,
  '', '',
  {  PrintError => 1,  ### Do report errors via warn()
    RaiseError => 0,  ### Don't report errors via die()
    TraceLevel => 5
  }
) or print DBI->errstr;

# Disconnect from the database
$dbh->disconnect;

これを実行すると以下のような出力が出てきます。
DBI::db=HASH(0x9dda3a8) trace level set to 0x0/5 (DBI @ 0x0/0) in DBI 1.605-ithread (pid 4982)
<> FETCH= 5 ('TraceLevel' from cache) at /usr/lib/perl5/DBI.pm line 693
-> STORE for DBD::SQLite::db (DBI::db=HASH(0x9dda3a8)~INNER 'Username' '') thr#9c7d008
....

http://search.cpan.org/~pythian/DBD-Oracle-1.27/Oracle.pm
ここらへんを見ると
$dbh = DBI->connect("dbi:Oracle:host=xxx.xxx.xxx.xxx;sid=usrDB;port=8080",$user, $pass);
みたいに書くようですよ。ただ、Oracleは使ったことないんで間違っているかもしれません。

ところで、8080ポートに接続しているということはWebプロキシに接続に行っているみたいなんですが、ポート番号は合っていますか?

ちなみに、SQLiteの例ですが、トレースを出したいときは以下のようにします。Oracleでも似たような出力を出す...続きを読む

Qpostgresのdatabase名と、そのencodingを取得する

postgresのdatabase名と、そのencodingを取得する方法を教えてください。



postgres8.1です。

システムカタログ
http://www.postgresql.jp/document/pg811doc/html/catalogs.html

pg_databaseの項目として持っているだろうと思い、見てみました。

encodingint4 このデータベースの文字符号化方式

これか?と思いましたが、数値IDのみでした。

この数値から、utf8やsjisといった情報にどうやったら繋がりますか?

Aベストアンサー

pg_encoding_to_char関数で文字エンコーディング名に変換できます。

=> SELECT datname, pg_encoding_to_char(encoding) FROM pg_database;
datname | pg_encoding_to_char
-----------+---------------------
template1 | UTF8
template0 | UTF8
postgres | UTF8
(4 rows)

QPOSTGRESのデータの格納場所はどこでしょうか?

RedHat7.2/PostgreSQL7.2/という環境で、サーバーがクラッシュしてしまい、データを他のサーバに移し変えないといけなくなりました。そこで、PostgreSQLを再インストールしないとデータベースが使えない状況となりました。

データベースを再インストールするのは良いとして、どこかに格納されているはずのデータベースの内容を取り出し、復帰させたいのですが、方法はありますか?大変困っております。よろしくお願いします。

Aベストアンサー

No.1の追加です。
データの移設でよかったと思います。
または、データを読み込むときに、「iオプション」でディレクトリを指定して、元のファイルを読み込んでもよかったと思います。

Qサブルーチンを認識しません。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプトの最後にまとめてあります。
同じサブルーチンは、他のスクリプトでも利用していますが、
エラーは出ていないのですが。

何が原因か、わかりません。
関係ないかもしれませんが、プログラム最初の方でuse strict;の宣言をしています。
他のサブルーチンも認識しません。
KCacthの表示は同じ
&main::サブルーチン名 called になっています。
よろしくお願いします。

perlプログラムで
サブルーチンの中で、別のサブルーチンを呼び出していますが、
なぜか認識しません。
KCatchでは以下の表示をしています。
Catch: Mon Sep 22 07:56:36 2003
-------------------------------------------------
[regist.cgi:375:die] Undefined subroutine &main::lock called.
>&lock;
-------------------------------------------------
regist.cgi with Perl 5.00502 for freebsd

サブルーチン名には頭に & を付けて呼び出しています。
サブルーチンは、スクリプト...続きを読む

Aベストアンサー

下記前提でよいでしょうか。
&lock(); ・・・(lockを呼び出している箇所)

sub lock    ・・・サブルーチン:lockの定義
{
・・・
}
上記は1つのソースファイル上にある。

とすると、考えられるのは、
1.undef (&lock); により未定義にしている。
2.__DATA__のあとにsub lockを定義している為、サブルーチンとして認識されない。(__END__も同様)
です。上記の2点はOKでしょうか?

Qperlを使ってレコード件数を取り出してみると、すごい数が・・・。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\n";

# 開放
$sth->finish;
# AUTO COMMITがOFFの場合はCOMMITが必要
$dbh->commit;
# 切断
$dbh->disconnect;
}

実行すると該当 4294967294, 件 とブラウザに表示されました。僕はレンタルサーバを使っているわけですが、僕のデータベースにはレコードは3件しかないのです。これはレンタルサーバのデータベースすべての件数が表示されているのでしょうか?
なんだかSQLを実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。
プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

perlのDBIモジュールを使って、mysqlのレコード件数を表示させてみると、すごい数が表示されました。ソースは以下の通りです。
use DBI;
$dbh=DBI->connect("DBI:mysql:データベース名:サーバ名", "ユーザ名", "パスワード") || die $DBI::errstr;
if(!$dbh){
print "エラーです。入力を確認してください。";
exit;
}else{
#接続成功

# SELECT文発行
$sth=$dbh->prepare("SELECT sei, mei, mail FROM table");
#実行
$sth->execute;
$num_rows = $sth->rows;
print "該当 $num_rows, 件\...続きを読む

Aベストアンサー

こんにちは。

まず、全然関係ないですが、SELECT文ではCOMMIT不要です。
さて本題ですが、この場合のrowsは何が返るかわかりません。
rowsでレコード数を取り出せるのは下記の場合のみです。
1.doメソッドで実行した場合(条件付き)
2.SELECT以外のSQL。
3.SELECT実行後、すべての行を取り出した後。

ところで、件数取得はCOUNT()じゃダメ?
(^^ゞ

Q変数の中は文字列か数値か調べたい。

タイトルのとおり、変数に代入された値が
文字列か数値か調べたいのですが、
関数、モジュール、その他の方法等ありましたら
教えてください。よろしくお願いします。

Aベストアンサー

No.4 です。

すいません。
ご指摘の通り、. の前に \ が必要です。

if( /^-?\d+\.?\d*$/ ) {
}

QPostgreSQLが起動しない・・・

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not write lock file "/var/lib/postgres/data/postmaster.pid": No space

となっており、上記ディレクトリにpostmaster.pid書き込みできないよ、と言われているっぽかったので、パーミッションを変更したりして
みましたが、postgresql startにしろ、pg_ctl startにしろ、それぞれのコマンドで起動すると、強制的にパーミッションが「700」に変更されてしまうようで、結果は同じでした。

どなたか、解決策をご教示願えませんでしょうか?

よろしくお願いします。m(_ _)m

はじめまして、tanu_2です。
玄箱HGをDebian化し、いろいろと遊んでいます。

PostgreSQLをapt-getでインストールし、Webアプリを動かしていたのですが、昨日より突然、PostgreSQLが動かなくなってしまいました。
原因が分からず、サーバを再起動し、
# /etc/init.d/postgresql start

$ pg_ctl start
などを試してみたのですが、動きません。
念のため、初期化(initdb)も試みたのですが、これも失敗してしまいます。
/var/log/postgresql/postgres/logを覗いてみると、

FATAL: could not wri...続きを読む

Aベストアンサー

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証はなし。)

su - postgres

上記のコマンドでログインするなり、パスワードを忘れたのならroot権限にてpasswdコマンドから変更するなりした後、もう一度postmasterを起動してみよう!

ちなみに、パーミッション関係のエラーは、「Permission denied」ですよね。

参考URL:http://www.postgresql.jp/document/pg803doc/html/postmaster-start.html

それ以外にも、以下のようなコマンドを使ってデータベースサーバプログラムの起動が出来ますよね。

postmaster -D /usr/local/pgsql/data

ただ、以下のURLのドキュメント内には、次のような記述があります。

「何を実行するにしても、サーバはPostgreSQLユーザアカウントで起動させなければなりません。 rootであってはいけませんし、他のユーザでもいけません。」

パッケージによるインストールであれば、自動でpostgresユーザが作られているはずだと思うけど。(Debianは使ったことないので、確証は...続きを読む

QCGIから外部コマンド実行時の標準出力の取得方法について

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
systemの場合はちゃんと動作します。

■実際にやりたいこと
oracleサーバへの問い合わせ結果を取得したいのですが、
10gのクライアントまでは入りましたが、perlのDBD::Oracleがうまく入らなかったため、sqlplusで処理しようと考えています。
最初は直接CGIから呼び出そうとしたのですが、sudo時に環境変数が設定されないので、bashのシェルスクリプトにexportで先頭に書いております。
外部公開サーバではありませんので、とりあえずセキュリティーは無視しています。

systemで実行結果をcgiの標準入力に渡すか、バッククォートでエラーが出なくするかどちらかの方法はありませんでしょうか?

RH7.3の環境で試しているのですが、どうもうまく動作しません。

CGIから呼び出す方法として3つ試したのですが、
open(IN,"|sudo -u USER PROGRAM");
$text = `sudo -u USER PROGRAM`;
system("sudo -u USER PROGRAM");
最後のsytemは一応期待通りの動作になりました。
ただ、これですと実行結果(標準出力)を取り込めないのですが、何か方法はありませんか?
PROGRAMはbashのシェルスクリプトです。

最初の2つですと、sudoの関係かエラーが出ます。
./PROGRAM: SQL*Plus:: command not found
sys...続きを読む

Aベストアンサー

open(IN,"|sudo -u USER PROGRAM");
は、前にパイプがあるので標準入力を受け付けています。

標準出力を取得するには、
open(IN,"sudo -u USER PROGRAM|");
後ろにパイプをつけてください。
そして、 print while(<IN>);

QCGIでソースがそのままでてしまうのですが・・・。

CGIでソースがそのまま表示されてしまうのですが、どうしてなのでしょうか?

先週からCGIやPerlを学び始めました。そこで簡単なものを試しに作ってみたのですが、入力したソースがそのまま表記されてしまいます。

ちなみに、こんなものです。

#! c:/perl64/bin/perl

print "Content-type: text/plain\n\n";
print "Hello Perl !";

どこをどう変えればいいのか、わからないので、質問してみました。

わかる方がいましたら、教えてください。

初心者なので、お手柔らかにお願いします。

.





この質問に補足する.

Aベストアンサー

CGIスクリプトのソースがそのまま出力されるのは、そのファイル/URIがCGIとして実行できていないためです。

httpd.confの<Directory>ディレクティブや<Location>ディレクティブなどの指定箇所が間違えているか、
ファイルの拡張子を間違えているか、
httpd.confを書き換えてからApacheをリスタートしていないか。。。


Forbiddenが出てきたら.cgiファイルに実行権限が無い。
Internal Server Errorが出てきたら、Perlがインストールされていないか.cgi拡張子とPerlが関連づけられていない。

ということが考えられます。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング