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

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

ただいまの
回答率

89.64%

戻るボタンでセッションを解除するには

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 1,546

dog57

score 118

TOP画面→アカウント編集→確認画面→編集完了
を作成しています。

アカウント編集画面で編集した時に、戻るボタンでTOPページに戻る時(アカウント編集→TOP画面)には
フォームで編集された内容がセッションに格納されずに元のデータのまま戻れるのですが

確認画面→アカウント編集→TOP画面の順に戻っていったときに
確認画面で編集内容を保持したままTOP画面に戻っていってしまうため下記の画像のようになってしまいます。

・アカウント編集→TOP画面
イメージ説明

・確認画面→アカウント編集→TOP画面
イメージ説明

原因は確認画面でアカウント編集で編集した内容を格納しているためですが、
確認画面→アカウント編集→TOP画面 で遷移してきた時に
そうしたら元のデータのまま表示させることができますか?

login_admin.php TOP画面

<?php
// 開発時にこれを書かないのはNG
ini_set('display_errors', true);
error_reporting(E_ALL);

session_start();
header("Content-type: text/html; charset=utf-8");

require_once('./functions.php');
require_once('../config/db.php');

// ログインしていなければ login_form.php へ遷移
require_logined_session();



// クッキーの設定、同じユーザーが再度ログインする際のE-メール、パスワードを記入する手間を省く
setcookie("email", $_SESSION["email"], time() + 30);
setcookie("password", $_SESSION["password"], time() + 30);



// 結果の取得
$country = array();

foreach ($statement as $row) {

    $country[] = $row;
    $_SESSION['rank'] = $row['rank'];
    $_SESSION['nation'] = $row['nation'];
    $_SESSION['food'] = $row['food'];
    $_SESSION['reason'] = $row['reason'];
    $_SESSION['id'] = $row['id'];

}





//
// Twig
//

// Composerで作成されたautoload.phpを読み込む
require_once ('../vendor/autoload.php');
// Twing_Loader_Filesystemを使う。login_admin.phpからのtemplatesディレクトリを指定(相対パス)
$loader = new Twig_Loader_Filesystem('../templates');
// $loaderをTwigの環境設定として twig instance を生成
$twig = new Twig_Environment($loader);

// Render
echo $twig->render('login_admin.html',array(

  'country' => $country,
  'row' => $row,
  'name' => $name

  )
);

account_edit.php

<?php
// 開発時にこれを書かないのはNG
ini_set('display_errors', true);
error_reporting(E_ALL);

session_start();
header("Content-type: text/html; charset=utf-8");

require_once('./functions.php');

// ログインしていなければ login_form.php へ遷移
require_logined_session();

// 初期化
$name = '';
$email = '';
$password = '';
$tel = '';

// Twig で使うための変数を定義
$name = $_SESSION["name"];
$email = $_SESSION["email"];
$password = $_SESSION["password"];
$tel = $_SESSION["tel"];
$userId = $_SESSION["userId"];



if (isset($_SESSION['errors'])) {

    $errors = $_SESSION['errors'];

}

print_r($_SESSION);

//
// Twig
//

// Composerで作成されたautoload.phpを読み込む
require_once('../vendor/autoload.php');
// Twig_Loader_Filesystemを使う。account_edit.phpからのtemplatesディレクトリを指定(相対パス)
$loader = new Twig_Loader_Filesystem('../templates');
// $loaderをTwigの環境設定として tiwg instance を生成
$twig = new Twig_Environment($loader);

// render
echo $twig->render('account_edit.html', array(

  'errors' => $errors,

  'userId' => $userId,
  'name' => $name,
  'email' => $email,
  'password' => $password,
  'tel' => $tel

  )
);

account_edit_confirm.php

<?php
ini_set("display_errors", 1);
error_reporting(E_ALL);

session_start();

// 文字化け対策
header("Content-type: text/html; charset=UTF-8");

require_once('./functions.php');
require_once('../config/db.php');

// ログインしていなければ login_form.php に遷移
require_logined_session();




// 初期化
$errors = array();

// POST時
if (filter_input(INPUT_SERVER, 'REQUEST_METHOD') == 'POST') {


    $_SESSION["name"] = filter_input(INPUT_POST, 'name');
    $_SESSION["email"] = filter_input(INPUT_POST, 'email');
    $_SESSION["password"] = filter_input(INPUT_POST, 'password');
    $_SESSION["tel"] = filter_input(INPUT_POST, 'tel');

    $name = $_SESSION["name"];
    $email = $_SESSION["email"];
    $password = $_SESSION["password"];
    $tel = $_SESSION["tel"];


    //
    // バリデーション
    //

    // 入力チェック
    if (empty($_SESSION["name"])) {

        $errors[] = "名前が入力されていません。";

    }

    if (empty($_SESSION["email"])) {

        $errors[] = "E-mailが入力されていません。";

    }

    if (empty($_SESSION["password"])) {

        $errors[] = "パスワードが入力されていません。";

    }

    if (empty($_SESSION["tel"])) {

        $errors[] = "電話番号が入力されていません。";

    }


    // 名前の文字数チェック
    if (strlen($_SESSION["name"]) >= 60) {

        $errors[] = "氏名が長すぎます。";

    }

    // パスワード文字数チェック(8文字以上かどうか)
    if (preg_match("/^[a-zA-Z1-9]{1,7}$/", $_SESSION['password'])) {

        $errors[] = "パスワードは8文字以上で入力してください。";

    }

    // 電話番号の文字数チェック(10文字 or 11文字)
    if (strlen($_SESSION['tel']) >= 1 && strlen($_SESSION['tel']) <= 9 && preg_match("/^[0-9]+$/", $_SESSION['tel'])) {

        $errors[] = "電話番号は10文字か11文字で入力してください。";

    } elseif (strlen($_SESSION['tel']) >= 12 && preg_match("/^[0-9]+$/", $_SESSION['tel'])) {

        $errors[] = "電話番号は10文字か11文字で入力してください。";

    }

    // メールアドレス形式チェック
    if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_SESSION['email']) && $_SESSION['email'] !== '') {

        $errors[] = "メールアドレスに間違いがあります。";

    }

    // 電話番号の形式チェック
    if (preg_match("/[-]+/", $_SESSION['tel'])) {

        $errors[] = "電話番号はハイフンなしで入力してください。";

    }

    // 電番番号の数字チェック
    // メールアドレス形式チェック
    if (!preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_SESSION["email"]) && $_SESSION["email"] !== "") {

        $errors[] = "メールアドレスに間違いがあります。";

    }





if (count($errors) > 0) {

    $_SESSION["errors"] = $errors;
    header("Location: account_edit.php");

} else {

  $_SESSION['errors'] = array();

}

}

print_r($_SESSION);

//
// Twig
//


// Composer で作成されたautoload.phpを読み込む
require_once('../vendor/autoload.php');

// Twin_Loader_Filesystemを使う。account_edit_confirmからのtemplatesティレクトリを指定(相対パス)
$loader = new Twig_Loader_Filesystem('../templates');

// $loaderをTwigの環境設定として Twig instance を生成
$twig = new Twig_Environment($loader);

// render
echo $twig->render('account_edit_confirm.html', array(

  'errors' => $errors,

  'name' => $name,
  'email' => $email,
  'password' => $password,
  'tel' => $tel

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • asahina1979

    2018/02/24 20:12

    何度か言われてると思うけど 編集情報を $_SESSION に保存していることが間違い

    キャンセル

回答 1

0

まず、Cookieにパスワードのような秘密情報を保存するのはXSSという脆弱性があった場合に危険なので、やめたほうがいいと思います。

戻るボタンを押した時の表示を戻すというよりは、ユーザが確認画面で確定をするまでは表示する名前を変更せず、編集完了画面になってからデータを変更するようにする必要があると思います。
なぜなら、今の実装ですと、確認画面の意味がなく、確認画面に送信した段階でデータが書き換わってしまうからです。

確認画面から編集完了画面へデータを渡すときは表示用とは別のセッション変数に確定前のデータを保存するといいのではないでしょうか?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

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