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

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

ただいまの
回答率

87.49%

【PHP7.0】処理が飛んでしまう(?)

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,494

score 41

 前提・環境

  • 言語 PHP7.0
  • サーバー iis7.5
  • ブラウザ chrome 60
  • DB MySQL
  • (仮データ)DB(table)に入っているid 16AB
  • (仮データ)DB(table)に入っていないid 15AB
  • ↑ $_SESSION['id']には上記2つのデータが仮に入るとします。

 現状のソースコード(簡略したもの)

<?php
session_start();
session_regenerate_id(true);

$_SESSION['login']=1;
$_SESSION['id']=$hoge;//15ABか16ABが入っている$hoge

/*DB接続する記述、try,catchの記述は省略*/
$sql='select count(*) from table where id = ?';
$stmt=$dbh->prepare($sql);
$data[]=$_SESSION['id'];
$stmt->execute($data);

$dbh=null;//DBと接続を切る
$rec=$stmt->fetch(PDO::FETCH_ASSOC);

if($rec['count(*)']==0){
    /*idに15ABが入れられ、DBにそんなレコード
    無い、false.phpへ飛ぶよ*/
    header('location:./false.php');
    exit();
}else{
    /*idに16ABが入れられ、DBにそのレコード
    あるから、true.phpへ飛ぶよ*/
    header('location:./true.php');
    exit();
}

?>

 疑問・困っている点

これでfalse.phpとtrue.phpへの遷移切り替え自体はできている状態です。

ここからが苦戦してまして、true.php(レコードにある16ABの方)に遷移すると$_SESSION変数も渡されているのですが、false.php(レコードに無い15ABの方)に飛ぶと、先ほどのソースコードに書いた$_SESSION変数が渡されて無い状態で遷移してしまいます。

<?php //false.php, true.php共通
echo 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のこの設定書いてる?」等あいまいな回答でもいいので、よろしくお願いします。

 追記

session_regenerate_id(true);


この1行を消したら正しく$_SESSIONを渡せるようになりました。
これはまた新しく質問を建てたほうがいいのか否か…

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

+1

session_start(); をtrue.php,false.phpの冒頭にも書いてみてください。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/08/15 09:34

    回答ありがとうございます、そして申し訳ないです…
    true.php, false.php共にsession_start()は書いてあります…

    キャンセル

  • 2017/08/15 09:40

    なるほど。了解です。
    ソースはなるべく全てご提示ください。

    キャンセル

check解決した方法

0

セッション変数を外部ファイルから取得するためにどうやらセッションを入れる前にページ遷移していた模様です。お騒がせしました。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 87.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る