AN HTTPD ゲストブック/コメント集(2004年3月11日00:34)


竹嶋 健二 kenji@kzh.biglobe.ne.jp 2004/03/16 02:44

AN HTTPD + PHP + MySQL の日本語表示の問題の続きですが、PHP を最新版に変更して、
日本語パッチを当てることで、HTML を簡素化することにしました。

いとさんの解説ページ、「AN HTTPDでPHPを動かす」
http://homepage1.nifty.com/yito/anhttpd/faq/php.html
には、
http://homepage1.nifty.com/yito/anhttpd/faq/xoops.html
「AN HTTPDで XOOPS を動かす」を視野に入れた場合等、
「確実性を求める人は 4.3.1を使い、それ以降のバージョンは使わないのがいいかと思います。」
とありましたので、できれば避けたかったのですが、「php.ini」を、どう書き換えても、
「SJIS」スプリプト及び、「MySQL」の「SJIS」データが、デフォルトで、文字化けしてしまいます。
「php.ini」の「SJIS」指定が完全に無視されているとしか思えません。
手順としましては、まず、
http://www.php.net/downloads.php
から、「php-4.3.4-Win32.zip」をダウンロードして、解凍します。
次に、
http://www.geocities.jp/rui_hirokawa/php/
「PHP 日本語ページ」の、
http://www.geocities.jp/rui_hirokawa/php/
「マルチバイト対応版PHP-4.3.4 (PHP 4.3.4,マルチバイト対応版v.1.1)」
をダウンロード・解凍して、中身を、先ほど解凍した「php-4.3.4-Win32」に上書きします。
あとは、いとさんの解説ページに従って進めますが、補足事項が、二点あります。

* 添付のdll(dlls/*.dll)をパスの通っているディレクトリ(C:\Windows\system32 等)にコピーする。
* 「extensions=php_mbstring.dll」を二重登録しない
  (「extension=php_mbstring.dll」の外した「;」を元に戻して、再度コメント化する)

この二点を守らないと、正常に動作しません。

その他、変更点:
default_charset = "Shift_JIS"
mbstring.internal_encoding = SJIS

AN HTTPD + ActivePerl + MySQL では、問題なく動作して、
AN HTTPD + PHP + MySQL ではエラーが出た、以下の件は、
「C:\mysql\share\」を作成、「charsets」をすべての中身ごと、そのフォルダ内にコピーすることで、解決としました。
「sjis.conf」だけをコピーするのでは、なぜかエラーが出ました。


File 'c:\mysql\\share\charsets\?.conf' not found (Errcode: 2) Character set '#13' is not a compiled character set and is not specified in the 'c:\mysql\\share\charsets\Index' file

これは、最新版に、日本語パッチを当てた時点で確認したところ、


File 'c:\mysql\share\charsets\?.conf' not found (Errcode: 2) Character set '#13' is not a compiled character set and is not specified in the 'c:\mysql\share\charsets\Index' file

と、「\\」の二重表示がなくなっていました。

PHP でエラーとなる、「C:\mysql\share\charsets」のディレクトリ指定を、当方の環境に変更しようとしたのですが、
どうも、「php4ts.dll」内で指定しているようで、ファイルをしばらくいじってみましたが、成功しませんでした。

AN HTTPD + ActivePerl + MySQL では、特に指定しなくても、
「E:\xxx\yyy\zzz\MySQL\share\charsets」のパスが通っていたので、少々不満です。
やはり、いとさんの解説ページは、確信に近いものがありますね。
「sjis.conf」はその場所に、置かなければなりません。その他の場所は不可という結論です。


MySQLについては、
http://homepage1.nifty.com/yito/anhttpd/faq/mysql.html
の 6. 日本語表示 のところを読んでください。

中田様、
ご指導、ありがとうございます。あらためて、そのとおりにいたしました。また、


ご自分のページで解説等をしてくださるのは、もちろんかまいません。

ご許可、ありがとうございます。
当方の環境が、光 100MB になりましたら、正式に公開する予定ですので、それまでに、
可能な限りのことを試してみたいと思います(現在、4ヶ月、待たされています)。
いまは、Windows2000 Pro + AN HTTPD 1.42k を、DynDNS にて、ISDN で、試験公開してかれこれ二週間になります。
(OS、サーバとも、再起動回数「0」です)

今回の結論である、PHP スクリプトを、似たようなことをされている方の参考になればと思い、以下に記します。
「MySQL_SJIS.php」のように、適当に名前をつけて、「SJIS」で保存してください。

<HTML> 
<HEAD>
<TITLE>全国郵便番号</TITLE>
</HEAD>
<BODY>
<TABLE ALIGN="CENTER" WIDTH="750" BORDER="5" CELLSPACING="3" CELLPADDING="2" BGCOLOR="snow" BORDERCOLOR="lightyellow" BORDERCOLORLIGHT="ivory" BORDERCOLORDARK="lemonchiffon">
<?php
echo "<TR>";
echo "<TH NOWRAP>郵便番号</TH></NOBR>";
echo "<TH NOWRAP>都道府県</TH></NOBR>";
echo "<TH NOWRAP>市区町村</TH></NOBR>";
echo "<TH NOWRAP>詳細</TH></NOBR>";
echo "</TR>";
$db = mysql_connect('localhost','User_Name','User_PassWord');
mysql_select_db('DataBase_Name');
$sel = mysql_query('SELECT newpost,pref,area,addr from jp_zipcode WHERE pref="東京都" ORDER BY newpost');
while ($row = mysql_fetch_array ($sel)) {
echo "<TR>";
echo "<TD>".$row["newpost"]."</TD>";
echo "<TD>".$row["pref"]."</TD>";
echo "<TD>".$row["area"]."</TD>";
echo "<TD>".$row["addr"]."</TD>";
echo "</TR>";
}
mysql_free_result ($sel);
mysql_close($db);
?>
</TABLE>
</BODY>
</HTML>


中田昭雄 nakata@st.rim.or.jp 2004/03/15 20:39

竹嶋さん、
MySQLについては、
http://homepage1.nifty.com/yito/anhttpd/faq/mysql.html
の 6. 日本語表示 のところを読んでください。

ご自分のページで解説等をしてくださるのは、もちろんかまいません。


竹嶋 健二 kenji@kzh.biglobe.ne.jp 2004/03/15 00:41

しばしばすみません。竹嶋 健二です。

AN HTTPD + ActivePerl + MySQL についてなのですが、Perl / CGI からの呼び出しで、
ユーザ名とパスワードの指定方法は、この前書きましたが、
タグ表示がどうなるのかわからなかったため、「( )」が余分についています。
正式に、もう一度書いておきたいと思います。

$db = DBI->connect('DBI:mysql:DataBase_Name','User_Name','User_PassWord') || die "CONNECT ERROR $DBI::ERRSTR";

詳しい導入方法は、

http://homepage1.nifty.com/yito/anhttpd/faq/mysql.html

「MySQLのインストール/動作確認手順」を参考にしました。

このページに、AN HTTPD + PHP + MySQL が続いて解説されていましたので、
データベースのデータに、日本語が含まれる場合をやってみました。

日本語データの含まれるテーブルは、以下のページを参考に作成します。

http://y-kit.jp/saba/xp/mysqltry1.htm
http://y-kit.jp/saba/xp/mysqltry2.htm
http://y-kit.jp/saba/xp/mysqltry3.htm

「SQLコマンドでMySQLデータベースを使ってみよう  準 備 篇」に、
全国郵便番号のデータと、その登録方法が掲載されていました。
まず、そのとおりにやってみます。
次に、

http://www.spencernetwork.org/

「PHP SAMPLES & TIPS」の中の

http://www.spencernetwork.org/jcode/

より、「国際化されてなくても変換したい方へ」
の、最新版をダウンロードして、解凍、
PHP スクリプト等を置く場所へ、コピーします。
これで、一応、日本語表示が可能になります。
それから、

http://www.softagency.co.jp/mysql/Manual/4.1.1/html-split/manual_3.html#SEC180

を参考に、作成したデータをソートしつつ、ブラウザで表示します。
「MySQL.php」などと適当な名前をつけて、「SJIS」で、次のスクリプトを保存します。

<HTML> 
<HEAD>
<TITLE>PHP TEST</TITLE>
</HEAD>

<BODY>
<TABLE ALIGN="CENTER" WIDTH="750" BORDER="5" CELLSPACING="3" CELLPADDING="2" BGCOLOR="snow" BORDERCOLOR="lightyellow
" BORDERCOLORLIGHT="ivory" BORDERCOLORDARK="lemonchiffon">
<?php
include_once("./jcode.phps");
echo "<TR>";
echo "<TH NOWRAP>";
$Str = "郵便番号";
echo JcodeConvert($Str, 0, 1);
echo "</TH></NOBR>";
echo "<TH NOWRAP>";
$Str = "都道府県";
echo JcodeConvert($Str, 0, 1);
echo "</TH></NOBR>";
echo "<TH NOWRAP>";
$Str = "市区町村";
echo JcodeConvert($Str, 0, 1);
echo "</TH></NOBR>";
echo "<TH NOWRAP>";
$Str = "詳細";
echo JcodeConvert($Str, 0, 1);
echo "</TH></NOBR>";
echo "</TR>";
$db = mysql_connect('localhost','User_Name','User_PassWord');
mysql_select_db('DataBase_Name');
$sel = mysql_query('SELECT newpost,pref,area,addr from Table_Name WHERE pref="東京都" ORDER BY newpost');
while ($row = mysql_fetch_array ($sel)) {
echo "<TR>";
echo "<TD>".$row["newpost"]."</TD>";
echo "<TD>";
$Str = $row["pref"];
echo JcodeConvert($Str, 0, 1);
echo "</TD>";
echo "<TD>";
$Str = $row["area"];
echo JcodeConvert($Str, 0, 1);
echo "</TD>";
echo "<TD>";
$Str = $row["addr"];
echo JcodeConvert($Str, 0, 1);
echo "</TD>";
echo "</TR>";
}
mysql_free_result ($sel);
mysql_close($db);
?>
</TABLE>
</BODY>
</HTML>
以上のとおりにすると、「MySQL」が、「ぷぷっ!」と鳴いて、ソートされたデータが、HTML 表示されます。
(「JcodeConvert」に少し時間がかかります)

注意事項:
「localhost」は、「localhost」のまま、
「DataBase_Name」は、データを格納したデータベース名を、
「Table_Name」は、データを格納したテーブル名を、
「User_Name」は、(作成した)通常ログインするユーザ名を、
「User_PassWord」は、ユーザのパスワードを、
それぞれ指定します。

「pref="東京都"」の「東京都」は、お好きな都道府県名をどうぞ。

ここで、「MySQL」が「ぷぷっ!」と鳴いた理由ですが、
当方の環境では、ページの一番下に、エラーメッセージらしきものが表示されています。

File 'c:\mysql\\share\charsets\?.conf' not found (Errcode: 2) Character set '#13' is not a compiled character set and is not specified in the 'c:\mysql\\share\charsets\Index' file

当方、「MySQL」を、「E:\xxx\yyy\zzz\MySQL」などにインストールしているためなのか、
どうも、文字コードが見当たらない旨のメッセージのようですが、解決方法がわかりません。

このメッセージのない方は、「MySQL」が鳴くこともないと思われます。

解決方法をご存知の方がいらっしゃいましたら、
また、こんなややこしいことをしなくても、もっと簡単な方法がありましたら、
教えていただけたらとっても嬉しいです。

自宅サーバが本格作動した暁には、中田さん(と、いとさん)のお許しが出ましたら、
いとさんの解説ページをフォローアップできるようなページを、自宅サーバ上に、展開したいと思っています。

とりあえず、自分の環境では、どこそこのページを参考に、サーバを構築したかなどと。

AN HTTPD が、フリーソフトということも含めて、中田さん、いとさん、諸々の先達に、感謝します。
こういう、すばらしいソフトは、もっと、広めたいです。

いきなり出てきてずうずうしいですが、中田さん、いとさん、ご許可をお願いします。


竹嶋 健二 kenji@kzh.biglobe.ne.jp 2004/03/11 00:34

どうも。はじめまして。竹嶋 健二と申します。
このたび、自己解決したご報告をしたいと思います。

当方の環境:

WindowsXP Pro SP1
Office2003 Pro
CPU : Intel Pentium4 2.40GHz
RAM : 1024MB

AN HTTPD : バージョン 1.42k
ActivePerl : ActivePerl-5.6.1.628.msi
KAKASI for Win32 : kakasi-2.3.4
Namazu for Win32 : Namazu 2.0.12
search-s for Namazu : srchs092.exe
Adobe Reader 6.0
MySQL : 4.0
PHP : 4.3.1
//

Windows2000 Pro
Office2000 Pro
CPU : Intel PentiumV 866MHz
RAM : 512MB + 64MB
AN HTTPD : 1.42k
ActivePerl : 5.6.1.628

という、2本立てになります。

2台とも、AN HTTPD その他のソフトは、Windows ドライブをはずして、
「E:\xxx\yyy\zzz\」のようにインストールしてあります。

じつは、AN HTTPD は、PC-9801 / Windows95 の時代より、使用させていただいておりますが、
このたび、IIS にかかわることになりそうなので、とりあえず、
「自サーバのセキュリティ検証」ということで、
Windows2000 を、DynDNS にて、かれこれ 10日ほど公開しております。

公開ということになれば、「安全」と「安定」が求められますから、
AN HTTPD が、もしや落ちたりはしないかなどという実験をしている最中です。

で、AN HTTPD は最新版がよい、その他のソフトはクエスチョン、ということのようなので、

http://homepage1.nifty.com/yito/anhttpd/install.html

http://homepage1.nifty.com/yito/anhttpd/env.html

を、参考に、ActivePerl : 5.6.1.628 を、クリーンインストールしてみました。


1.Perlをインストールしたフォルダ(例えば C:\Perl)以下を削除する。複数フォルダある場合はそれらを全て削除。
2.レジストリエディタ(regedit.exe)で以下のレジストリが存在すれば全て削除する。
 ・HKEY_LOCAL_MACHINE\Software\ActiveState
 ・HKEY_LOCAL_MACHINE\Software\ActiveWare(Perl for Win32をインストールした場合に存在)
 ・HKEY_LOCAL_MACHINE\Software\Perl
3.AUTOEXEC.BATのPATH(Win9x)や環境変数のPATH(WinNT系)に C:\Perl\bin などPerlのパス設定があれば削除する。
4.アプリケーションの追加と削除の一覧に名前だけ残ったときは、窓の手などのツールを使って削除する。


WiundowsXP にて、以上のようにしたところ、
「コントロールパネル」に、登録情報だけが残ってしまいまして、
仕方なく、
ActivePerl-5.8.0.805-MSWin32-x86.msi 及び、
ActivePerl-5.8.3.809-MSWin32-x86.msi の、
再インストールを試みたところ、完全に削除することができました。
順番としましては、
ActivePerl-5.8.0.805-MSWin32-x86.msi を入れて、削除、
ActivePerl-5.8.3.809-MSWin32-x86.msi を入れて、削除、
ActivePerl-5.6.1.628-MSWin32-x86-multi-thread.msi を入れたところで、
登録情報が残っていることに気が付き、すべて、
再インストールの「削除」オプションを併用しての削除、
その後、ActivePerl-5.6.1.628-MSWin32-x86.msi をインストール、
ということになります。
どうも当方の環境では、レジストリと「窓の手」だけでは不十分で、
その後、再インストールの「削除」オプションで、
完全削除をしないといけないようです。

ここから、WindowsXP の、本格自サバ計画が始まります。

http://homepage1.nifty.com/yito/anhttpd/faq/index.html

の記事から、「sendmail」を、装備、

http://y-kit.jp/saba/

を参考に、「MySQL」の搭載、

http://www.geocities.co.jp/SiliconValley-SanJose/2576/
及び、
http://sl.hunet.ne.jp/cgi/_cool/namazu2/

を見て、「Namazu」を入れる、と来たところで、
「Namazu」が、Office2003 Pro を認識しないという問題に突き当たりまして、
昨日(もう今日のことになりますが)ようやく、あちらへ自己解決の報告メールを出したところです。
何が必要で、何が必要でないか、また、何が悪いのかが、
まったくわからない状態での作業でしたから、
結構手間取りまして、自己解決のメールを出して、
「Namazu」サイドの、最新ログを見ましたところ、
私めの、約3時間前に、「Namazu」より、同様の解決がなされていた旨、知りました。
「Namazu」の、Office2003 への、対応状況に興味がある方は、

http://www.queen.ne.jp/iMA/showmdir.pl?namazu-devel-ja=Current

を見てください。「竹嶋 健二」の名で、投稿しております。

さて、これより、「MySQL」を、CGI 対応しましたところ、なにやら、

http://homepage1.nifty.com/yito/anhttpd/faq/mysql.html

に、PHP なるものの記述があるではありませんか。
「MySQL」の、CGI 化は、ユーザ名とパスワードの設定方法が記載されていなかったため、
少々手間取りましたが、解決は比較的早かったです。正解は、

$db = DBI-(>)connect('DBI:mysql:DataBase_Name','User_Name','PassWord') || die "CONNECT ERROR $DBI::ERRSTR";

になります。
ところで、PHP って、導入は簡単なはずですよね。

http://homepage1.nifty.com/yito/anhttpd/faq/php.html

に書いてあるとおりです。
いずれのログを見ても、紹介ページの記載どおりにしていなっかたため、
正常に動作しなかったようです。
「(ここのところを)よく読んでください」というアドバイスに終始しておりまして、
皆さん、それで解決していらっしゃいます。
というわけで、私めも、同様の投稿をするのがいやだったため、自己解決に至りました。

ところが、どう頑張っても、「php.ini」の「423行目」にエラーが出て、動作しません。
これを、「c:\php\sapi\php4isapi.dll」のようにすると、セキュリティエラーも出ず、
いとも簡単に作動するのです。
「php.ini」を、間違って複数個作ってしまったのではないかという疑いで、
すべてのドライブの検索も、何度かいたしました。


Security Alert! The PHP CGI cannot be accessed directly.

This PHP CGI binary was compiled with force-cgi-redirect enabled. This means that a page will only be served up if the REDIRECT_STATUS CGI variable is set, e.g. via an Apache Action directive.


まったく、過去の投稿と、同じ症状です。お話になりません。
仕方なしに、「最新版」の導入を検討いたしまして、ダウンロード、解凍もいたしました。
で、解決いたしました。

確実性を求める人は 4.3.1を使い、それ以降のバージョンは使わないのがいいかと思います。

と、あったので、できることなら避けたかったのですが、ソースを見ても、皆目わかりません。

いや、それでですね、「4.3.1」で解決したのです。
「php-4.3.4-Win32.zip」を解凍して得られたものを、手順どおりに、
コピペ、リネームして、「php.ini」の書き換えに取り掛かったところ、
問題の「423行目」が、

extension_dir = ./

ではなく、

extension_dir = "./"

と、なっておりました。

慌てて、削除してしまった「4.3.1」を解凍しなおして、

extension_dir = "E:\xxx\yyy\zzz\PHP\extensions\"

としましたところ、テストページは、完全動作いたしました。

extension_dir = E:\xxx\yyy\zzz\PHP\extensions\

は、どうも、バグの、一種のようですね。

いやあ、「C言語風」に記述すればよい、などというログもあって、

extension_dir = /[Ee]\|/xxx/yyy/zzz/PHP/extensions/

みたいな書き換えも、少しずつ修正しながら、何度もトライしてみたのですが、
結論に至るまで、徹夜で、24時間かかりました。

そういうわけで、このたびのご報告を終わります。

ところで、WoindowsXP に、AN HTTPD を搭載するまでは、
現在 IIS が入っている、Windows2000 に、AN HTTPD を入れて、
ローカルなテストなどをしていたのですが、

print "Content-type: text/html\n";

の記述が、まかりとおっておりました。
BIGLOBE のサーバでも、問題なく、動作しております。
無論、正解は、

print "Content-type: text/html\n\n";

なのでしょうが、Windows2000 で動いて、WindowsXP で動かないのは何故?
と、思います。

「Transfer-Encoding: chunked 2BD」と、でます。
悪ければ、デバッガが、立ち上がります(設定変更していないものですから)。

それと、いま、書き込み中に、間違えて、「ESC」を何度も押してしまったのでしょうか、
九分通り書いたところで、メールアドレスもろとも、すべての文章が消えてしまいました。
そのため、日付の記述が、厳密には、一日ずれてしまっています。
これは、「仕様」になるのですね?

長々と、失礼いたしました。