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

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

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

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

Q&A

解決済

3回答

1138閲覧

PHPでランダム生成した文字列をセッションに格納すると値が変わる

matumo

総合スコア13

PHP

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

0グッド

1クリップ

投稿2017/12/06 16:06

編集2017/12/06 16:08

PHPでランダム生成した文字列をセッションに格納すると、後にそのセッションから取得する値が変わっています。

###ソースコード

set.php

php

1<?php 2session_start(); 3 4$_SESSION["test"] = rand_str(10); 5echo $_SESSION["test"]; 6 7function rand_str($length) { 8 $str = array_merge(range('a', 'z'), range('0', '9'), range('A', 'Z')); 9 $r_str = ""; 10 for ($i = 0; $i < $length; $i++) { 11 $r_str .= $str[rand(0, count($str) - 1)]; 12 } 13 return $r_str; 14}

get.php

php

1<?php 2session_start(); 3echo $_SESSION["test"];

###詳細
set.phpを実行した後にget.phpを実行すると、set.phpで表示された値とは異なるものが表示されてしまいます。
![イメージ説明

ただ、set.phpを実行して間を開けずにget.phpを実行した時は、同じ値が表示されました。
イメージ説明

また、rand_str(10) を "abc" や time() に置き換えたときは、問題なく同じ値が表示されました。

解決策はないでしょうか。
よろしくお願いします。

###補足情報
PHP 7.0.25

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2017/12/07 00:33

不思議な現象ですね^^;実験に使ったスクリプトをそのまま記述してもらえませんか?あと、左右に並んだブラウザの持つセッションIDが同じであるかも気になります。
KoichiSugiyama

2017/12/07 01:22

te2jiさんも書かれているように、set.phpとget.phpをどういう風に呼び出しているか、コードを開示していただくと的確なアドバイスが得られやすいと思います。守秘義務等ですべてが難しいのであれば、文章で説明するのでも構いませんので、確認した手順を記載していただけると良いと思います。
matumo

2017/12/07 06:38

今回はセッションの動作を勉強していただけですので、質問に記述したソースコード以外を使っていません。左右は同一ブラウザ、同一セッションで、同一ドメインのサイトにアクセスしています。実行はブラウザで開いて行っており、先にset.phpへアクセスし、その後get.phpへアクセスしている感じです。
guest

回答3

0

外れているかもしれませんが……

php実行しているwebサーバーはローカルですか、それとも別マシンですか?
別マシンの場合、webサーバーよりもパソコンの方の時計が進んでいて、
セッション永続時間の設定が狂っていてすぐにセッションが消えてしまう、
とかないでしょうか。
session.gc_maxlifetime や session.cookie_lifetime が異常に短いとか?
http://php.net/manual/ja/session.configuration.php#ini.session.auto-startあたりから点検してみてはいかがでしょうか。

投稿2017/12/07 04:09

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

matumo

2017/12/07 06:53

session.cookie_lifetime = 0 session.gc_maxlifetime = 1440 でした。
guest

0

試した範囲では問題ないですね

set.phpを実行して間を開けずにget.phpを実行した時は、同じ値が表示されました。

とのことですので、むしろ質問者さんの環境でも問題ないようですが
どういった場合が別の表示になるのでしょうか?
なんらかのバックグラウンドの処理(たとえばajax?)で
$_SESSION["test"]を書き換えている可能性はありませんか?

投稿2017/12/07 02:13

yambejp

総合スコア114583

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

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

matumo

2017/12/07 06:43

「間を開けずに」というのは、数msレベルで更新ボタンを押したときで、1秒も経ってしまえば異なる値になってしまいます… 説明が下手ですみません(・・;) 今回は質問に記述したコード以外を使っていないので、他の書き換えが発生しているとは考えにくいかもしれません。
guest

0

自己解決

私の環境が問題でした。

開発にChromeとFireFoxを利用しているのですが、その両方に アクセスしたサイトの利用しているWEBサーバーの種類(Apache等)を判別して表示してくれるアドオンを入れていました。

サーバーのアクセスログを見ると2回アクセスされていたので、恐らくset.phpへアクセスした後に、そのアドオンが判定のためにもう一度アクセスしてしまったのではないかと考えています…

ランダム文字を生成してセッションに入れておき、それをトークンとしてブラウザへ送り、POSTで送り返してくることによって、サイトの不正利用を減らせると考えたのですが、少し考え直す必要があるみたいですね(・・;)

私の確認ミスで余計な手間を掛けさせてしまい、本当に申し訳ないです。
回答ありがとうございました。

投稿2017/12/07 07:03

編集2017/12/07 07:06
matumo

総合スコア13

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問