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

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

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

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

Q&A

1回答

11052閲覧

セッション変数の中身が消える件

kamomedon

総合スコア11

PHP

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

0グッド

0クリップ

投稿2019/08/09 03:48

編集2019/08/09 05:00

初心者の質問でわかりにくくてすみません。
first.phpからsecond.phpへaタグで遷移してセッション変数の値を共有しているのですが、遷移元のパラメータの違いで、うまくいったりいかなかったりで困っております。
first.phpは毎回メニューからPOSTでパラメータを書き換えて表示しており、その際セッション変数もPOSTされた値で上書きしています。今回はセッション変数に関しては同じパラメータで上書きされているものとします。

first.php

<?php session_start(); $_SESSION = array(); $_SESSION['AAA'] = $_POST['AAA']; $_SESSION['BBB'] = $_POST['BBB']; $_SESSION['CCC'] = $_POST['CCC']; echo "{$_SESSION['AAA']}<br>"; echo "{$_SESSION['BBB']}<br>"; echo "{$_SESSION['CCC']}<br>"; echo session_id(); ?> <p><a href="second.php?ID=674">あいうえお</a></p>

first.phpの表示は
______________________
AA
AB
AC
dqhfp1l570jl1agjf801176n32
あいうえお
______________________

second.phpに遷移すると ↓

second.php

<?php session_start(); echo "{$_GET['ID']}<br>"; echo "{$_SESSION['AAA']}<br>"; echo "{$_SESSION['BBB']}<br>"; echo "{$_SESSION['CCC']}<br>"; echo session_id(); ?>

この状態でsecond.phpには
______________________
674
AA
AB
AC
dqhfp1l570jl1agjf801176n32
______________________
と表示されセッション変数の値が渡っています。
ここまでは問題ありません。
first.php内のメニューでPOSTでパラメータを切り替えてセッション変数を上書き。
ただし今回のケースではセッション変数に同じ値(AA,AB,AC)を上書きしました。
first.php

<?php session_start(); $_SESSION = array(); $_SESSION['AAA'] = $_POST['AAA']; $_SESSION['BBB'] = $_POST['BBB']; $_SESSION['CCC'] = $_POST['CCC']; echo "{$_SESSION['AAA']}<br>"; echo "{$_SESSION['BBB']}<br>"; echo "{$_SESSION['CCC']}<br>"; echo session_id(); ?> <p><a href="second.php?ID=1234">かきくけこ</a></p>

first.phpの表示は
______________________
AA
AB
AC
dqhfp1l570jl1agjf801176n32
かきくけこ
______________________

second.phpに遷移すると ↓

second.php

<?php session_start(); echo "{$_GET['ID']}<br>"; echo "{$_SESSION['AAA']}<br>"; echo "{$_SESSION['BBB']}<br>"; echo "{$_SESSION['CCC']}<br>"; echo session_id(); ?>

この状態で
______________________
1234

dqhfp1l570jl1agjf801176n32
______________________
となることがあり、肝心のセッション変数の中身が消えてなくなってしまいます。
毎回消えるならわかるのですが、概ねうまくゆき、一部のPOSTパラメータのときだけ消えます。
first.phpのスクリプト全体をお見せできないので、これだけでは原因の掴みようが無いかもしれませんが、
同じスクリプトで同じ値にセッション変数を書き換えてうまくいったりゆかなかったりするのが解せません。
second.phpにセッションIDが渡っているのでセッションが切れているわけでもありません。
second.phpで消えているパターンでも遷移元のfirst.phpでは値が表示されていますので、セッション変数に一度は値が格納されているようです。
原因として考えられることってなんでしょうか?
$_SESSION = array();の使い方が間違っているとか?
ヒントで結構ですので、ここを確認してみろってことがあれば是非ご指摘ください。

かえってややこしくなるかもしれませんが少し追記します。
first.phpのPOSTパラメータですが、メニューで使用しています。
下記のようなリンクがあってDBからメニュー名$TITLEとvalueをwhile文でメニューの数だけループして複数マッピングしています。
今回は内容がかわりませんが、条件によっては$AAA,$BBB,$CCCは書き換わります。

<form method="POST" action="first.php" name="form123"> <input type ="text" value ="{$DDD}" name ="DDD" style="display:none;"> <input type ="text" value ="{$AAA}" name ="AAA" style="display:none;"> <input type ="text" value ="{$BBB}" name ="BBB" style="display:none;"> <input type ="text" value ="{$CCC}" name ="CCC" style="display:none;"> <a href="javascript:form123.submit()">{$TITLE}</a> </form

first.phpのaタグは実はTinyMCEでユーザーが挿入するもので、ユーザーに$AAA,$BBB,$CCCの変化を意識させず、IDだけをGETで書いてもらい、$AAA,$BBB,$CCCはsecond.phpがセッションから取得して適切な内容で返すといったことをやろうとしています。

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

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

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

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

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

m.ts10806

2019/08/09 03:54

コードはマークダウンのcode機能を利用してご提示ください。 > https://teratail.com/help#about-markdown >追伸:お盆休みで山に篭るので、お返事が遅くなるかもしれません こういったものは特に必要ないとは思いますが、つけることで「丸投げ」の印象が強くなります。 本当に100%的確適切な質問ができているならまだしもそういうことってあまりないので、自身もなるべく早めに反応ができる状況で質問すべきと個人的には思います(休暇とか関係なく回答してくれる人はいるわけで、その人に失礼だと思います)
kamomedon

2019/08/09 04:02

申し訳ありません。 書き直しました。
m.ts10806

2019/08/09 04:04

first.phpにPOSTしているHTMLもご提示ください。 あと下記がちょっと手順としてイメージがわきにくいです。 具体的に記載願えますか(再現確認しないと回答難しそうですし) >first.php内のメニューでPOSTでパラメータを切り替えてセッション変数を上書き。
kamomedon

2019/08/09 05:03

HTML追記しましたが、これはDBからループで出力しています。 追記のとおり目的はユーザーにリンクを挿入してもらうにあたって、パラメータを最小にするためにIDだけ指定してもらってあとはセッションで引き渡そうとしています。
guest

回答1

0

ちょっと状況がわからない

  • first.php

PHP

1<?php 2session_start(); 3$_SESSION = array(); 4$_SESSION['AAA'] = filter_input(INPUT_POST,'AAA'); 5$_SESSION['BBB'] = filter_input(INPUT_POST,'BBB'); 6$_SESSION['CCC'] = filter_input(INPUT_POST,'CCC'); 7echo "{$_SESSION['AAA']}<br>"; 8echo "{$_SESSION['BBB']}<br>"; 9echo "{$_SESSION['CCC']}<br>"; 10echo session_id(); 11?> 12<hr> 13<a href="second.php?ID=674">secondへ進む</a> 14<hr> 15<form method="post"> 16AAA:<input type="text" name="AAA" value="AA"> 17BBB:<input type="text" name="BBB" value="AB"> 18CCC:<input type="text" name="CCC" value="AC"> 19<input type="submit" value="send"> 20</form>
  • second.php

PHP

1<?php 2session_start(); 3echo filter_input(INPUT_GET,'ID')."<br>"; 4echo "{$_SESSION['AAA']}<br>"; 5echo "{$_SESSION['BBB']}<br>"; 6echo "{$_SESSION['CCC']}<br>"; 7echo session_id(); 8?> 9<hr> 10<a href="first.php">firstへ戻る</a> 11<hr> 12firstを更新 13<form method="post" action="first.php"> 14AAA:<input type="text" name="AAA" value="AA"> 15BBB:<input type="text" name="BBB" value="AB"> 16CCC:<input type="text" name="CCC" value="AC"> 17<input type="submit" value="send"> 18</form>

確認

  • firstを表示しsecondに進む→セッションの表示はない、戻る
  • firstを表示しformをsubmitしてセッション情報が表示されるのを確認しsecondに進む→セッションは引き継がれる→戻る
  • firstを表示しsecondに進む→セッションの表示はない→formでfirstにサブミット→firstにセッション情報が表示→secondに進む→セッション情報表示されるはず

調整

post値がないときはセッションがクリアされないようにしては?

PHP

1<?php 2session_start(); 3 4foreach(["AAA","BBB","CCC"] as $val){ 5 $$val=filter_input(INPUT_POST,$val); 6 if(!isset($_SESSION[$val])) $_SESSION[$val] = ""; 7 if(!is_null($$val)) $_SESSION[$val] = $$val; 8} 9 10echo "{$_SESSION['AAA']}<br>"; 11echo "{$_SESSION['BBB']}<br>"; 12echo "{$_SESSION['CCC']}<br>"; 13echo session_id(); 14?> 15<hr> 16<a href="second.php?ID=674">secondへ進む</a> 17<hr> 18<form method="post"> 19AAA:<input type="text" name="AAA" value="AA"> 20BBB:<input type="text" name="BBB" value="AB"> 21CCC:<input type="text" name="CCC" value="AC"> 22<input type="submit" value="send"> 23</form>

投稿2019/08/09 04:09

編集2019/08/09 06:13
yambejp

総合スコア114839

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

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

kamomedon

2019/08/09 05:10

判りにくくて申し訳ありません。 second.phpで表示されずfirst.phpに戻った場合でもセッションIDは同じものが引き継がれています。 表面上ではGETで送っているIDしか違いはないのですが、セッション変数が保持されるものは何度やっても保持され、セッション変数が保持されないものは何度やっても保持されない、つまり再現性があります。
kamomedon

2019/08/09 05:45 編集

現象としましては一度いただいたソースでsecond.phpに行ってからfirst.phpに戻ってsendボタンを押していない状態でaタグをクリックするとまさに問題の状態になるのですが、first.phpにパラメータが表示された状態で常にsecond.phpに遷移しているので不思議に思っています。
yambejp

2019/08/09 05:37

「first.phpに戻って」が2パターンあります ・アンカーをクリックしたり、urlを直接入力するなど「戻る」といいつつfirstに進む場合 ・ブラウザの戻るボタンで戻る、いわゆるhistory.backする状態 ※前者のアンカーで進んだ場合は当然post値をセッションいれてるわけですから セッションデータは空になります ※後者はそもそも戻った瞬間にエラーになる可能性が高いですけど
kamomedon

2019/08/09 05:47

いただいたソースを触っていて気付いたのですが、$_SESSION = array();の有無に関わらず、second.phpからfirst.phpに戻ってくるとパラメータがクリアされるのですがそうゆうものなのでしょうか。 しかし必ず新たにPOSTしてから遷移しているのでやはり不思議です。
yambejp

2019/08/09 05:50

> second.phpからfirst.phpに戻ってくるとパラメータがクリアされるの そりゃそうでしょう。 毎回セッション変数にpost値を投入しているのですから 該当するpost値がないときはnullが投入されます
kamomedon

2019/08/09 06:00

そうですよね。で今回の場合一旦Nullになるとしても、メニューをクリックして再度POSTしており、first.php上で表示確認もできているので、何か全く別の理由で初期化する要因が潜んでいるのでしょうね。 一応first.phpで表示確認したあとにやってることはaタグをクリックしてるだけなんですが。
kamomedon

2019/08/09 10:41

nullの場合セッションがクリアされないようにするご提案ありがとうございます! 試してみます。 後日結果報告させていただきます。
kamomedon

2019/08/19 01:20

間が空いてしまいすみません。やはり解決には至りませんでした。 同じ遷移元スクリプトである条件では遷移先にsessionが保持され、ある条件では遷移時にsessionが破棄されるので、何か根深いものがあるようです。 aタグ押下前はどちらの条件でもsessionが保持されていることを確認しているので、ページ遷移時に何かが起きていることは間違いなさそうです。 一度スクリプト全体をじっくり見直してみたいと思います。 お手数を煩わせてすみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問