前提・環境
- 言語 PHP7.0
- サーバー iis7.5
- ブラウザ chrome 60
- DB MySQL
- (仮データ)DB(table)に入っているid 16AB
- (仮データ)DB(table)に入っていないid 15AB
- ↑ $_SESSION['id']には上記2つのデータが仮に入るとします。
現状のソースコード(簡略したもの)
lang
1<?php 2session_start(); 3session_regenerate_id(true); 4 5$_SESSION['login']=1; 6$_SESSION['id']=$hoge;//15ABか16ABが入っている$hoge 7 8/*DB接続する記述、try,catchの記述は省略*/ 9$sql='select count(*) from table where id = ?'; 10$stmt=$dbh->prepare($sql); 11$data[]=$_SESSION['id']; 12$stmt->execute($data); 13 14$dbh=null;//DBと接続を切る 15$rec=$stmt->fetch(PDO::FETCH_ASSOC); 16 17if($rec['count(*)']==0){ 18 /*idに15ABが入れられ、DBにそんなレコード 19 無い、false.phpへ飛ぶよ*/ 20 header('location:./false.php'); 21 exit(); 22}else{ 23 /*idに16ABが入れられ、DBにそのレコード 24 あるから、true.phpへ飛ぶよ*/ 25 header('location:./true.php'); 26 exit(); 27} 28 29?>
疑問・困っている点
これでfalse.phpとtrue.phpへの遷移切り替え自体はできている状態です。
ここからが苦戦してまして、true.php(レコードにある16ABの方)に遷移すると$_SESSION変数も渡されているのですが、false.php(レコードに無い15ABの方)に飛ぶと、先ほどのソースコードに書いた$_SESSION変数が渡されて無い状態で遷移してしまいます。
lang
1<?php //false.php, true.php共通 2echo var_export($_SESSION , true);?>
長文になっているので、要約すると$_SESSION['login']=1;と$_SESSION['id']=15ABをfalse.phpに渡したいのです。
問題の発生条件
さらに、A.phpに$_SESSION変数が渡される条件と渡されない条件がありまして、
表示されない
1.$hogeに16ABが入った状態で上記ソース実行→true.phpへ
2.セッション削除
3.$hogeに15ABが入った状態で上記ソース実行→false.phpへ
これだと遷移したときに$_SESSION変数が渡されません。
表示される
1 $hogeに15ABを含むDBに入っていないデータが入った状態で上記ソース実行→false.phpへ
2.セッション削除
3.再度$hogeに15ABを含むDBに入っていないデータが入った状態で上記ソース実行→false.phpへ
これなら遷移したときに$_SESSION変数が渡されます。
試したこと
- キャッシュの悪さ、ブラウザ特有の現象かと考え他のブラウザで試してみましたが結果は変わらず
- 処理にウェイトを置く(数秒処理を遅延させる等)
素直にエラーとかでしたら、これくらいのレベルなら簡単に対処できるのですが、特定の条件で思うようにいかず、困っています。
iisの設定が悪いのかなとも思い始めてます…現在進行形で試行錯誤中です。
「もしかしたらこれ書けばいけるんじゃね?」「iisのこの設定書いてる?」等あいまいな回答でもいいので、よろしくお願いします。
追記
lang
1session_regenerate_id(true);
この1行を消したら正しく$_SESSIONを渡せるようになりました。
これはまた新しく質問を建てたほうがいいのか否か…
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/08/15 00:34
2017/08/15 00:40