• 締切済み

ブラウザに表示できません。

私は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; } ■□■□■□■□■□■□■□■□■□■□■□ となっています。 どこか原因なのか参考書を読み漁りましたがわかりませんでした。 どうか教えていただけないでしょうか それとデータベースは入っています。

  • aeic
  • お礼率10% (60/582)
  • CGI
  • 回答数4
  • ありがとう数1

みんなの回答

  • arata
  • ベストアンサー率49% (139/279)
回答No.4

More information about this error may be available in the server error log. error.logでは、エラーはどうなってますか? (通常は、Apacheのインストールしてあるディレクトリ の下のlogsにerror.logはあります。)

  • aton
  • ベストアンサー率47% (160/334)
回答No.3

 nipotanさんのご回答で問題が解決すれば重畳ですが,もし解決しなかった場合はまず上記のPerlスクリプトが(CGI等を経由せず)単独でちゃんと動作するかを確認してみてください。  Perlスクリプトのファイルのあるディレクトリで     perl -w Perlスクリプトファイル名 とやれば実行できるはずです。コンパイルエラーが出たら,Perlの記述自体に文法上の誤りがあるということになります。実行時エラーが出るか,実行結果がおかしい場合は,どこに問題があるかを調べる必要が出てきます。     perl -d Perlスクリプトファイル名 のようにデバッガを使って実行してみるとよいと思います。  あと,私が怪しそうに感じたのはアクセス権周りです。Windowsはあまり詳しくないんで間違ってるかもしれませんが,通常CGIは(セキュリティ上の配慮から)非常に弱いアクセス権で実行されるので,ファイルやアプリケーションの操作のアクセス権がなくて失敗することがよくあります。上記のPerlスクリプトの手作業での実行に問題がない場合は,そのあたりを疑ってみてはどうでしょうか? MySQLのログやMySQLが返す(エラー)メッセージなどを調べてみてください。

  • nipotan
  • ベストアンサー率59% (134/227)
回答No.2

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 --- のように、コンテンツ識別子の後に空行を入れれば解決するかと。。。

  • natural
  • ベストアンサー率37% (419/1115)
回答No.1

とりあえず怪しいところを一点指摘しておきます。 >#!perl となっていますが、ここにはperlの在処(パス付)が示されていなくてはなりません。 従ってaeicさんのサーバーの何処にPerlがインストールされているか調べてその位置を記載します。 例えばUnix系のサーバーなら #!/usr/local/bin/perl とかになりますが、aeicさんの場合Windowsの様ですので #!C:\○○○\×××\perl といった感じになるのでしょうか。(○○○等は任意のディレクトリ名) まずはこちらを直してみて下さい。 #Windowsに関してはあまり自信がありませんので間違っていたらどなたかご指摘を。 #もしかしたら「C:」は不要かな?(^_^;

aeic
質問者

お礼

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

関連するQ&A

  • perlからMySQL5に接続できません

    WindowsでperlからMySQLに接続できません。 perlは以下のようなものです。 結果は「1」と表示されるので、MySQLへの接続ができていないのだと思います。 考えられる原因がわかる方、アドバイスをお願いします。 #!/Perl/bin/perl use DBI; print "Content-type: text/html\; charset=shift_jis\n\n"; print "1"; my($dbh, $sth); $dbh = DBI->connect("DBI:mysql:database=データベース名;host=127.0.0.1", "root", "rootのパスワード",{ RaiseError => 1, AutoCommit => 0 }); print "2"; $sth = $dbh->prepare("select * from テーブル名;"); 以下略 WindowsXP SP2 Apache2.2.4 ActivePerl5.8.8 MySQL5.0

    • ベストアンサー
    • MySQL
  • mysql 最大値 取得 

    mysqlのデータベースから、列の最大値を取り出したいのですが、 以下のように書いているのですが、取得される値が1しか返ってこないです。 間違っているところはあるでしょうか? perlで書いています。 my $dbh = DBI->connect("DBI:mysql:host=${db_host};database=${db_name}", $db_user, $db_pass); my $sth = $dbh->prepare("SELECT MAX(列名) FROM テーブル名"); my $rv = $sth->execute(); print "$rv";

    • ベストアンサー
    • MySQL
  • perlを使ってレコード件数を取り出してみると、すごい数が・・・。

    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を実行するのが怖いので、考えられる原因を教えてください。よろしくお願いします。 プログラムを初めてまだ、数ヶ月しか経ってない初心者なので、みなさんの知恵を貸していただけると幸いです。

    • ベストアンサー
    • MySQL
  • すでに接続してあるデータベースについて

    mysqlデータベースにperlで接続する際は、 use DBI; $dsn="DBI:mysql:database=test:host=localhost"; $dbh = DBI->connect($dsn,user,passwd); とし、データベースに接続して、 $sth = DBI->prepare("SELECT * From `table`); ・・・・・・ と続いていくと思いますが、 すでにデータベースに接続(コネクション)していた場合、どのように書けばいいのでしょうか? どなたかよろしくお願いします。

    • ベストアンサー
    • Perl
  • データベースが返すエラー文字列について

    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
  • MySQLとの接続でfetchrow_arrayがwhile文で使えない

    こんばんは、皆さん。 MySQLをPerlから使いたいのですが、 以下のようにやっても、$flagに"OK"が入りませんでした。 つまり、whileは一度もループしないで抜けてしまっているようです。 ------------------------------------------------- use DBI; … sub dbtest{ $dbh = DBI->connect("dbi:mysql:hogeDB:localhost","user","pass"); $sql = "select hoge,fuge from t_name where key='value'"; $sth = $dbh->prepare($sql); $sth->execute; while( ($hoge, $fuge) = $sth->fetchrow_array ){     $flag = "OK"; } $sth->finish; $dbh->disconnect; } ------------------------------------------------- ※実際はユーザ名などは変数にしています。 バージョンは現在、 Perl:v5.8.5 MySQL:5.1.6-alpha となっているようです。 それとちょっと別件ですが、 use autouseの書式は以下でよいのでしょうか? 「use autouse DBI;」 しかし、これだけだとDBIが読み込めてないエラーになるようです。 ご教示よろしくお願いします。

    • ベストアンサー
    • Perl
  • perlでdb(mysql)に接続

    perlでdb(mysql)に接続し、取得したデータを 表示させるというようなことをしたいのですが、うまく いきません。 ファイル名test.cgi mysqlのバージョンは 5.0.45で 記述は以下です。 #!/usr/bin/perl use DBI; my $dbh = DBI->connect("DBI:mysql:database, "userid", "password"); my $sth = $dbh->prepare('SELECT * FROM tablename'); $sth->execute; print "Content-Type: text/plain\n\n"; print "\n"; while(my @row = $sth->fetchrow_array) { print "$row[0]:$row[1]\n"; } $sth->finish(); $dbh->disconnect(); exit; ブラウザで確認すると何も表示されず、ログとして 以下のエラーが確認できます。 DBD::mysql::st execute failed: Table 'database.tablename' doesn't exist at test.cgi line 8. DBD::mysql::st fetchrow_array failed: fetch() without execute() at test.cgi line 11. my $sth = $dbh->prepare('SELECT * FROM tablename'); で指定したテーブルは存在しておりますし、SQL文の記述も 問題ないと思われます。 また、ファイルのパーミッションは705(755でも同様の結果)です。 perl初心者のため、どこが問題なのか検討がつきません。 ご助言いただきたく存じます。 よろしくお願いいたします!

    • ベストアンサー
    • Perl
  • MySQLのトランザクションについて

    初めて質問します。 今、PerlのDBIを使ってMySQLのトランザクション処理にチャレンジしています。 ところが、rollback処理がうまくできません。 具体的には、 table2 がある状態で下のプログラムを動かすと、 エラーの表示が出るのに、 table1 は作成されました。 何らかのエラーがあれば、どちらも作成されないようにしたいです。 ======================================================= my %sql; $sql{db_name} = "database"; $sql{host} = "localhost"; $sql{user_name} = "user_name"; $sql{password} = "password"; use DBI; my $dbh = DBI->connect('DBI:mysql:'.$sql{db_name}.':'.$sql{host}, $sql{user_name}, $sql{password} ,{RaiseError => 1, PrintError => 0, AutoCommit => 0 }) || &Err(); my $sth; my $re; eval { my $sql_string1 = "create table table1(`id` int);"; my $sql_string2 = "create table table2(`id` int);"; $sth = $dbh->prepare($sql_string1); $re = $sth->execute; $sth = $dbh->prepare($sql_string2); $re = $sth->execute; }; if ($@) { $tag="Err:".$@."\n"; $sth = $dbh->rollback; }else{ $sth = $dbh->commit; } $sth->finish; $dbh->disconnect; ======================================================= 検索して、いろいろいじっても解決しませんでした。 どうかよろしくお願いします。

    • ベストアンサー
    • Perl
  • Mysqlの接続について

    現在、以下のようなperlのスクリプトを作っているのですが、mysqlへの接続,切断は以下の場合、どちらにした方がいいのでしょうか? (1)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (2)の場合 use DBI; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth = $dbh->prepare("SELECT no,title,name,date,host From `table1` where no='1'"); $sth->execute; $sth->fetchrow_array; $sth->finish; $dbh->disconnect; $dsn="DBI:mysql:database=dbname:host=localhost"; $dbh=DBI->connect($dsn,'user','pass'); $sth2 = $dbh->prepare("SELECT no,title,name,date,host From `table2` where no='1'"); $sth2->execute; $sth2->fetchrow_array; $sth2->finish; $dbh->disconnect; (1)の場合と(2)の場合の違いは、(1)の場合、最初にデータベースに接続して、一番最後に切断する事で、(2)の場合、毎回データベースへの接続と切断を行う事が違います。 (2)の場合、毎回接続と切断を行うので、2回ほどではあまり変わらないかもしれないのですが、もし10回とか接続と切断を行うとかなり負荷が高くなるような気がするのですが、他のHPなどを拝見すると接続をしたら切断を行うように癖をつけるようにした方がいいと書かれていたりします。 どちらの方が正しいやり方というか、負荷がすくなく使えるのでしょうか?

    • ベストアンサー
    • Perl
  • perlからmysqlに接続できない

    #! c:/perl/bin/perl  use DBI; $user = 'root'; $passwd = 'パスワード'; $db = DBI->connect('DBI:mysql:db1:localhost', $user, $passwd); $sth = $db->prepare("INSERT INTO bunrui VALUES (1,'1st','memo')"); $sth->execute; $sth->finish; $db->disconnect; perlからmysql二接続するためDBIをインストールして、上のようなサンプルコードを実行してみたのですが Internal Server Error になってしまいます。どこかコードが違っているのでしょうか?

    • ベストアンサー
    • Perl