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

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

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

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

Q&A

解決済

3回答

815閲覧

セッションやcookie使わないカウント処理の実装について

64orenji

総合スコア12

PHP

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

0グッド

0クリップ

投稿2018/03/30 01:19

編集2018/03/30 02:16

初めまして、初心者でありますが題名の通り悩んでいます。

前提・実現したいこと

セッションやcookie使わないカウント処理の実装について

https://teratail.com/questions/14300
こちらの内容のまま、PHPのみでセッションやcookieをつかわない方向で何とかなりませんでしょうか?

セッション使わない理由として2点ほどあります。

1.ページ移動もしくは更新してしまった場合、カウントされてしまう
2.また画面を更新するとカウント値の初期化も行いたいです。(ページ移動のみ初期化は行わない)

という理由になります。

■追記
以上の2点の理由が解決できるのであれば、セッション使用でも問題ないです。
こちらの考えとしてあくまでも2つの理由からセッション未使用でいけるのではと考えておりました。

該当のソースコード

PHP

1count.php 2 3<?php 4 5 if (!isset($_SESSION["number"])) { 6 $Count = 1; 7 } 8 if (isset($_POST["add"])) { 9 $Count++; 10 header('Location:count.php', true, 303); 11 } else if (isset($_POST["reset"])) { 12 $Count = 1; 13 } 14 echo $Count; 15?> 16 17<form method="POST" action=""> 18 <input type="submit" name="add" value="+する"> 19</form> 20<form method="POST" action=""> 21 <input type="submit" name="reset" value="リセット"> 22</form>

試したこと

2重送信防止としてheaderを入れてみましたがこの場合、カウントが1回だけしかできないです

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

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

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

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

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

guest

回答3

0

ベストアンサー

1.ページ移動もしくは更新してしまった場合、カウントされてしまう

2.また画面を更新するとカウント値の初期化も行いたいです。(ページ移動のみ初期化は行わない)

セッションや cookie を使わないカウント方法を考えても、結局、これらの条件を除外/対応するスクリプトを作成することになります。
(local storage 使うか、GET のパラメータとして保持ぐらいしか無いんじゃないかなぁ。。。)

ページ移動を検出する→リファラを見る
画面更新→仕様不明

なので、その辺りを整理すればよいかと

投稿2018/03/30 01:31

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

64orenji

2018/03/30 01:47

回答ありがとうございます! ページ移動検出の「リファラ」をキーワードに検索してコーディングしてみます。 もう一つのほうですが、画面更新はF5更新のことなのでheaderで二重送信はできないようになりましたが、F5更新した際のカウント値の初期化についてどのようにすればよいのか検討もつかないです。 何かキーワードだけでも頂ければこちらで調べたりすることができるのでぜひともお願いします。
退会済みユーザー

退会済みユーザー

2018/03/30 02:19

CSRF のワンタイム token の応用でイケる気がします。
guest

0

GETなら近い形は可能かなと思います。
※画面遷移で値は維持できませんけど。維持しようと思ったらやはりセッションが・・・

PHP

1<?php 2$count = 0; 3if(array_key_exists("count",$_GET) && ctype_digit($_GET["count"])){ 4 $count = $_GET["count"]+1; 5} 6echo $count; 7?> 8<form method="GET" action=""> 9<input type="submit" name="add" value="+する"> 10<input type="hidden" name="count" value="<?=($count)?>"> 11</form> 12<form method="GET" action=""> 13 <input type="submit" name="reset" value="リセット"> 14</form>

もちろんクエリストリングの値は手動で任意でかえれるのでこれで完璧とは言えません。
GETなのでF5更新ボタンとかでもひとまず勝手にカウントアップはされません。

PHPのみでPOSTで二重送信防止まで込みとするといずれにしてもセッションを利用することになります。

投稿2018/03/30 01:54

編集2018/03/30 01:56
m.ts10806

総合スコア80850

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

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

64orenji

2018/03/30 02:06

コード入力ありがとうございます。 二重送信防止 画面遷移で値は維持できない→F5更新で値の初期化 さえできれば・・・ やはり、セッション使用で条件付けしかないのでしょうか。
m.ts10806

2018/03/30 02:17

一応このコードで二重送信防止はされてます。 F5更新で値の初期化 部分については基本的に「F5更新された」「閉じられた」などを切り分けることは難しいので、 それっぽいことはjavascriptでできるかもしれませんが(”beforeunload”で検索)、PHPのみは無理です。PHPはサーバー側で動作しているものですが、画面更新はクライアント側の操作だからです。
64orenji

2018/03/30 02:22

コメントありがとうございます。 javascriptでなら解決できるということでしょうか? javascriptの場合、ブラウザの設定でOFFにすると使えなくなるということなので避けておりましたが・・・ どんな状況であっても使えるようにしておきたかったのですが避けられないのですね
m.ts10806

2018/03/30 02:32

>ブラウザの設定でOFFにすると使えなくなる まあ確かにそれはそうなんですが、きょうびjavascriptを意図的にOFFすることってそうあるものではないですし、HTMLもブラウザの開発ツールなどから改ざん可能なので、javascriptのOFFだけが課題ではありません。 te2jiさんが提示されているやり方も javascript、session どちらかは利用するやり方ですしね。 まずはどのようなプログラム(というよりシステム)を組もうとしているのか その辺りの仕様次第ではないでしょうか。 スポットだけだと回答者には全体像や大目的が見えづらく、 中々質問者さんが欲しいところまでたどり着けない可能性が高いです。
64orenji

2018/03/30 02:47

>>ブラウザの設定でOFFにすると使えなくなる まあ確かにそれはそうなんですが、きょうびjavascriptを意図的にOFFすることってそうあるものではないですし、HTMLもブラウザの開発ツールなどから改ざん可能なので、javascriptのOFFだけが課題ではありません ほかにも問題あるのですか・・ >まずはどのようなプログラム(というよりシステム)を組もうとしているのか その辺りの仕様次第ではないでしょうか。 簡単にいうと【スケジュールカレンダー】の月移動処理でしょうか。 先月もしくは来月ボタンを押したら1月分だけ移動するという形です。 カウント(1~12まで)組み込んで行うつもりでした。
m.ts10806

2018/03/30 03:01

date関数やDateTimeクラスを使った方が良いかと。 スケジュールの月移動ですと、やはりGETの方がやりやすいのではと思います。
64orenji

2018/03/31 00:55

申し訳ありません、返信遅くなりました。 もちろん、date関数は利用しています。mtsさんが提示していただいたGETコードと組み合わせて、さらにJavaScriptにページ移動検出をやればいけそうです。
guest

0

こまかいところを端折るとこんな感じです

PHP

1<?php 2$add =filter_input(INPUT_POST,'add'); 3$reset=filter_input(INPUT_POST,'reset'); 4$count=filter_input(INPUT_POST,'count'); 5if(is_null($count) or !is_null($reset) ){ 6 $count=0; 7}elseif(!is_null($add)){ 8 $count++; 9} 10echo $count; 11?> 12 13<form method="POST"> 14<input type="submit" name="add" value="+する"> 15<input type="submit" name="reset" value="リセット"> 16<input type="hidden" name="count" value="<?php echo $count; ?>"> 17</form>

投稿2018/03/30 01:36

yambejp

総合スコア114775

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

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

64orenji

2018/03/30 01:54

コード入力ありがうございます。 ただ入力していただいて申し訳ないのですが、こちらとしましては理由の部分が目的なので思ったような挙動ではないです。 やはり条件を除外するスクリプトの入力が必須なのでしょうか。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問