■実験室

■プロフィール

Sligh'Hand

Author:Sligh'Hand

所属ギルド
Open Travelers
称号
ぐったりたぬぬ
特徴
公園内でマジシャンを目指す新米教師。桜の下で「たぬき寝入り」するのがマイブーム。

■最近の記事
■最近のコメント
■ブログ内検索

■リンク
■RSSリンク
■カテゴリー
■月別アーカイブ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | --:--:--

ぐったりたぬぬp(ry

 こんばんは、スラです。

 いよいよ実装ですよ、実装。 てきとーな処理の流れを組んじゃったので、落とし穴にはまりそうですけどw

 それでは、さっそくいってみましょー。





MySQL データベースの構築

 まずは、必要なデータベースの構築から。 MySQL を起動して、データベース (ここでは、counter という名前にしましょうb) を作成。

mysql> CREATE DATABASE counter;
mysql> USE counter;

 で、次はテーブルの作成。 ↓のスクリプトを実行すれば OK。

# mysql を使ったカウンタシステム
#
# データベース構築スクリプト
#
# 2009.6.16 written by すら

# カウンタ値保存用テーブルの作成と初期値の設定
CREATE TABLE count (value INT);
INSERT INTO count values(0);

# 直近のアクセス状況を保存するテーブルの作成
CREATE TABLE recentAccess (
    addr INT NOT NULL PRIMARY KEY,
    accessTime DATETIME NOT NULL
);

# アクセス履歴を保存するテーブルの作成
CREATE TABLE accessHistory (
    addr       INT      NOT NULL,
    accessTime DATETIME NOT NULL,
    count      INT      NOT NULL,
    url        VARCHAR(1024)
);

 続いて、ストアドプロシージャの作成。 これも↓のスクリプトを実行すればおk。

# mysql を使ったカウンターシステム
#
# とりあえず作ってみたストアドプロシージャ
#
# 2009.06.16 written by すら

delimiter //

# ストアドプロシージャの定義
CREATE PROCEDURE countAndGetValue (IN pTtl  INT,
                                  IN pAddr INT, 
                                  IN pUrl     VARCHAR(1024),
                                  OUT rCounterValue INT)
BEGIN
    DECLARE curTime  DATETIME;
    DECLARE lastTime DATETIME;

    # 現在時刻を取得
    SET curTime = NOW();
    # 前回アクセス時刻を取得
    SELECT accessTime FROM recentAccess WHERE addr=pAddr INTO lastTime;

    # アクセス履歴が記録されていないとき
    IF (lastTime IS NULL) THEN
        # カウンタ値を増やして直近のアクセス履歴に記録
        UPDATE count SET value=value+1;
        INSERT INTO recentAccess VALUES (pAddr, curTime);

    # 古いアクセス履歴は記録されていたとき
    ELSEIF (DATE_ADD(lastTime, INTERVAL pTtl SECOND) < NOW()) THEN
        # カウンタ値を増やして直近のアクセス履歴を更新
        UPDATE count SET value=value+1;
        UPDATE recentAccess SET accessTime=curTime WHERE addr=pAddr;

    # 最近のアクセス履歴が記録されていたとき
    ELSE
        # カウンタ値を増やさずに、直近のアクセス履歴を更新
        UPDATE recentAccess SET accessTime=curTime WHERE addr=pAddr;

    END IF;


    # カウンタの値を返す (ための準備をする)
    SELECT value FROM count INTO rCounterValue;

    # アクセス解析用の履歴を記録する
    INSERT INTO accessHistory VALUES (pAddr, curTime, rCounterValue, pUrl);

END
//

delimiter ;

 あとは、↑のストアドプロシージャを実行する権限を持ったデータベースユーザーを作ってあげればおk。 ここではユーザー名を user、パスワードを password とでもしておきましょうか。

mysql> GRANT EXECUTE ON counter.*
 -> TO 'user'@'%' IDENTIFIED BY 'password';

 これで MySQL 側の準備は完了ですb

PHP の実装

 次に PHP。 前回考えた処理の流れにのっとって実際のプログラムを書くと……↓こんな感じ。

<?php
// mysql を使ったカウンタシステム
//
// PHP スクリプト
//
// 2009.6.16 written by すら

// IP アドレスとアクセスのあったページを取得
$ipAddr = getenv("REMOTE_ADDR");  // IPアドレス取得
$ipLong = ip2long($ipAddr);       // IPアドレスを数値に変換

$url = #_SERVER["HTTP_REFERER"];  // アクセスページ取得

// 接続のための情報を設定
$server = 'example.com';
$db = 'counter';
$user  = 'user';
$passwd = 'password';

// MySQLへ接続
$pdo = new PDO("mysql:host=$server;dbname=$db", $user, $passwd);

// MySQL へ質問を丸投げ
$statement = $pdo->prepare('CALL countAndGetValue(?, ?, ?, @val)');
$statement->bindValue(1, 3600*6, PDO::PARAM_INT);
$statement->bindValue(2, $ipLong, PDO::PARAM_INT);
$statement->bindValue(3, $url, PDO::PARAM_STR);
$statement->execute();

// MySQL からの返答を受け取る
$counterValue = $pdo->query('SELECT @val')->fetchColumn();

// Flash 向けにデータを出力
header('Content-Type: text/plain');
echo 'counterValue='.$counterValue;
?>

 MySQL へ接続するための情報 ($db、$user、$passwd) には、MySQL で設定した情報を設定します。 $server には、MySQL がインストールしてあるサーバ名を指定。

 ちなみに、MySQL へ質問を丸投げしてる箇所の 2 行目、3600*6 ってなってるのは、3600 秒 × 6 ってこと。 6 時間以内に同一の IP アドレスからアクセスがあった場合には、カウンタの値を増やしませんよb という意味。 この値を変更すれば、カウンタの値を増やさない期間を長くしたり、短くしたりできますb

 っと、長くなりましたが、これで PHP も MySQL も一応完成。 つまり、カウンタ本体の完成ですb

ね、簡単でsh(撲殺!

ぐったり……

 ちなみに、万一このソースコードを使う場合には、くれぐれも自己責任でb あと、間違いがあったり、こんな使えねぇソース書いちゃだめでしょっ! ってのがあったら、ぜひぜひ教えてください><;


 PHP スクリプトなどで counter としなければいけないところが sampleCount になっていました。 すべて counter に修正しました>< (2009.6.17 21:07)

テーマ:プログラミング - ジャンル:コンピュータ

幻と現の間で | 02:48:33 | Trackback(0) | Comments(0)
コメントの投稿

管理者にだけ表示を許可する

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。