LAMP(Linux, Apache, MySQL, PHP)の環境ができました。すばらしいオープンソースを使って、カウンターを作ることにしました。
ホームページは、index.htmlのページから見てくれるとは限りません。YahooやGoogleからのキーワード検索で表示されたページをクリックするケースが多くなっています。このサイトの様な、ハウ・ツーを記述したページは、キーワード検索であるいは関心のあるページを直接開くことが普通です。
このサイトを訪れる方々がどのページに関心をよせているか、どのページが役立っているのかを知るために、PHPとMySQLを使用したページカウンターを作成することにしました。
カウンターの仕様を考える
1.各ページごとにページカウンターを置き、このサイトに最初に訪れた場合のみ、ページカウンターを1上げる。
2.indexページには、indexのページカウンター表示と、このサイトに訪れた検索数(各ページの合計)を表示させる。
3.カウンターの表示は、今日の検索数と累計の検索数の両方を表示させる。
4.このサイトを訪れた人が、異なるページを開けたとき、あるいは、同じページを更新させたときにページカウンターが上がらないように、セッション(session)機能を使う。
(注:クライアントがcookieの機能を無効にしている場合、session機能は働かない。このカウンターの正確性は保障できないが、大体のカウント数は把握できる。
カウンターの設計概要
1.カウンターを取り付けるモデルサイトは、index.html、content01.html、content02.htmlの3ページで構成されている。
index.htmlのページには、ページカウンターcounter_index.phpと各ページの合計数を表示するcounter_total.phpをインクルードさせる。
content01.htmlのページにはカウンターcounter_01.php、content02.htmlのページには、counter_02.phpをそれぞれインクルードさせる。
2.カウンターは、ページの今日の検索数と累計を表示させる必要があるので、MySQLに①ページ名、②カウントした年月日、③カウントした日のカウント数、④累計のカウント数のデータが蓄積されることが必要である。
MySQLのユーザ rootのパスワード、etchのパスワード・権限、および sampledbデータベースは、前のページ「LAMPの動作確認」で設定している。 conterテーブルは、 sampledbデーターベースに作成する。テーブル counterの作成は、phpMyadminのGUIを使用して設定することができるが、phpMyadminをインストールされていない場合もあるので、mysqlコマンドを使用してテーブルを作成する。mysqlプロンプトでの表現が、説明もやり易い。
1.rootユーザでMySQLのsampledbデータベースにログインする。
2.counterテーブルを作成する。フィールドは、①pagename(キー)、②day(年月日)、③today('day'の日のカウント数)、④total(カウント累計)とする。
3.counterテーブルが作成されたことを確認する。 couterテーブルの構造が指定した通りか確認する。
4.ここからは、etchユーザでsampledbデータベースにログインし初期設定をおこなう。etchユーザには、前頁でSELECT、INSERT、UPDATE、DELETE権限を与えている。
5.couterテーブルに、ページごとのカウント数を集計するために、index、content01、content02の3行を挿入する。
この名称は、ホームページの index.html、content01.html、content02.htmlの名前と整合性をとっている。
6.列 day、today、totalのフィールドに初期値を挿入する。
dayは今日の年月日、todayは 0、totalは 0、とする。
初期設定された counterテーブルを表示して確認する。
7.phpMyadminでも、初期設定された counterテーブルを確認する。
Windowsのメモ帳のUTF-8保存
このサーバは、文字化け対策として、PHP5、MySQL5も文字形式UTF-8を使用する設定にしている。
Windowsのメモ帳でphpスクリプト作成し、UTF-8で保存した時に、前頁のsampledb.phpは正常に機能したが、session機能を使用したcounter_index.php正常に機能しなかった。
メモ帳のUTF-8は、BOM付きのUTF-8で、UTF-8であることを表すBOMが付けられる。下図で実際に見ると、<?phpのスクリプティングデリミタの前に <U+FEFF>タグが入っているのが分かる。
phpスクリプトの先頭に入る<U+FEFF>タグが、phpに記述する関数に悪影響を与えて、正常に機能しない場合が生じる。したがって、phpスクリプトをUTF-8で保存する場合は、BOMが付かないUTF-8Nで保存する必要がある。
UTF-8とUTF-8Nについて学術的な説明は、Wikipediaの「Unicode」に記述されているので参考にしてほしい。
エディタTeraPadでUTF-8N保存
PHPスクリプトをUTF-8形式で作成する場合は、TerPadで作成し、保存する時にUTF-8Nを選択して保存する。DreamweaverでUTF-8で保存する時は、「BOM を含める」のチェックをはずして保存する。
TeraPadでUTF-8Nで保存する方法は、「ファイル」→「文字/改行コード指定保存」をクリックすると、下図のダイアログが表示される。
文字コードで「UTF-8N」を選択し、改行コードは「LF」を選択して保存する。
MySQLのデータベースに接続するPHPスクリプト
このスクリプトは、カウンターのスクリプトに含めて記述しても良いが、データベースに接続する部分だけ分離して独立したスクリプトにしておけば、①スクリプトごとに記述する必要がない。②このスクリプトにはパスワードが含まれているので、Webで見れない安全な場所に置くことができる。
sampledb_con.php(sample_dbに接続するスクリプト)
/home/etch/include_php/ディレクトリを作成し、sampledb_con.phpファイルを置く。
/home/etch/include_php/ディレクトリ下のファイルが、php.iniに読み込まれるように、php.iniファイルの「; Paths and Directories ;」のゾーンに、
include_path = ".:/home/etch/include_php"
を書き加える。
この変更を有効にするために、Apache2をrestartする。
ページカウンターのPHPスクリプト
index.htmlページのカウンター(counter_index.php)
content01.htmlページのカウンター(counter_01.php)
content02.htmlページのカウンター(counter_02.php)
サイト全体の検索数を表示するPHPスクリプト
サイト全体の検索数を表示(counter_total.php)
index.htmlにcounter_index.phpとcounter_total.phpを組み込むには、<ifram>タグを使用していたが、XHTML1.1で廃止され、その代替とし<object>タグを推奨されている。
ブラウザIE6の対応は、iframには対応しているが objectには完全に対応していないのが現状であった。
今回は、objectタグを使用した。objectタグの記述方法は、下記の通りである。ブラウザIE6の場合、counter_index.php等組み込んだ部分にスクロールが表示されるので、組み込むcounter_index.phpのbodyタグに<body scllol=no>と記述する必要がある。
index.htmlの記述内容
content01.html.htmlの記述内容
content02.htmlの記述内容
/var/www/ディレクトリに、index.html、content01.html、content02.html、counter_index.html、counter_total.php、counter_01.php、counter_02.phpをWinSCPでコピー転送する。
1.index.htmlを最初に開く。
パージの検索数は 1、サイトの検索数は 1 を表示する。
2.content01.htmlを最初に開く。パージの検索数は 1 を表示する。
3.content02.htmlを最初に開く。パージの検索数は 1 を表示する。
4.index.htmlを再度に開く。
パージの検索数は 1、サイトの検索数は 3 を表示する。
sessionの機能が正常に働いている。
5.phpMyadminにログインして、counterテーブルを表示させる。サイト全体のカウンタの状態を見ることができる。
6.翌日になってindex.htmlを開く。
パージの検索数は今日 1、累計 2、 サイトの検索数は今日 1、累計 4 を表示する。
今日のカウント数が正しく表示された。
6.phpMyadminにログインして、counterテーブルを表示させる。
列 dayの年月日が正常に表示されていた。
セッション機能を使用したカウンターなので、クライアントのcookiが有効でないとセッション機能が働かない欠点はある。大体のカウント数を表示させる目的であれば、充分実用に耐えるカウンターである。