質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

4322閲覧

PHPで、同IPアドレスからのアクセスの場合前回の処理から24時間経つまで処理しないようにしたい。

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

1クリップ

投稿2015/01/11 10:34

PHPはじめたばかりの者です。初めて質問させていただきます。

PHPで、同IPアドレスからのアクセスの場合前回の処理完了から24時間経つまで処理しないようにしたいです。
正確には test.php の form で action="test2.php" とし、
同IPでの前回の接続から

・24時間以上継続していた場合 test2.php の処理を続行
(この後にもいくつかチェックがあり、すべて通過した場合のみ「処理が完了した」とみなす。
完了できなかった場合、24時間以内でも再度 test2.php へのアクセス、処理を許可する。)

・24時間未満の場合は echo 等を使ってその旨を伝えるテキストを表示したい。

IPアドレスごとにファイルを作成しIP、時間を記録、次回アクセス時に読み込み判断するようにすればいいと聞いたことがあるのですが、どうすればよいかよくわかりません。

初歩的なことなのかもしれませんが、回答いただけるとうれしいです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ファイルで管理ということなら以下の様な感じでもいいのかなと思います。

どのようなシステムを考えられているのかわからないのでなんとも言えないですが、、ファイル管理してしまうと、同IPからだとオフィス等で全員アクセスできなくなることも考えられるので、やめておいたほうがいいのかなと思います。
cookie管理がいいと思います。

あと、IPで判定だと、これもあまりないかとは思いますが24時間後と再アクセスまでの時間が長いので動的IPやモバイルだとfalseになることも考えられます。メールアドレスや会員のユニークな情報を入力させることで判定したほうがいいような気もします。

lang

1<? 2$now = new DateTime(); 3$fileName = '/home/advance-studio.itokoishi.com/public_html/test/' . $_SERVER["REMOTE_ADDR"]; 4$flag = 0; 5 // ファイルの存在確認 6 if( !file_exists($fileName) ){ 7 // ファイル作成 8 file_put_contents($fileName, $now->format('Y-m-d H:i:s')); 9 $flag = 1; 10 } 11$registDate = new DateTime(file_get_contents ($fileName)); 12 13$dateDiff = $now->diff($registDate); 14 15 16if((int)$dateDiff->format('%d') < 1 && $flag !== 1){ 17 echo '24時間経過していません'; 18}else{ 19 echo '24時間経過しました'; 20 $flag = 0; 21} 22 23?>

投稿2015/01/12 03:11

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2015/01/12 12:32

回答ありがとうございます。どんなシステムを作りたいか明記してありませんでしたね。 24時間おきにデジタルコンテンツをプレゼントする というシステムを作りたかったのです。 一応ユニークな情報を入れるようにしてあるのですが(プレゼントに必要)無料でいくつも作成可能なので、IPと組み合わせ、どちらもPASSしないといけないようにすればプレゼントを不正取得されにくくなると考えました。 サイト運営は自分1人のみですべてのファイルは自宅鯖で管理しており、アクセスできなくなることは大して問題ありません。 教えていただいたファイルで管理する方法を試し、少し様子を見てみます。 不正取得されてそうだったらまた解決策を考えます。(会員制とか)
退会済みユーザー

退会済みユーザー

2015/01/12 13:28

自分の書き方が悪かったかもしれないですが、IPはユーザーの話です。 PCであればプロバイダが割り振っており、あるスパンでIPが変わります。 モバイルも動的なので変わります。 なので、ユーザーが固定のIPを使用していない限り、IPが変わってしまいプレゼントを受け取ることができない可能性も出てきます。モバイルは特にです。 あと、会社の話は、IPはルーター単位で付与されますので、同じルーターを使用しているユーザーが複数いた場合一人はプレゼントを受け取れるけど、その他の人は受け取れなくなる可能性も出てくるということが言いたかったのです。 要は、不正利用は防げるようになるかもしれませんが、正規で受け取れるはずの人が受け取れなくなる可能性が出てきます。 あくまで自分だったらですが、会員登録か、もしくは個別のプレゼントURL付きのメールを送り、GETのパラメータ、もしくはURLセグメントの一部分をユニークなID等と比較してアクセスさせる方法でやると思います。 色々と大変かもしれませんが、試行錯誤で頑張ってください。
退会済みユーザー

退会済みユーザー

2015/01/13 10:55

教えていただいたものを試してテストしてみましたが、どうやらファイルが生成されず、 「24時間経過していません」しか表示されないようです。
退会済みユーザー

退会済みユーザー

2015/01/13 11:31

あ、ごめんなさい。 if($dateDiff->format('%d') < 1) でした。上のも書き直します ファイル生成はファイルが作られるフォルダのパーミッションを777にしてください。
退会済みユーザー

退会済みユーザー

2015/01/14 09:19

何度もすみません、ちゃんとファイルは作成され、24時間経てば「24時間経過しました」が表示されるのですが、初回(ファイルがないIPでアクセスしたとき)も「24時間経過していません」ではなく「24時間経過しました」側の処理を実行したいです。少し調べてみましたがよくわからなかったです。もっとしっかり勉強してから作ればよかったと後悔しています、、、
退会済みユーザー

退会済みユーザー

2015/01/14 11:47

今までのコードをそのまま流用するのであればflagを立ててやればいいと思います。 上記コード書き換えてあります。 そうですね、慣れてない時はユーザーの動きとプログラムの流れを図にして書き出すといいかもしれません。自分の場合は大きなサイトになるとHTMLでハリボテのデザインを作成してユーザーが使うことを想定しながら作成しています。 あと、データの取扱いも出来る限りER図や表で作成しています。 慣れてしまえば簡単なスクリプトであればノリでできるようになると思います。
退会済みユーザー

退会済みユーザー

2015/01/14 12:12

あと、使用の用途から ①24時間たったら処理をする→②次の24時間後まで処理をしない→①→②→①→繰り返し ということであれば、 1回目の処理が完了したらfile_put_contents($fileName, $now->format('Y-m-d H:i:s')); を記述すれば大丈夫です。 ... }else{ echo '24時間経過しました'; $flag = 0; file_put_contents($fileName, $now->format('Y-m-d H:i:s')); ...
退会済みユーザー

退会済みユーザー

2015/01/14 13:25

何度もありがとうございます。なるほどflag使えばよかったんですね。 現在公開テスト中ですが、うまくいってそうです。 確かに、慣れないうちは図を描くとわかりやすいですね!ほかのページでも図を描いてみて無駄な処理等がないか確認してみます。
guest

0

お邪魔します。

cookieを使いましょう。cookieはクライアント毎にブラウザが管理・保存している情報です。
最終アクセス時刻をcookieに保存し、それを確認することで簡単に実装できます。

クッキーをページを表示したクライアントに保存するには

lang

1<?php 2 setcookie("last_access", time() + (60*60*24)); 3?>

cookieの内容を確認するには

lang

1<?php 2 if (isset($_COOKIE["last_access"])){ 3 $last_access = $_COOKIE["last_access"]; 4 } 5?>

のようにします。

また、cookieには有効期限というものがあるので、クライアント側で保持される期間を指定することができます。
これを使って、

lang

1<?php 2 if (!isset($_COOKIE["last_access"])){ 3 //初回表示時か24時間経過後 4 //setcookieの第三引数に有効期限を指定 5 setcookie("last_access", 1, time() + (60*60*24)); 6 //初回か24時間経過後の処理 7 ......... 8 } else { 9 //24時間以内の場合の処理 10 ......... 11 } 12?>

とすれば、last_accessという名前のcookieの存在確認をするだけでもご要望の処理は実現できます。

参考リンク:クッキーの利用

参考になれば幸いです。

投稿2015/01/11 16:25

ShinpeiYamamoto

総合スコア540

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問