2

以下に、ユーザーがログインしてから、ログインの詳細が保存されてからログアウトするまでの 3 つの php スクリプトを順番に示します。現在私が行っているのは、$SESSIONログインしているユーザーを特定するために使用し、次に session_gcmaxlife を使用して余分な時間を追加し、セッションが 12 時間期限切れにならないようにすることです。つまり、ユーザーは 12 時間ログインしたままになり、その時間が経過するとユーザーは自動的にログアウトされます。これは、ログイン システムを作成する非常に基本的な理由にすぎません。

しかし、私がやりたいことは、ユーザーがログアウト リンクをクリックするか、ブラウザを閉じるまで、無制限にログインしたままにできるようにすることです。私の質問は、可能な限り最小限のコード変更で、ログアウトするかブラウザを閉じるまでユーザーがログインしたままになるように、以下のコードをどのように変更できるでしょうか?

最小限のコード変更でこれを行うことができますか? 5 つの php スクリプトを示している理由は、異なるスクリプトごとにどのような変更を加える必要があるかを確認できるようにするためです。そうすれば、アプリケーション内の他のスクリプトに変更を加えることができるはずです。 .

サンプルコードを表示して、変更を加える方法と場所を確認してください。

以下は、現在何が起こっているかを示すための php スクリプトです。

  1. teacherlogin.php (これは、ユーザーがアプリケーションにログインするためにログインの詳細を入力するスクリプトです)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<?php

// connect to the database
include('connect.php');
include('member.php');

  /* check connection */
  if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    die();
  }

  // required variables (make them explciit no need for foreach loop)
  $teacherusername = (isset($_POST['teacherusername'])) ? $_POST['teacherusername'] : '';
  $teacherpassword = (isset($_POST['teacherpassword'])) ? $_POST['teacherpassword'] : '';
  $loggedIn = false;
  $active = true;

  if ((isset($username)) && (isset($userid))){
      echo "You are already Logged In: <b>{$_SESSION['teacherforename']} {$_SESSION['teachersurname']}</b> | <a href='./menu.php'>Go to Menu</a> | <a href='./teacherlogout.php'>Logout</a>";
  }
  else{

  if (isset($_POST['submit'])) {

      $teacherpassword = md5(md5("g3f".$teacherpassword."rt4"));  

    // don't use $mysqli->prepare here
    $query = "SELECT TeacherId, TeacherForename, TeacherSurname, TeacherUsername, TeacherPassword, Active FROM Teacher WHERE TeacherUsername = ? AND TeacherPassword = ? LIMIT 1";
    // prepare query
    $stmt=$mysqli->prepare($query);
    // You only need to call bind_param once
    $stmt->bind_param("ss",$teacherusername,$teacherpassword);
    // execute query
    $stmt->execute(); 
    // get result and assign variables (prefix with db)
    $stmt->bind_result($dbTeacherId, $dbTeacherForename,$dbTeacherSurname,$dbTeacherUsername,$dbTeacherPassword, $dbActive);

    while($stmt->fetch()) {
      if ($teacherusername == $dbTeacherUsername && $teacherpassword == $dbTeacherPassword) {
if ($dbActive == 0) {
    $loggedIn = false;
    $active = false;
    echo "You Must Activate Your Account from Email to Login";
}else {
    $loggedIn = true;
    $active = true;
      $_SESSION['teacherid'] = $dbTeacherId;
      $_SESSION['teacherusername'] = $dbTeacherUsername;
}
      }
    }

    if ($loggedIn == true){
      $_SESSION['teacherforename'] = $dbTeacherForename;
      $_SESSION['teachersurname'] = $dbTeacherSurname;
      header( 'Location: menu.php' ) ;
      die();
    }

    if (!$loggedIn && $active && isset($_POST)) {
    echo "<span style='color: red'>The Username or Password that you Entered is not Valid. Try Entering it Again</span>";
    }

       /* close statement */
    $stmt->close();

    /* close connection */
    $mysqli->close();
  }
?>

2. member.php (このスクリプトに$SESSIONは、ログインしているユーザーを判別するための変数が含まれています。これは非常に重要なスクリプトであり、含まれています (`include(member.php) を使用して、ユーザーが既にログインしているかどうかを判別できます) )

<?php

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

$_SESSION['teacherforename'] = $_SESSION['teacherforename'];

}

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

$_SESSION['teachersurname'] = $_SESSION['teachersurname'];

}

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

      $userid = $_SESSION['teacherid'];

  }

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

      $username = $_SESSION['teacherusername'];

  }

        ?>

3 teacherlogout.php (最後に、これはログアウト ページです。ユーザーがログアウト リンク (現時点では menu.php にのみ表示されます) をクリックすると、このページに移動してメッセージが表示され、ログアウトが実行されます。セッションを破棄します)

<?php

ini_set('session.gc_maxlifetime',12*60*60);
ini_set('session.gc_divisor', '1');
ini_set('session.gc_probability', '1');
ini_set('session.cookie_lifetime', '0');
require_once 'init.php'; 

ini_set('display_errors',1); 
error_reporting(E_ALL);


session_start();

?>

</head>

<?php

include('member.php');

?>

<body>

<?php

if ((isset($username)) && (isset($userid))){
session_destroy();
echo "You have been Logged Out | <a href='./home.php'>Home</a>";
}

else {

echo "You are Not Logged In";

}

?>

</body>
</html>
4

1 に答える 1

8

失礼ではありませんが、セッションと Cookie が正しく機能する方法を理解していないようです。誰も見ない 5 ページのコードを貼り付ける代わりに、自分で問題を解決し、セッションと Cookie を調査して何かを学んでみませんか? 誰かが答えを教えてくれても、その背後にある概念を理解していなければ何も学べません。

http://us3.php.net/manual/en/session.idpassing.php

http://us3.php.net/cookies

http://www.tuxradar.com/practicalphp/10/0/0

また、@seeはウィンドウを閉じるときにセッションを破棄しますか?

于 2012-11-15T00:09:06.563 に答える