2012-03-16 13 views
0

に空には、だから私のウェブサイトにログイン中の私のセッションの配列をデバッグした後、私はフォームを投稿する際に、すべてのセッションデータが失われたことがわかります。 updateDetailsCHANGEPASSWORDメソッドが呼び出されたときにセッションデータがワイピングされます。 これはなぜですか?PHP - セッションが失わ/フォームポスト

  • のsession_start()がPOSTリクエスト時に任意のデータ処理
  • 前に呼び出され、セッションデータを設定し、設定されていない(全体ではなく$ _SESSION変数)
  • 私は確認するには、次のコードを使用しますPOSTリクエストの場合:

    場合($ _ SERVER [ 'REQUEST_METHOD'] == 'POST'){}

  • それは一度だけ起こります:セッションが失われると、問題がそれ以上発生することなくメソッドを呼び出すことができます(期限切れやブラウザを閉じることでセッションを失うまで)。あなたが呼び出す必要があり、セッションを使用する各ページで

index.phpを(一部)

session_start(); 

$page = $_GET['p']; 
$query = $_GET['q']; 
$req = $_GET['req']; 

$user = new User(); 
switch($page) { 
    case 'account': 

     if($req=="logout") { 
      if($user->isLoggedIn()) 
       $user->logout(); 

      header("Location: /?p=account"); 
      exit(); 

     } 
     else if($req=="signup") { 
      if($user->isLoggedIn()) { 
       header("Location: /?p=account"); 
       exit(); 
      } 
      else { 

       if($_SERVER['REQUEST_METHOD'] == 'POST') { 

        $form_data = array('username' => $_POST['username'], 
         'password' => $_POST['password'], 
         'password_repeat' => $_POST['password_repeat'], 
         'title' => $_POST['title'], 
         'first_name' => $_POST['first_name'], 
         'surname' => $_POST['surname'], 
         'dob_day' => $_POST['dob_day'], 
         'dob_month' => $_POST['dob_month'], 
         'dob_year' => $_POST['dob_year'], 
         'gender' => $_POST['gender'], 
         'email' => strtolower($_POST['email']), 
         'email_repeat' => strtolower($_POST['email_repeat'])); 

        if($user->signup($form_data)) { 
         header("Location: /?p=account"); 
         exit(); 
        } 
       } 
      } 
     } 
     else { 
      if($user->isLoggedIn()==true) {     
       if($_SERVER['REQUEST_METHOD'] == 'POST') { 

        if($req=='editdetails') { 

         $form_data = array(
          'title' => $_POST['title'], 
          'first_name' => $_POST['first_name'], 
          'surname' => $_POST['surname'], 
          'gender' => $_POST['gender'], 
          'phone' => $_POST['phone'], 
          'email' => strtolower($_POST['email']), 
          'password' => $_POST['password'] 
          ); 

         if($user->updateDetails($form_data)) { 
          header("Location: /?p=account"); 
          exit(); 
         } 
        } 
        else if($req=='changepassword') { 
         $form_data = array(
          'old_password' => $_POST['old_password'], 
          'password' => $_POST['password'], 
          'password_repeat' => $_POST['password_repeat'], 
          ); 

         if($user->changePassword($form_data)) { 
          header("Location: /?p=account"); 
          exit(); 
         } 
        } 
       } 
       $user->retrieveUserDetails(); 
       $details=$user->getUserDetails(); 
      } 
      else { 
       if($req) { 
        header("Location: /?p=account"); 
        exit(); 
       } 
       else if($_SERVER['REQUEST_METHOD'] == 'POST') { 

        $form_data = array('username' => $_POST['username'], 'password' => $_POST['password']); 

        if($user->login($form_data)) { 
         $user->retrieveUserDetails(); 
         $details=$user->getUserDetails(); 
        } 
       } 

      } 
     } 
     break; 
} 

user.php(一部)

class User { 

private $auth; 
private $details; 
private $session_alert; 

function User() { 

    if(isset($_SESSION['alert'])) 
     $this->session_alert = $_SESSION['alert']; 

    $this->auth = isset($_SESSION['auth']) ? $_SESSION['auth'] : null; 

    if(isset($this->auth)) { 
     $database= new Database; 
     if($database->checkUserSession($this->auth['user_id'],session_id())) { 
      $this->logged_in=true; 
     } 
     else { 
      $this->addSessionAlert('global','Your login session has possibly timed out, you may login again by <a href="/?p=account">clicking here</a>.',true); 
      unset($_SESSION['auth']); 
     } 
    } 
} 

function login($data) { 
    $return = false; 
    $this->form = new Form($data,0);  

    if(!$this->form->getError()) { 
     $database= new Database; 
     $error_msg = "The username/password entered was invalid. Please check to see if they are correct and try again, or use the relevant links to recover your account."; 

     $salt = $database->getSaltByUsername($data['username']); 

     if($salt) { 
      $hash = $this->hashpwd($data['password'],$salt); 

      // Do login 
      $this->auth = array(); 
      $this->auth['user_id'] = $database->checkUserByHash($data['username'],$hash); 

      if($this->auth['user_id']) { 
       session_regenerate_id(); 

       if($database->doLogin($this->auth['user_id'],session_id())) { 
        $details=$database->getUserDetailsById($this->auth['user_id']); 
        $this->auth['first_name'] = $details['first_name']; 

        $_SESSION['auth']=$this->auth; 

        $this->logged_in=true; 
        $return = true; 
       } 
       else 
        $this->form->pushError('Something went wrong, please try again.'); 
      } 
      else 
       $this->form->pushError($error_msg); 
     } 
     else 
      $this->form->pushError($error_msg); 
    } 
    return $return; 
} 
function logout() { 
    $return = false; 

    if(isset($this->auth)) { 
     $database= new Database; 

     if($database->clearUserSession($this->auth['user_id'],session_id())) { 
      unset($_SESSION['auth']); 
      $this->logged_in=false; 
      session_regenerate_id(); 
      $return = true; 
     } 
    } 

    return $return; 
} 
function signup($data) { 
    $return = false; 
    $this->form = new Form($data,1);  

    if(!$this->form->getError()) { 
     $database= new Database; 

     if($database->checkUserByUsername($data['username'])) 
      $this->form->pushError("The username entered already exists, please try again."); 

     else if($database->checkUserByEmail($data['email'])) 
      $this->form->pushError("The e-mail address entered is already in use, please try again."); 

     else { 
      $dbarray = $data; 

      unset($dbarray['password'],$dbarray['password_repeat'],$dbarray['dob_month'],$dbarray['dob_day'],$dbarray['dob_year']); 

      $dbarray['dob']=date("Y-m-d", mktime(0,0,0,$data['dob_month'], $data['dob_day'], $data['dob_year'])); 

      $dbarray['salt']=strtoupper(md5(mt_rand())); 
      $dbarray['hash'] = $this->hashpwd($data['password'],$dbarray['salt']); 

      // Do signup 
      $this->auth = array(); 
      $this->auth['user_id'] = $database->newUser($dbarray); 
      if($this->auth['user_id']) { 
       session_regenerate_id(); 

       if($database->doLogin($this->auth['user_id'],session_id())) { 
        $details=$database->getUserDetailsById($this->auth['user_id']); 
        $this->auth['first_name'] = $details['first_name']; 
        $_SESSION['auth']=$this->auth; 

        $this->logged_in=true; 
       } 
       $return=true; 
      } 
      else { 
       $this->form->pushError("Something went wrong, please try again."); 
      } 
     } 
    } 
    return $return; 
} 
function updateDetails($data) { 
    $return = false; 
    $this->form = new Form($data,2);  

    if(!$this->form->getError()) { 
     $database= new Database; 

     if($database->checkUserByEmailNotById($data['email'],$this->auth['user_id'])) { 
      $this->form->pushError("The e-mail address entered is already in use, please try again."); 
     } 

     else { 

      $salt = $database->getSaltById($this->auth['user_id']); 
      if($salt) { 
       $hash = $this->hashpwd($data['password'],$salt); 
       if($database->checkUserIdByHash($this->auth['user_id'],$hash)) { 
        $database->updateUserById($this->auth['user_id'],$data); 
        $return = true; 

       } 
       else 
        $this->form->pushError("The password entered was incorrect, please try again."); 
      } 

     } 
    } 

    return $return; 
} 

function changePassword($data) { 
    $return = false; 
    $this->form = new Form($data,3);  

    if(!$this->form->getError()) { 
     $database= new Database; 

     $salt = $database->getSaltById($this->auth['user_id']); 
     if($salt) { 

      $hash = $this->hashpwd($data['old_password'],$salt); 

      if($database->checkUserIdByHash($this->auth['user_id'],$hash)) { 
       $salt=strtoupper(md5(mt_rand())); 
       $hash = $this->hashpwd($data['password'],$salt); 

       if($database->updateSaltHashById($this->auth['user_id'],$salt,$hash)) $this->addSessionAlert('yourdetails','Your password has been changed successfully.',false); 
       $return = true; 

      } 
      else 
       $this->form->pushError("The old password entered was incorrect, please try again."); 
     } 
    } 

    return $return; 
} 

function isLoggedIn() { 
    return $this->logged_in; 
} 
function getUserDetails() { 
    return $this->details; 
} 

}

+2

... – jeroen

+0

私は疲れて/怠けていると私は簡単な答えを得ることができると考えられていた、申し訳ありませんが、コードがアップしています。コメントの欠如などのお詫び、私はこれでかなり新しいです。 –

+0

'$ database-> clearUserSession()'は何をしますか? – Starx

答えて

0

session_start();

+0

session_start()があります。質問を読むことはできませんか? – Starx

2

クラスのコンストラクタメソッドの内部セッションの開始、ちょうど素敵な音はありません。代わりにindex.phpページの上部に

使用session_start();

+1

チップバディのおかげで、残念ながらそれは問題を解決しませんでした:(ユーザーが再ログインすると、問題はもう存在しなくなりました。ページ上部のセッションデータを見ることができます。 –

0

はこちらをご覧ください:

http://codex.wordpress.org/Function_Reference/wp_update_user

注:現在のユーザーのパスワードが更新されている場合には、クッキー がクリアされます!今

はなぜこれを行います WordPressは明らかではないが、明らかに、クッキー、したがってセッションは、 wp_update_user()てパスワードを設定する上で削除されることが述べられています。

一部の人々は、パスワードを設定するときにリダイレクトした直後exit();を適用し、失われクッキーを防ぐことができますことを発見しました。コードを見ることなく伝えることがかなり難しい

関連する問題