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に①ページ名、②カウントした年月日、③カウントした日のカウント数、④累計のカウント数のデータが蓄積されることが必要である。


TOPへ

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テーブルを確認する。


TOPへ

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」を選択して保存する。


TOPへ

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)


TOPへ

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でコピー転送する。


TOPへ

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が有効でないとセッション機能が働かない欠点はある。大体のカウント数を表示させる目的であれば、充分実用に耐えるカウンターである。

TOPへ