dポイントプレゼントキャンペーン実施中!

いつもありがとうございます。

例えばですが、7月1日~7月31日までに
データベースを更新した回数を求めて、制限するにはどうしたらよろしいでしょうか?
ようするに会員制のページに更新回数を制限したいと思っています。

データベースへのアクセス回数は、なにかの変数に+=1で足して
行こうと思っています。

例えば、それが10になったときに、更新ボタンが押せないように
するにはifなどで処理制御していきたいと思います。

わからないところは、1日~月末まで数えるということです。
よく、アクセスカウンターとかは月ごとにローテーションを組んで
いますよね。
あんな感じで、毎月1日にリセットできるような感じです。

とても難しいと思いますが、どなたかお分かりになりましたら
お願い致します。

A 回答 (3件)

こんにちは。


質問者様の環境がわからないので、PHPでできる範囲の案となりますが、
考え方を記載します。

会員制ということなので、毎月会員ごとの更新ログファイルを作成します。
イメージとしては、
userName.0807.log (会員ID.YYMM.log)
※中身は数字でよくあるアクセスカウンターのようにします。

先にこのファイルを読込み、数値が10未満であれば更新を許し、
更新のたびに、このログファイルに記載する数値を+1します。
10になったときに if文での更新制御を行います。

ファイルが月ごとの生成になるので、管理も容易になるのではないでしょうか?


サンプルソースです。

<?php

setlocale(LC_TIME, "ja");

$date = strftime("$Y$m");

// カウンタファイル
$cnt_file = "userName.".$date. "dat";
// userNameは会員IDを想定しています。DBから値を引っ張ってきてファイルを作ります。

// カウンタ桁数
$cnt_len = 10;

// カウンタファイルが存在すればカウンタ値を読み取る
if (file_exists($cnt_file)) {

$file = fopen($cnt_file, "r+");
$count = fgets($file, $cnt_len);
$count = $count + 1;
}
// カウンタファイルが存在しないなら新規作成する
else {
$file = fopen($cnt_file, "w");
$count = 1;

}


//更新の制御
if ($count < 10) {
echo "更新を許可";
} else {
echo "更新させない";
}


// ファイルポインタを先頭にセットする
rewind($file);

// ファイルをロックする
flock($file, LOCK_EX);

if ($count < 11) {
// カウンタ値を書き込む
fputs($file, $count, $cnt_len);
}


// ファイルのロックを解除する
flock($file, LOCK_UN);

// ファイルを閉じる
fclose($file);


?>


この方法だと、ファイルがユーザー+月ごとに作成されるので、会員数の規模によってはファイルが膨大な量になってしまうかもしれません。

cron等が使えるのであれば、前の月のファイルを削除するプログラムを作成し、毎月1日に自動削除を行ったりするのも良いと思います。
    • good
    • 0

データベースがあるという前提ですが、更新ログテーブル、もしくは、更新カウントテーブルを作成してはいかがでしょうか?



■更新ログテーブルの場合
カラム案:ID,UPDATE_DATE
ユーザーが更新を行う度に1レコードをインサート。
データは増えますが、その分、拡張性が高くなるのではと。
(最終更新日時が取得できる…等。余計ですかねw)

カウント方法はSQLで以下の通りです。
-- select count(*) from 更新ログテーブル
-- where ID='hoge' and to_char(UPDATE_DATE,'mm') = to_char(sysdate,'mm');

■更新カウントテーブルの場合
カラム案:ID,UPDATE_COUNT

※ ANo.1(SeafooD3様)の案のDB版ですので割愛させていただきます。

この回答への補足

ありがとうございます!
とても参考になりました。
データベースの種類を書いておりませんでした、すみません
mysqlを使用していますが、知識はほとんどありません。
データの出し入れだけに使っているくらいです。

ちょっと調べたらto_char()はmysqlにはなくて
DATE_FORMAT()を使うみたいですね。
where ID='hoge' and DATE_FORMAT(UPDATE_DATE,'%m%m') = to_char(sysdate,'mm');
こんな感じで間違いないでしょうか?
ちょっと難しいのでもう少し勉強してみます。
ありがとうございました。

補足日時:2008/07/07 15:42
    • good
    • 0

前の質問の続きと言うか 返事に書いてあったことについてです



mktime()で求められる値はタイムスタンプなので
日付の計算を行う時も単純に+1(日)とかではダメです

+1日したいときは +86400(60*60*24)
=60秒×60分×24時間 で1日 ということになります
今回の質問とは関係ないかもですが 前回の質問の補足として。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!