プロが教えるわが家の防犯対策術!

私は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;
}
■□■□■□■□■□■□■□■□■□■□■□

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

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

<br /> とりあえず怪しいところを一点指摘しておきます。<br /> <br /> >#!perl <br /> <b

パス付)が示されていなくてはなりません。
従って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が見つからない時は、教えて!gooで質問しましょう!