PHPで複数のエントリーを阻止する方法

このQ&Aのポイント
  • PHPでエントリーフォームを作成し、同時に複数のエントリーを阻止する方法について説明します。
  • Aページを閲覧している時に、別タブでBページを閲覧した場合に、Bページにコメントを表示させる方法についても解説します。
  • $_SESSIONを使用してAページとBページの情報をやり取りすることで、エントリーの重複を防ぐことができます。
回答を見る
  • ベストアンサー

ページオープン制御方法(PHP)

ページオープン制御方法(PHP) お世話になっております。 PHPでエントリーフォームを作成しております。(初心者に毛が生えた程度の知識力です) 同時に複数のエントリーを阻止したいのが狙いです。 【質問】 Aページを閲覧(開いている状態)している時に、別タブでBページを閲覧した場合に、 Bページにコメント出す。逆も同様。 Aページを開いたときに$_SESSION["PAGE_OPEN"] = "PAGE"のように値を代入して、 Bページに$_SESSION["PAGE_OPEN"] == "PAGE"だったらコメント出すという方法などを試しているのですが、 うまくいったり、unset($_SESSION["PAGE_OPEN"] )しても値が残っていたり、調整がうまくいきません。 心掛けなければいけない点や不備・成功例など諸々とご指導頂ければ幸いです。 何卒宜しくお願い申し上げます。

  • PHP
  • 回答数2
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
noname#244856
noname#244856
回答No.2

>> 同時に複数のエントリーを阻止したいのが狙いです。 そもそもこれが目的で $_SESSION を用いるのが間違っている気がします。$_SESSION の値はユーザ側から送信されるクッキーに対応して個別に管理されていますが、ブラウザを変えるだけでクッキーは変更されるので多重エントリーは出来てしまいます。 また「同時進行を防げばエントリーの手間が増える」とお思いなのかもしれないですが、相手人間であるとも限りません。任意のプログラミング言語、たとえばPHPでも「スクレイピング」という手法でエントリーを自動化することも可能です。JavaScriptをふんだんに盛り込めばある程度阻止出来るかもしれませんが、これもSeleniumというJava製のライブラリを併用すれば突破出来てしまいます。

jipang5054
質問者

お礼

お礼が遅くなり大変すみませんでした。 セッションやクッキーの仕組みがしっかりと把握できおらず大変参考になりました。 一度はじめから整理して組み直してみます。 ありがとうございました。

その他の回答 (1)

noname#212058
noname#212058
回答No.1

『プログラムを適当に実行して、不具合を見つけるたびにその不具合だけを直すコードを付けたす』ということを繰り返していると、そういう状態に陥りがちです。状態遷移図を作って、パターンをきちんと把握して実装してください、としか言いようがありません。

jipang5054
質問者

お礼

お礼が遅くなってしまい大変済みませんでした。 付け焼刃的なプログラムはやはりダメですよね。 初めから整理して実装してみます。 ありがとうございました。

関連するQ&A

  • $_SESSIONの取りだし方、使い方PHP

    質問失礼いたします。 【1.html】から【A.php】に$_POSTされた値を、$_SESSIONにて下記の通りに格納しています。 $name = $_POST['name']; $_SESSION['name'] = $_POST['name']; $address = $_POST['address']; $_SESSION['address'] = $_POST['address']; $gender = $_POST['gender']; $_SESSION['gender'] = $_POST['gender']; そして、上記の$_POSTされた値を使って、データを検索し20件ずつ表示させて改ページを行っています。 <?php if ($page > 1) { ?> <li><a href="search2.php?page=<?php print($page - 1); ?>">前のページへ</a></li> <?php } else { ?> <li>前のページへ</li> <?php } ?> <?php if ($page < $maxPage) { ?> <li><a href="search2.php?page=<?php print($page + 1); ?>">次のページへ</a></li> <?php } else { ?> <li>次のページへ</li> <?php } ?> 違うかもしれませんが、 アドレスに  &name=○&address=○&gender=○  という風にして、次のページではアドレスにある値を使う みたいなこととは思うのですが、   &name=<?php print($name; ?> とすると、アドレスでは  &name=Array となってしまいます。 セッションに格納した検索条件を次のページにも使うようにはどのようにすればよいのでしょうか。 また、上記の次ページのアドレスに、  &name=○&address=○&gender=○  と表示しないようなやり方もあるのでしょうか?

    • ベストアンサー
    • PHP
  • 【PHP】ページの切り替えについて

    HTML で frameset を使用し、例えば、各frame で name="page1" name="page2" name="page3"などと名前をつけて page2 の名前のページを abc.php のページにリンクで変更する場合、page2 のページ内のソースで <a href="abc.php" target="page2">ページ4</a> とし、イメージ的には下記の(1)図の様な感じで、target で指定した frame のページの所だけ abc.php のページに切り替えることができますが (1)図 ┌─────┐    ┌─────┐ │  page1   │    │  page1  │ ├─────┤    ├─────┤ │  page2   │ →  │ abc.php  │ ├─────┤    ├─────┤ │  page3   │    │  page3  │ └─────┘    └─────┘ この仕組みを PHP で、例えば、xyz.php のページで <?php require("page1.php");?> <hr> <?php require("page2.php");?> <hr> <?php require("page3.php");?> require を使用し各ページを読み込み(1)図の様な感じのフレーム式にした場合、page2.php のページからリンクで、page2.php のページだけを abc.php のページに切り替える場合どうしたら良いのでしょうか? イメージ的には下記の(2)図の様な感じです。 (2)図 ┌─────┐    ┌─────┐ │ page1.php │    │ page1.php │ ├─────┤    ├─────┤ │ page2.php │ →  │ abc.php │ ├─────┤    ├─────┤ │ page3.php │    │ page3.php │ └─────┘    └─────┘ ※ 図の線の歪みは気にしないで下さい。すみません。

    • 締切済み
    • PHP
  • sessionがクリアされない

    教えてください。 BBB.phpでこのように書いていたとします。 <?php session_cache_limiter('private, must-revalidate'); session_start(); ~いろいろ処理~ unset($_SESSION['pcode']); ~いろいろ処理~ ?> <?php include(dirname(__FILE__).'/../include/header.php'); ?> </body></html> header.phpでは $_SESSION['pcode']を表示しているのですが、 前のページ(たとえばAAA.php)で$_SESSION['pcode']に値を入れていた場合 BBB.phpを表示すると その値が表示されてしまいます。 直前に unset($_SESSION['pcode']); をしているのに その前の値が表示されます。 includeはどのタイミングでなされるのでしょうか? また、 unset($_SESSION['pcode']); を有効にするにはどうすればいいのでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 【PHP】 リンクに関した質問です。

    ブログを作成しいて、【最新コメント者】と言う所には、各日記の記事に対してコメントを 付けた方の名前が最新順に記される様にしています。 例えば… 【最新コメント者】 おはよう君 こんばんわ君 ・ ・ ・ おやすみ君 …と言う様に、それで今回の質問とは、その【最新コメント者】の所の名前をクリックしたら その名前の方が付けたコメントの記事にリンクする様にするにはどうしたらよいでしょうか? よろしくお願い致します。教えて下さいませ。 ◆ 【最新コメント者】の表示させるPHPソースの所では次ぎの様にしてあります。 <?php //log.txt は、コメントのログファイルです。 //$name には、コメントを付けた方の名前です。 //$bo には、コメントを付けた所の日記記事の番号(インデックス)です。 $log = file("log.txt"); for($i=0; $i<sizeof($log); $i++){ list($bo,$name) = explode( "," , $log[$i]); print "<a href=\"#$bo\">".$name."</a><br>\n"; } ?> ◆ 各日記の記事の最初のソースの所では次ぎの様にしてあります。 <?php //$no には、日記の記事の番号(インデックス)が代入されるようにしてあります。 print "<a name=\"$no\"></a>"; ?> この仕組みだと、最初に表示されているページ内に、コメントを付けた日記の記事番号があれば 付けたコメントの日記記事にリンクされるのですが、そのページに無い日記の記事番号の場合 コメントを付けたページの所のリンクされません。 ◆ ちなみに、ページリンクに関したソースは次のような感じにしてあります。 <?php //ページは $page の変数を使ってページを出力していますので、個別ページはありません。 if ($page > 1){$tugi .= "<a href = '$PHP_SELF?page=".($page - 1)."&total=$total&page_num=$page_num'>"."<b>次の記事</b></a>"; }print"$tugi"; if ($total > 1 and $page < $page_num){$mae .= "<a href = '$PHP_SELF?page=".($page + 1)."&total=$total&page_num=$page_num'>"."<b>前の記事</b></a>"; }print"$mae"; ?>

    • 締切済み
    • PHP
  • 【PHP】 リンクに関した質問です。

    ブログを作成しいて、【最新コメント者】と言う所には、各日記の記事に対してコメントを 付けた方の名前が最新順に記される様にしています。 例えば… 【最新コメント者】 おはよう君 こんばんわ君 ・ ・ ・ おやすみ君 …と言う様に、それで今回の質問とは、その【最新コメント者】の所の名前をクリックしたら その名前の方が付けたコメントの記事にリンクする様にするにはどうしたらよいでしょうか? よろしくお願い致します。教えて下さいませ。 ◆ 【最新コメント者】の表示させるPHPソースの所では次ぎの様にしてあります。 <?php //log.txt は、コメントのログファイルです。 //$name には、コメントを付けた方の名前です。 //$bo には、コメントを付けた所の日記記事の番号(インデックス)です。 $log = file("log.txt"); for($i=0; $i<sizeof($log); $i++){ list($bo,$name) = explode( "," , $log[$i]); print "<a href=\"#$bo\">".$name."</a><br>\n"; } ?> ◆ 各日記の記事の最初のソースの所では次ぎの様にしてあります。 <?php //$no には、日記の記事の番号(インデックス)が代入されるようにしてあります。 print "<a name=\"$no\"></a>"; ?> この仕組みだと、最初に表示されているページ内に、コメントを付けた日記の記事番号があれば 付けたコメントの日記記事にリンクされるのですが、そのページに無い日記の記事番号の場合 コメントを付けたページの所のリンクされません。 ◆ ちなみに、ページリンクに関したソースは次のような感じにしてあります。 <?php if ($page > 1){$tugi .= "<a href = '$PHP_SELF?page=".($page - 1)."&total=$total&page_num=$page_num'>"."<b>次の記事</b></a>"; }print"$tugi"; if ($total > 1 and $page < $page_num){$mae .= "<a href = '$PHP_SELF?page=".($page + 1)."&total=$total&page_num=$page_num'>"."<b>前の記事</b></a>"; }print"$mae"; ?>

    • 締切済み
    • PHP
  • セッションの有効期限の設定方法とログアウト方法

    会員システムをPHPのセッション管理を使って作っているのですが、 1.セッションの有効期限の時間を変更するためにはsession_cache_expireを使うんだと思うんですが、これは全ページのsession_start()の前に書かないといけないのでしょうか? それとも、ログインするときに必ず通るPHPファイルに書いておけば大丈夫なのでしょうか? 2.会員ログアウトをする場合は、 unset($_SESSION['****']); でログインするときに入れた変数をunsetするだけで大丈夫なのでしょうか? もっと他に一般的な方法があったりするのでしょうか? どちらかだけでもお分かりの方がいれば教えていただければうれしいです。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 特定のページからのみのアクセス

    はじめまして、お世話になります。 現在PHPで制作を行っています。 早速質問したいのですが 例えば ページ1(サーバーA)「idとpassword入力画面」 ページ2(サーバーB)「ここにあるid&passwordで認証しokならページ3に進む」 ページ3(サーバーA)「ログイン成功画面」 この状況において ページ3の生のURLを直接打ち込んだでは閲覧できないようにして、ページ2経由でのみページ3を閲覧できるようにするにはどのようにすればよいでしょうか? 条件は ページ1で入力したidの値をページ3まで渡すということです。 セッションやクッキーはだめでした。 現在、ページ3ではURLが http://サーバーA/3.php?id=○○○○となっているため ○○○○の部分を変えれば他のidでログインできてしまいます。 $_GET['id']で一応、値は取れています。 初心者でどうすればいいのかさっぱりです。 どなたか教えていただけませんか?

    • ベストアンサー
    • PHP
  • 【PHP】 URLデータの取得と実行に関して。

    こんばんは。非常に悩んで困っています。 (参考図)               ┌→上フレーム(A.php)               │               │ aaa.php→bbb.php―┼→中フレーム(B.php)               │               │               └→下フレーム(C.php) もし、A.php ページ内のボタン【B】をクリックしたら、中フレームで B.php ページが表示される仕組みで その時、同時に下フレームの C.php ページで、中フレーム にはどのページが表示されているのかを URLで取得する仕組みにしたいのですが、どうやったよいのでしょうか? 具体的には、その時、B.php ページのURLデータを C.php ページ内のボタン【B】のリンクとなるURLに収納したいのです。 そして、C.php ページ内のボタン【B】を押しても、中フレームで B.php ページが表示される仕組にしたいのです。 自分なりに、セッション関数などを使い色々と試したのですが、どうもうまい事いきません。(汗) ちなみに、セッション関数でデータの受け渡しの仕組みをした場合・・・ A.php のページ内のボタン【B】をクリックしたら、中フレームで B.php ページのURLを B.php ページ内で、セッションの値を $_SESSION['burl'] = $burl; として保存し C.php ページ内のボタン【B】URL指定のところで $_SESSION['burl'] として呼び出しても、値が収納されません。(汗) 【参考】 ・ 上記の参考図の表示がずれていたら脳内変換で宜しくお願いします。 ・ ページはフレームを使用し、上フレーム・中フレーム・下フレームと縦に組んでいます。 ・ bbb.php のページは require 関数で呼び出されるページとなってます。 中途半端な知識で対応できず、苦しんでおります。 ちなみに、私は「PHP」の経験が浅いので、分かりやすく詳しく教えて頂けると非常に助かります。 もし宜しければ何方か、どうか教えて下さい。宜しくお願いします。

    • 締切済み
    • PHP
  • phpのセッションについて質問です。

    今、for文を使ってsession変数に値を入れて行く処理を作っております。そのためにセッション配列を使おうと考えておりますが、使い方が分からないので教えてください。一応、自分なりに書いてみたのですが動きませんでした。処理的には、一つ目のfor文で値をsessionの配列に一つずつ入れていき、二つ目のfor文でその格納したのを表示するようにしたいです。 <?php session_start(); for($a=1;$a<10;$a++){ $_SESSION['no'][$a]=$a; } for($b=1;$b<10;$b++){ print("こんにちわ".$SESSION['no'][$b]); } ?> ご回答のほどをよろしくお願いします。

    • ベストアンサー
    • PHP
  • [PHP]セッション破棄について

    はじめまして。 phpを始めて1週間の初心者です。 現在、ホームページでログイン処理とログアウト処理をphpのセッションを使って作成しています。 今回質問させて頂くのはログアウト処理についてです。 ログアウト処理をでセッションを破棄する際に http://oshiete1.goo.ne.jp/qa3224862.html を参考にして下記の処理を行わせています。 -------------------- logout01.php -------------------- <?php session_start(); $_SESSION = array(); if(isset($_COOKIE[session_name()])){setcookie(session_name(),'',time()-4200,'/');} session_destroy(); header("location: http://~トップページのURL~/"); ?> -------------------- 確認をしたところ、ログインしたユーザの情報は削除されているようでした。 また、http://oshiete1.goo.ne.jp/qa3224862.htmlを参考に下記のようなログアウト処理も行わせてみました。 -------------------- logout02.php -------------------- <?php session_start(); unset($_SESSION['access']); header("location: http://~トップページのURL~/"); ?> -------------------- 同じく確認したところ、ログインしたユーザ情報は削除されているようでした。 -------------------- 環境 -------------------- <サーバ> 【OS】 windows XP(テスト環境)、CentOS 5.2(公開環境) 【PHP】 5.2.6 【Apache】 2.2 <クライアント> 【OS】 windows XP 【ブラウザ】 Firefox 3.0.8 IE 7 -------------------- -------------------- 質問 -------------------- (1)logout01.phpとlogout02.phpの違いは何でしょうか。 (2)「unset($_SESSION);」は使用すると「$_SESSION」が使えなくなるとのことですが、  それはphpを再インストールしない限りは使えなくなるということでしょうか。  それとも、ブラウザを再起動すれば使えるという意味でしょうか。 (3)「unset($_SESSION);」と「unset($_SESSION['access']);」では何が違うのでしょうか。 (3)セッションを使用するとサーバ側にセッションIDを保存したファイルが保存され、  クッキーがクライアント側に保存されるとのことですが、logout01.phpとlogout02.phpを  実行した場合、サーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 (4)セッションの有効期限を指定していないため、logout01.phpとlogout02.phpを実行せずに  ブラウザを終了させた時もログインしたユーザ情報は削除されているようでしたが、  この場合もサーバ側のセッションIDを保存したファイルとクライアント側のクッキーを  保存したファイルは削除されているのでしょうか。 初歩的な質問で申し訳御座いませんがよろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう