AN HTTPD ゲストブック/コメント集(2000年2月10日22:27)


MIMIC sanson@maol.hikoboshi.net 2000/02/18 00:18

sub viewDataとsub addDataを変更すると

メッセージ(何か書き込みに失敗したようです)

と表示されて

実行時エラー'75':
パス名が無効です。

と表示されます。
どうして変更できないのですか?教えてください。


中田昭雄 nakata@st.rim.or.jp 2000/02/17 20:39

MIMIC さん、
一度も登録せず表示させようとすると「データベース ./tmp/mydb がオープンできません。」というエラーになりますが、そんなことはありませんか?
つまり、最初に何か登録をしてみてください。

そういう話ではないとすると、ちょっと調べてみないといけませんね。

(1)まず、「データベースがオープンできない」というエラーは2箇所で出ます。
そのどちらでエラーが起きているか調べるために、
sub viewData の中の、
"データベース $dbfile がオープンできません。"
のところを
"データベース $dbfile がオープンできません。(viewData)"
と変更し、
sub addData の中の、
"データベース $dbfile がオープンできません。"
のところを
"データベース $dbfile がオープンできません。(addData)"
と変更してください。

そして、登録をしてみて、
(1a)「データベース ./tmp/mydb がオープンできません。(viewData)」と出たら、登録ボタンが機能していません。 $in('Action') が 'Add' になっていないわけです。
そうなる理由としては、ブラウザの JavaScript をオフにしていることなどが考えられます。
(1b)「データベース ./tmp/mydb がオープンできません。」と出たら、思っているのと違うsimpledb2.cgiが起動されています。 ドキュメントルートの設定や simpledb2.html の内容が変なのでしょう。
(1c)「データベース ./tmp/mydb がオープンできません。(addData)」と出たら、(2)へ。

(2)addDataの方でエラーが出るようなら、

$Location = './tmp';
$dbfile = $Location.'/mydb';

のところを、

$Location = 'C:/httpd124/MASA/tmp';
$dbfile = $Location.'/mydb';

と変更して登録をしてみてください。
それで、
「データベース C:/httpd124/MASA/tmp/mydb がオープンできません。(addData)」
と出たら重症です。

以上でうまくいかなかった場合は、それぞれの結果がどうっだたのかメールで詳しく説明してください。
その内容は他の人にはもうそれほど役に立つ話ではないでしょうから、メールでお願いします。


ぴゅあ pure@GalaxyCorp.com 2000/02/17 18:33

>MIMICさん
 取り敢えずスクリプト関係ということで書かせて頂きます。
 まずMASAディレクトリというのがその中にsimpledb2.cgiを入れてあるということですよね?
 その上でMASAディレクトリ内にtmpフォルダ(ディレクトリ)を作ったということですよね?
 ああこの辺は「中田昭雄 2000/02/14 21:38」

 それで前と同じエラーになるのでしょうか?
> データベース ./tmp/mydb がオープンできません。
> No such file or directory
 うーむ。。。。

 ただソースコードを見た訳ではないので頂いた情報の範囲からはうーむ。。。。でしかないで
すけど


MIMIC sanson@mail.hikoboshi.net 2000/02/17 17:24

ちゃんとMASAディレクトリ内にtmpディレクトリを作りましたが
また前と同じくエラーになります。どうすればいいのですか???
教えてください。お願いします。


中田昭雄 nakata@st.rim.or.jp 2000/02/14 21:38

MIMIC さん、

temp ではなくて tmp です。C:\httpd124\MASA\tmp というディレクトリが作ってあればいいはずです。

以上でいけるはずですが、ついでに、
mydb は作っても作らなくてもこの場合は関係ありません。 データベースファイルは tie で O_CREAT で自動的に作られますが、その場合も実際に作られるファイル名は mydb ではなく、 mydb.pag と mydb.dir になりますから。
また、use lib './lib' から推定すると、lib ディレクトリを作って、その中に jcode.pl や util.pl を入れることを想定しているようです。

以上のことは、本に解説してあるはずだと思うのですが、題名が「ポケットリファレンス」ですからあまり丁寧に説明していないのかもしれませんね。 内容を理解して応用しようということであれば、最初のうちは「〜入門」とかいう本の方がいいのではないかと思います。

なお、スクリプトの全文引用はどうかと思ったので必要なところのみに直させてもらいました。


通りすがり aaa@bbb.com 2000/02/14 18:35

MIMICさん
util.plの中身が解らないのでなんとも言えませんが、
tmpフォルダの中のmydbを
"フォルダ"ではなくて"ファイル"にすれば大丈夫だと思います。


道添 ilh@mail.goo.ne.jp 2000/02/14 18:21

MIMICさん
作成したディレクトリの場所を確認してみてください。
>データベース ./tmp/mydb がオープンできません。
とあるので、作成する場所はそのCGIを置いてあるディレクトリで作成されていなければなりません。(いや、と思います。汗)
作成した場所が違っても上記のメッセージが表示されると思いますよ!
ちなみに、あんなさんのコメントのとおり、tempディレクトリの中にmydbディレクトリを作成してみてください。


MIMIC sanson@mail.hikoboshi.net 2000/02/14 16:24

tempディレクトリとmydbディレクトリを作りましたが 
また前と同じくエラーになります。

一応simpledb2の全文を張り付けます。
どうすれば直るのか教えてください。お願いします。

#!/usr/bin/perl
#
# simpledb2.cgi
#
# (C)1999 Kaoru Fujita
#
use lib './lib';

require 'util.pl';

use Fcntl;
use SDBM_File;

#
# 定数
#
$Title = '簡易データベースのサンプル(2)';
$Location = './tmp';
$dbfile = $Location.'/mydb';
$delim = ',';
$Encoding = 'sjis';
$CharSet = 'Shift_JIS';

@Fields = ('LastName', 'FirstName', 'Sex', 'E-Mail', 'Telephone');

parseInput($Encoding);

if ($in{'Action'} eq 'Add') {
addData();
}
else {
viewData();
}

exit(0);


#
#
#
sub viewData
{
tie(%DB, SDBM_File, $dbfile, O_RDONLY, undef) or
exitError("データベース $dbfile がオープンできません。");

print "Content-Type: text/html\n\n";
print "<HTML>\n";
print "<HEAD>\n";
print "<META HTTP-EQUIV=\"Content-Type\" CONTENT=\"text/html\; charset=$CharSet\">\n";
print "<TITLE>$Title</TITLE>\n";
print "</HEAD>\n";
print "<BODY>\n";
print "<TABLE>\n";
print "<TR>\n";
for ($i=0; $i < scalar(@Fields); $i++) {
print "<TH>$Fields[$i]</TH>\n";
}
print "</TR>\n";
foreach (sort values %DB) {
print "<TR>\n";
@data = split(/$delim/);
for ($i=0; $i < scalar(@Fields); $i++) {
print '<TD BGCOLOR="#F0F0F0">',$data[$i],"</TD>\n";
}
print "</TR>\n";
}
print "</TABLE>\n";
print "</BODY>\n";
print "</HTML>\n";

untie(%DB);
}

#
#
#
sub addData
{
tie(%DB, SDBM_File, $dbfile, O_CREAT|O_RDWR, 0600) or
exitError("データベース $dbfile がオープンできません。");

$key = $in{'E-Mail'};
if ($DB{$key}) {
exitError("すでに同じE-Mailアドレス $key があります。");
}

foreach (@Fields) {
$rec = $rec.$in{$_}.$delim;
}
chomp($rec);
$DB{$key} = $rec;

untie(%DB);

print << "END_OF_HTML";
Content-Type: text/html

<HTML>
<HEAD>
<META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=$CharSet">
<TITLE>$Title</TITLE>
</HEAD>
<BODY>
登録しました。
</BODY>
</HTML>
END_OF_HTML
}

#--End of simpledb2.cgi


あんな tamatoku@messages.to 2000/02/14 01:25

MIMICさん、

simpledb2.cgi が入っているディレクトリに tmp という名前のディレクトリを
作るんだと思います。
もしかすると、さらに tmp ディレクトリに mydb という名前の空のファイルを
作らないといけないかも知れません。


MIMIC sanson@mail.hikoboshi.net 2000/02/14 01:03

下の投稿ですが18行目にあるjcodeをコピーしたらできました。

しかし今度はこのように表示されました。
データベース ./tmp/mydb がオープンできません。
No such file or directory

CD-ROM内をmydb で検索しても何も見つかりません。
どうすればいいのですか?
教えてください。お願いします。


MIMIC sanson@mail.hikoboshi.net 2000/02/14 00:55

今度は

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:

Can't locate jcode.pl in @INC (@INC contains: ./lib C:/httpd124/Perl/lib C:/httpd124/Perl/site/lib .) at C:/httpd124/Perl/site/lib/util.pl line 18.

となっていたので
18行目を見ると
$Location = './tmp';
と表示されています。
これはどこをどう直せばいいのでしょうか?
教えてください。お願いします。


中田昭雄 nakata@st.rim.or.jp 2000/02/13 23:33

MIMIC さん、
その本は私は(本屋で見たような気はしますが)持っていないので推測で書きます。

C:\httpd124\MASA にあるべき util.pl がないのでエラーになっています。

CD-ROM中の、simpledb2.cgi があるのと同じフォルダに util.pl がありませんか?
あったら、それを simpledb2.cgi と同じところにコピーしてください。

もしないようなら、CD-ROMのどこかにあるはずなので、ファイル検索でCD-ROM全体をさがしてみてください。
あったら、それを C:\httpd124\Perl\site\lib にコピーしてください。

simpledb2.cgi 中の require 'util.pl' では、util.pl を自動的に捜してくれるのですが、捜す範囲は、@INC に設定されているフォルダ(ディレクトリ)内です。
それが、
@INC contains: ./lib C:/httpd124/Perl/lib C:/httpd124/Perl/site/lib .
ということなので、.\lib か C:\httpd124\Perl\lib か C:\httpd124\Perl\site\lib か . にutil.pl がないと見つからないというエラーになります。
(最後の . は カレントディレクトリつまり、この場合は C:\httpd124\MASA ということです。)

なお、CD-ROMから単にコピーしたファイルは 読み取り専用属性になっていると思うので、書込みや編集が必要なものはその属性のチェックをはずしてください。
ファイルを右クリックしてプロパティの中に属性のチェックボックスがあります。


MIMIC sanson@mail.hikoboshi.net 2000/02/13 21:46

技術評論社から出てるポケットリファレンスのCGI&Perl付属のCD-ROMからなんですが


中田昭雄 nakata@st.rim.or.jp 2000/02/13 20:56

MIMICさん、
simpledb2.cgi というのがどこの何なのかわからないのでなんとも。。。
入手したのが書籍でしたらその書籍名、インターネット上ならどこのサイトの何というCGIなのか教えてください。

一般的には、付属の説明書きにしたがってやり直すのがいいでしょう。


MIMIC sanson@mail.hikoboshi.net 2000/02/13 20:26

下のコメントのsimpledb2.CGIはsimpledb2.cgiなんですが
書き間違えてしまいました。


MIMIC sanson@mail.hikoboshi.net 2000/02/13 20:23

simpledb2.CGIの9行目が「require 'util.pl';」となっていました。
util.plを探してみたのですが、見つかりません。
インストールをし直した方がいいのでしょうか?
その場合どうインストールすればいいのですか?
インストールした後の設定を変えるんですか?

本当に初歩的ですいません。
教えてください。お願いします。


ぴゅあ pure@GalaxyCorp.com 2000/02/11 06:00

>MIMICさん(補足)
 @INCの内容から見るとたぶんActivePerlを使われている(Perl for Win32ではない)のでし
ょう。util.plがPerlライブラリなのかどうかは調べていません(Perl for Win32は持ってい
ない)がsimpledb2.CGIの9行目は「require 'util.pl';」となっていることと思います。
 util.plがPerlライブラリのつもりであるならPerlのインストール失敗ということも考えられ
るでしょう。
 自前であるならutil.plの名前が間違っていないか,或いは何処に入れてあるか探せば解決で
きるものと思います。
 自作の場合でよく見かけるミスの傾向としてファイル名の一部が全角文字になっているという
ことなどがあります。

・補足
 ローカルテストということですのでプロバイダ上のUNIXサーバにアップすることもあるので
しょうか。(メッセージがペーストされたものだとして)少なくとも拡張子は英小文字で書く癖
を付けておいた方が良いと思います。


しらかべの☆ジミー jimmy@kibiji.gr.jp 2000/02/11 05:10

MIMICさん、
CGIを勉強されているようで、まだ良く分からない点もおありでしょうが、
まず、エラー500はたいてい、スクリプトがエラーで終了してます。おそらく、
Content-Typeヘッダ出力前の終了なので、ヘッダが正しくないと出るのでしょう。
あと、CGIからの出力が、Perlのエラーメッセージそのものです。
メッセージの通り、util.plのインクルードの失敗です。おそらく、
simpledb2.CGI9行目で、インクルードしてるでしょう?それができなくて止まってます。
perlのパスの設定か、インストールの不完全が問題だと予測されるのでご確認ください。


MIMIC sanson@mail.hikoboshi.net 2000/02/10 22:27

たびたびすいません
ローカルテストをしたのですが
今度は

Error 500
CGI エラー - Content-Type ヘッダが正しくありません。
CGI 出力メッセージ:
Can't locate util.pl in @INC (@INC contains: ./lib C:/httpd124/Perl/lib
C:/httpd124/Perl/site/lib .) at C:\httpd124\MASA\simpledb2.CGI line 9.

と表示されます。どこがわるいんでしょう?
教えてください。お願いいたします