

いつもありがとうございます。
例えばですが、7月1日~7月31日までに
データベースを更新した回数を求めて、制限するにはどうしたらよろしいでしょうか?
ようするに会員制のページに更新回数を制限したいと思っています。
データベースへのアクセス回数は、なにかの変数に+=1で足して
行こうと思っています。
例えば、それが10になったときに、更新ボタンが押せないように
するにはifなどで処理制御していきたいと思います。
わからないところは、1日~月末まで数えるということです。
よく、アクセスカウンターとかは月ごとにローテーションを組んで
いますよね。
あんな感じで、毎月1日にリセットできるような感じです。
とても難しいと思いますが、どなたかお分かりになりましたら
お願い致します。
No.1ベストアンサー
- 回答日時:
こんにちは。
質問者様の環境がわからないので、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日に自動削除を行ったりするのも良いと思います。
No.3
- 回答日時:
データベースがあるという前提ですが、更新ログテーブル、もしくは、更新カウントテーブルを作成してはいかがでしょうか?
■更新ログテーブルの場合
カラム案: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');
こんな感じで間違いないでしょうか?
ちょっと難しいのでもう少し勉強してみます。
ありがとうございました。
No.2
- 回答日時:
前の質問の続きと言うか 返事に書いてあったことについてです
mktime()で求められる値はタイムスタンプなので
日付の計算を行う時も単純に+1(日)とかではダメです
+1日したいときは +86400(60*60*24)
=60秒×60分×24時間 で1日 ということになります
今回の質問とは関係ないかもですが 前回の質問の補足として。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/01/10 09:15
- Excel(エクセル) エクセルの数式で教えてください。 2 2023/04/13 10:55
- 雇用保険 契約期間終了で退職した場合の失業手当の手続きや必要書類について教えてください。 2 2022/05/15 00:42
- Excel(エクセル) エクセルの数式で教えてください。 3 2022/12/22 17:29
- Excel(エクセル) Excelの関数で可能でしょうか、日付や式の値の自動更新 4 2023/05/19 17:17
- 国民年金・基礎年金 障害年金(精神)の更新について質問があります。 文章で上手く伝えられるか不安ですが、経験者又は知識が 3 2023/03/17 21:40
- Excel(エクセル) 当番表の作成 2 2022/06/15 07:40
- 労働相談 ① ・契約社員。業務委託で勤務。 ・時給1180円。毎年1-20円程のベースアップあり。 ・週5の7 1 2022/04/08 21:41
- 労働相談 有給の計算について 3 2023/05/20 13:11
- その他(暮らし・生活・行事) コロナウイルス対策としての行動制限が撤廃され、今、年始休の最中にいます。 一方、コロナウイルス新規感 1 2023/01/02 18:03
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
【Excel VBA】取り込んだファイ...
-
VB2008 iniファイルの全セクシ...
-
0バイトのテキストファイル
-
ファイル内容を比較する方法
-
月々の更新回数を調べるには?
-
includeで別サイトを読み込む
-
タスクバーのアイコンについて
-
JSPの代わりにHTMLじゃだめですか?
-
[再投稿]C++によるファイル送受...
-
ニコニコ動画のクッキーの扱い...
-
VSSでチェックアウトの取消をし...
-
HTMLまたはJavaScriptでフ...
-
HTMLテキストリンクでExcelファ...
-
Eclipseで検索ができなくなった
-
GetOpenFileName()について
-
エクセルが裏で動いたままなん...
-
CSVファイルの時刻の形式について
-
accessでクエリをExcelにエクス...
-
テキストファイル固定長データ...
-
ATTファイルってどうやって開け...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
0バイトのテキストファイル
-
Eclipseで検索ができなくなった
-
【Excel VBA】取り込んだファイ...
-
C++.NET 2003 「空のドキュメ...
-
HTMLまたはJavaScriptでフ...
-
VBAで、JPG写真の撮影日時を読...
-
main関数のコマンドライン引数...
-
HTMLテキストリンクでExcelファ...
-
ファイル作成日時と更新日時を...
-
リソースファイルを認識してく...
-
Javaのファイルダウンロードに...
-
2GB以上のファイルを扱う方法
-
C#について質問【複数の.datフ...
-
ディレクトリのサイズの取得
-
PHPからベーシック認証のかかっ...
-
<input type="file" で初期値...
-
VB2008 iniファイルの全セクシ...
-
教えて下さい。
-
サイトマップにサブドメインを...
-
vbaの構文の修正相談(xmlファ...
おすすめ情報