WebサーバにアップロードしたmySQLを使った簡単な.cgiファイルにアクセスするとエラーになってしまいます。
使用しているWebサーバはOS X Serverです.Perl+mySQLの環境は下記URLを参考に整えました.
[http://www.futomi.com/lecture/macosx/dbd_mysql.html]
detest.cgiのソースコードは
#!/opt/local/bin/Perl # 下2行はおまじない use strict; use warnings; # データベースへ接続するためのモジュールを読み込む use DBI; # データソースの登録 my $db_source = 'DBI:mysql:abc'; # ユーザー名 my $user = 'abc'; # パスワード my $pass = 'abcd'; # SQL ステートメント my $statement = 'SELECT `id` FROM `test` LIMIT 0 , 30;'; # データベースへの接続 # 失敗したら、エラーを表示して実行を終了させる my $dbh = DBI->connect($db_source, $user, $pass) || die $DBI::errstr; # SQL ステートメントをコンパイルする # 失敗したら、エラーを表示して実行を終了させる my $sth = $dbh->prepare($statement) || die $dbh->errstr; # コンパイルした SQL ステートメントを実行する # 失敗したら、エラーを表示して実行を終了させる my $result_set = $sth->execute || die $sth->errstr; # SQL ステートメントの実行に成功をしたら # 実行結果を取得する print "Content-Type: text/html\n\n"; print "\n"; if ($result_set) { # 結果件数を取得する my $rows = $sth->rows; # 結果件数を表示する print "$rows records found.\n"; # 結果件数分の処理を行う for (my $i = 0; $i < $rows; $i++) { # 実行結果を1件ずつ取得する my @result = $sth->fetchrow_array; # 実行結果の値を表示する print "$result[0]\n"; } } # ステートメントハンドルのオブジェクトを閉じる $sth->finish; # データベースハンドルのオブジェクトを閉じる $dbh->disconnect; exit;
となってます.
クライアント側のエラーはInternal Server Errorです.
サーバ側のエラーは
tail -f /private/var/log/apache2/error_log
で表示したものは
[Fri Dec 18 17:54:29.075038 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] AH01215: install_driver(mysql) failed: Can't locate DBD/mysql.pm in @INC (@INC contains: /Library/Perl/5.16/darwin-thread-multi-2level /Library/Perl/5.16 /Network/Library/Perl/5.16/darwin-thread-multi-2level /Network/Library/Perl/5.16 /Library/Perl/Updates/5.16.3 /System/Library/Perl/5.16/darwin-thread-multi-2level /System/Library/Perl/5.16 /System/Library/Perl/Extras/5.16/darwin-thread-multi-2level /System/Library/Perl/Extras/5.16 .) at (eval 3) line 3.: /Library/Server/Web/Data/Sites/sugi-tomo.com/dbtest.cgi [Fri Dec 18 17:54:29.106924 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] AH01215: Perhaps the DBD::mysql perl module hasn't been fully installed,: /Library/Server/Web/Data/Sites/abcdefg.com/dbtest.cgi [Fri Dec 18 17:54:29.106966 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] AH01215: or perhaps the capitalisation of 'mysql' isn't right.: /Library/Server/Web/Data/Sites/abcdefg.com/dbtest.cgi [Fri Dec 18 17:54:29.107004 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] AH01215: Available drivers: DBM, ExampleP, File, Gofer, Proxy, SQLite, Sponge.: /Library/Server/Web/Data/Sites/abcdefg.com/dbtest.cgi [Fri Dec 18 17:54:29.107041 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] AH01215: at /Library/Server/Web/Data/Sites/abcdefg.com/dbtest.cgi line 21.: /Library/Server/Web/Data/Sites/abcdefg.com/dbtest.cgi [Fri Dec 18 17:54:29.107075 2015] [cgi:error] [pid 94505] [client 126.236.146.142:50492] End of script output before headers: dbtest.cgi
となっています.ちなみにターミナルからdbtest.cgiの
print "Content-Type: text/html\n\n”;
をコメントアウトして実行するとちゃんと動作します.
また,detest.cgiを
#!/usr/bin/perl5.16 print "Content-type: text/html\n"; print "\n"; print "<html>\n"; print "<head>\n"; print "<title>test</title>\n"; print "</head>\n"; print "<body bgcolor=\"#fffffff\">\n"; print "This is test CGI.\n"; print "</body>\n"; print "</html>\n";
と書き換えるとwebからアクセスしても動作します.ちなみに
perl -E 'say for @INC'
コマンドでの出力結果は
/opt/local/lib/perl5/site_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/site_perl/5.16.3 /opt/local/lib/perl5/vendor_perl/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/vendor_perl/5.16.3 /opt/local/lib/perl5/5.16.3/darwin-thread-multi-2level /opt/local/lib/perl5/5.16.3 /opt/local/lib/perl5/site_perl /opt/local/lib/perl5/vendor_perl
となっていてどうしてエラーメッセージにあるようなディレクトリが参照されるのかわかりません。
DBD/mysqlは/opt/local/lib/perl5/site_perl/5.16.3/darwin-thread-multi-2level
に入っていて
perl -MDBD::mysql -e 1
コマンドでもエラーを吐かないです。
どうして,webからアクセスした場合はDBD::mysqlが使えなくなってしまうのかどうしてもわかりません.どなたかお助けください.
perl -v
コマンドの結果は
This is perl 5, version 16, subversion 3 (v5.16.3) built for darwin-thread-multi-2level Copyright 1987-2012, Larry Wall Perl may be copied only under the terms of either the Artistic License or the GNU General Public License, which may be found in the Perl 5 source kit. Complete documentation for Perl, including FAQ lists, should be found on this system using "man perl" or "perldoc perl". If you have access to the Internet, point your browser at http://www.perl.org/, the Perl Home Page.
でした。ターミナルからdbtest.cgiを実行したときのコマンドは
perl5.16 dbtest.cgi
でContent-Typeをコメントアウトしなくてもdetest.cgiは動作しました.
which Perl
コマンドの出力結果は
/opt/local/bin/Perl
でした。
回答2件
あなたの回答
tips
プレビュー