私はWebDBに挑戦してみようと思いMySQLを勉強しています。
そこで参考書を見ながら見よう見真似でCGIを作ったのですがブラウザーに表示できません。
環境的には
■□参照1□■□■□■□■□■□■□
Apache1.3.12(WIN32)
c:home/htdocs/public_html
MySQL3.23.32-win
ActivePerl5.60
□■□■□■□■□■□■□■□■□■

です。
perlを使っていますがブラウザにて
表示すると
■□参照2■□■□■□■□■□■□■□■□
Internal Server Error
The server encountered an internal error or misconfiguration and was unable to complete your request.
Please contact the server administrator, root@localhost and inform them of the time the error occurred, and anything you might have done that may have caused the error.
More information about this error may be available in the server error log.
--------------------------------------------------------------------------------
Apache/1.3.12 Server at localhost Port 80
■□■□■□■□■□■□■□■□■□■□■□

と出ています。
実際に作ったperlソースは
■□参照3■□■□■□■□■□■□■□■□■□
#!perl
#DBIモジュールを使用する
use DBI;
my($dns) = "DBI:mysql:webdatabase:localhost";
my($username) = "root";
my($password) = "654321";
#データベースへアクセスする値
my($dbh, $sth);
#データベースから得た情報を格納する値
my(@ary);
#データベースへアクセスする
$dbh = DBI -> connect ($dns, $username, $password)
or &Error("データベースにアクセスできません1");
#データベースへMysqlコマンドを送る準備をする-------------------------------
$sth = $dbh->prepare("SELECT * FROM mytable");
#準備したコマンドを実行する
$sth -> execute()
or &Error("MySQLを実行できません。2");
#実行したコマンドから取り出した情報を表示する
print<<"__start_html";
Content-type: text/html\; charset=shift_jis
<PRE>
__start_html
while (@ary = $sth -> fetchrow_array())
{
print join ("\t", @ary), "\n";
}
print "</PRE>\n";
#コマンドの実行を終了する
$sth -> finish();
$dbh -> disconnect();
exit;
#エラー部分のsubメニュー------------------------------------------------------
sub Error
{
print<<"__html";
Content-type: text/html\; charset=shift_jis
$_[0]
__html
exit;
}
■□■□■□■□■□■□■□■□■□■□■□

となっています。
どこか原因なのか参考書を読み漁りましたがわかりませんでした。
どうか教えていただけないでしょうか
それとデータベースは入っています。

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

A 回答 (4件)

More information about this error may be available in the server error log.



error.logでは、エラーはどうなってますか?

(通常は、Apacheのインストールしてあるディレクトリ
の下のlogsにerror.logはあります。)
    • good
    • 0

 nipotanさんのご回答で問題が解決すれば重畳ですが,もし解決しなかった場合はまず上記のPerlスクリプトが(CGI等を経由せず)単独でちゃんと動作するかを確認してみてください。



 Perlスクリプトのファイルのあるディレクトリで
    perl -w Perlスクリプトファイル名
とやれば実行できるはずです。コンパイルエラーが出たら,Perlの記述自体に文法上の誤りがあるということになります。実行時エラーが出るか,実行結果がおかしい場合は,どこに問題があるかを調べる必要が出てきます。
    perl -d Perlスクリプトファイル名
のようにデバッガを使って実行してみるとよいと思います。

 あと,私が怪しそうに感じたのはアクセス権周りです。Windowsはあまり詳しくないんで間違ってるかもしれませんが,通常CGIは(セキュリティ上の配慮から)非常に弱いアクセス権で実行されるので,ファイルやアプリケーションの操作のアクセス権がなくて失敗することがよくあります。上記のPerlスクリプトの手作業での実行に問題がない場合は,そのあたりを疑ってみてはどうでしょうか? MySQLのログやMySQLが返す(エラー)メッセージなどを調べてみてください。
    • good
    • 0

naturalさんの言っていることも一理あるんですが(通常、ルートディレクトリにperl.exeが存在することは考えにくい)


それよりも、出力部分のHTTP(レスポンス)ヘッダと、コンテンツの境目がありません。

通常出力もエラー出力もヒアドキュメントで書かれているのですが、
---
Content-type: text/html; charset=shift_jis
<PRE>
---
から始まり、処理結果の出力まで、結局最初に空行が出てくるまでの内容は
全て「HTTP(レスポンス)ヘッダ」として認識されます。
既にヘッダ2行目の<PRE>はMIME規定違反として、正常な出力という扱いにはならず
エラーになるはずです。

---
print<<"__start_html";
Content-type: text/html\; charset=shift_jis

<PRE>
__start_html
---

---
print<<"__html";
Content-type: text/html\; charset=shift_jis

$_[0]
__html
---
のように、コンテンツ識別子の後に空行を入れれば解決するかと。。。
    • good
    • 0


とりあえず怪しいところを一点指摘しておきます。

>#!perl
r /> となっていますが、ここにはperlの在処(パス付)が示されていなくてはなりません。
従ってaeicさんのサーバーの何処にPerlがインストールされているか調べてその位置を記載します。

例えばUnix系のサーバーなら

#!/usr/local/bin/perl

とかになりますが、aeicさんの場合Windowsの様ですので

#!C:\○○○\×××\perl

といった感じになるのでしょうか。(○○○等は任意のディレクトリ名)
まずはこちらを直してみて下さい。

#Windowsに関してはあまり自信がありませんので間違っていたらどなたかご指摘を。
#もしかしたら「C:」は不要かな?(^_^;

    • good
    • 0
この回答へのお礼

とりあえず怪しいところを一点指摘しておきます。

>#!perl

となっていますが、ここにはperlの在処(パス付)が示されていなくてはなりません。
--------------------------------------

のところですが、一度perlの動作確認をしたときにこのパスで起動させることに成功したのでこのようになっています。
なぜに回答のところに補足が書いてあるかと言うと皆さんに説明するのにあまりにも文章が多すぎて書きけれなかったのでどのように説明するかを考えたところこうなりました。
どうぞよろしくお願いします。
怪しくてすみませんでした。

お礼日時:2001/08/17 16:02

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

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

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

Q$abc == 0;

フリ-CGIを使ってCGIの勉強中です、
今使っているフリ-CGI掲示板の中に下記のコ-ドがあります、
$abc == 0;

$abc = 0; の間違いだと思うのですが別の意味があるのですか。

Aベストアンサー

こんにちは。

cgiの勉強中ということですが。
質問される前に本などごらんになりましたか??
どういったことから間違いだと思うのでしょうか??

$abc == 0;
は間違いではありません。
==と=の違いをご存知ですか??

$abc == 0;
は「$abcが0である」
$abc = 0;
は「$abcに0を代入する」
ということです。

参考URL:http://tohoho.wakusei.ne.jp/www.htm

Q${str}と$strの違いとは?

スカラー変数の${str}と$strの違いとは何なのでしょうか。

スカラー変数における{}の意味がよくわかりません。
別になくても処理は変わらない気がしますが、
どういった際に{}は使用するのでしょうか?

Aベストアンサー

もしPerlでのことでしたら、スカラー変数名を{}で囲むのは、それ以降に半角文字が続く場合に、そのスカラー変数名と半角文字の文字列との境界を明示するためだと思います。 変数自体に何かの違いがあるということではないはずです。

たとえば、処理の中でスカラー変数$strに続けてstrという文字を書き出したい場合、「$strstr」と記述すると、[$str]とは別の[$strstr]という名前のスカラー変数と認識されてしまいます。 これを避けるために、スカラー変数名を{}で囲って、「${str}str」と記述することで、$strというスカラー変数に、strという文字が続いていると認識させる、という具合だと思います。

見当違いでしたらごめんなさい。

Q$a++と++$aの違いがよくわかりません。

わかりやすい、いい例ってありますか?

Aベストアンサー

PHPだけど、(Perl)はここ数年さわっていないけど同じかな。
$a = 10;
++$a;
print($a); ← aは11
じつはこの場合は、$a++;でも同じ。

$b = 10;
$c = $b++;
print($b, $c);

$b は11,$cは10。$cが++$bなら11。
さてなんででしょう?

$c = $b++;

1.$cに$bを代入する。なので、$bと同じ値が入る。
2.その後,$bに++(1)を足す。

$c = ++$b
だと、
1.$bに++(1)を足す。のが最初。
2.その後,$cに$bを代入する。

式が評価される順番が少し違うだけ。
間違ってないと思うけど、いろいろ実験してみて。

QSSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません

SSI初心者の者です。
参考書(CGIプログラミング入門/翔泳社)を見ながらCGIとSSIの勉強をしてるのですが、SSIの『#exec cmd』と『#exec cgi』の違いがよくわかりません。
本には前者はPerlスクリプトで後者はCGIスクリプトの場合に使うって書いてあるのですが、この2つってどう違うのですか?
前後の文脈から察するにCGIスクリプトは『print "Content-Type: text/html"』があって、
Perlスクリプトはこれが無いものと読み取れるのですが
そうなのでしょうか?
初心者向けに御回答していただけますよう、よろしくお願いいたします。

Aベストアンサー

補足受けましたhyde-laです
結論から言いますと、無視されるようなことはありません。
飽くまで「結果」をどう扱うかという話ですので。
この場合の結果とは、プログラムの標準出力へ出力されたものという意味です。
#EXEC CMDでは、プログラムの「標準出力」を結果としてブラウザに表示するだけです。

UNIXやDOS等、多くの環境には「標準出力」という考え方があります。
これはPRINT文などで出力される場所で、つまりデフォルトでは画面です。
(標準出力はリダイレクトという操作を用いて、出力先を変えることが出来ます)

QPerlでDBIを使いますが、結果セットをフィールド名でアクセスするには?

OSはWindowsでAccess2002のデータベースをODBC経由でDBIを用いて、Perlからアクセスします。
以下のように、結果セットをフィールド名でアクセスしたいです。
可能でしょうか?


#!/perl/bin/perl
#!/usr/bin/perl -w

use DBI;

# create the DSN connection
$dsn = "dbi:odbc:test";
$dbh = DBI->connect($dsn) or die "接続エラー";

$query = "select * from goods;";

# execute the query
$sth = $dbh->prepare($query);
$sth->execute();

print "no name price\n";
print "--------------------------------------\n";
while(@item = $sth-> fetchrow) {
#print "@item[0] @item[1] @item[2]"; #----- 通常はこうだが、
print "$item{'goods_name'} $item{'goods_price'} $item{'auto_no'}"; #----こんな感じで利用したい。
print ("\n");
}

# disconnect
$sth->finish();
$dbh->disconnect();

exit;

__END__

OSはWindowsでAccess2002のデータベースをODBC経由でDBIを用いて、Perlからアクセスします。
以下のように、結果セットをフィールド名でアクセスしたいです。
可能でしょうか?


#!/perl/bin/perl
#!/usr/bin/perl -w

use DBI;

# create the DSN connection
$dsn = "dbi:odbc:test";
$dbh = DBI->connect($dsn) or die "接続エラー";

$query = "select * from goods;";

# execute the query
$sth = $dbh->prepare($query);
$sth->execute();

print "no name price\n";
print "--------...続きを読む

Aベストアンサー

my @names{@{$sth->{'NAME_lc'}}} = (0..scalar @{$sth->{'NAME_lc'}});
while (my $aref = $sth->fetchrow_arrayref ()) {
$aref->[$names{'hogehoge'}],$aref->[$names{'hugahuga'}];
}
とか
while (my $href = $sth->fetchrow_hashref ()) {
$href->{'hogehoge'},$href->{'hugahuga'};
}
見たいな感じでアクセスします。

詳しくは参考URLをご覧ください。
#サンプルが少なくてちょっと分かりにくいですが。

参考URL:http://member.nifty.ne.jp/hippo2000/perltips/dbimemo.htm


このカテゴリの人気Q&Aランキング

おすすめ情報