2

ユーザーのログインに PHP 認証システムを使用しています。ユーザーのログインは正常に機能しますが、(任意のページで) ページを更新すると、セッション変数がリセットされ、ユーザーは「ログアウト」されます。すべてのページで session_start() を使用しています。ユーザーをログに記録して認証するためのファイル auth.php と authenticate.php があります。これはイライラする問題であり、助けていただければ幸いです。ここでコードを提供します:

auth.php:

<?php
function credentials_valid($email, $password) {
    $email = mysql_real_escape_string($email);
    $query = "SELECT `id`, `salt`, `password` 
              FROM `#######` 
              WHERE `email` = '$email' ";

    $result = mysql_query($query);
    if(mysql_num_rows($result)) {
        $user = mysql_fetch_assoc($result);

        $password_requested = sha1($user['salt'] . $password);
        if($password_requested === $user['password'])   {
            return $user['id'];
            }   
        }
    return false;
}

//logs into the user $user
function log_in($user_id){
    $_SESSION['user_id'] = $user_id;

}

//Returns the currently logged in user (if any)
function current_user(){
    static $current_user;
    if(!$current_user) {
        if($_SESSION['user_id']){
            $user_id = intval($_SESSION['user_id']);
            $query = "SELECT * 
                         FROM `#######` 
                         WHERE `id` = $user_id";

            $result = mysql_query($query);
            if(mysql_num_rows($result)){
                $current_user = mysql_fetch_assoc($result);
                return $current_user;
                }
            }
        }
        return $current_user;
    }


//Requires a current user
function require_login() {
    if(!current_user()){
        $_SESSION['redirect_to'] = $_SERVER["REQUEST_URI"];
        header("Location: index.php");
        exit("You must log in.");

}
}

?>

認証.php:

<?php
session_start();
require_once "database.php";
db_connect();
require_once "auth.php";


$user_id = credentials_valid($_POST['username'], $_POST['password']);
if($user_id){
    log_in($user_id);

    if($_SESSION['redirect_to']){
        header("Location: " . $_SESSION['redirect_to']);
        unset($_SESSION['redirect_to']);

    }else{
        header("Location: index.php");          
    }

}else{
        header("Location: login.php?error=1");
        exit("You are being redirected");       
}

?>

ユーザーがログインしているページの1つで、phpヘッダーにこれがあります:

<?php

    session_start();
    require_once "database.php";
    db_connect();
    require_once "auth.php";

    $current_user = current_user();

if(isset($_GET["logout"]) && $_GET["logout"]==1)
    {
        //User clicked logout button, distroy all session variables.
        session_destroy();
        header('Location: '.$return_url);
    }
?>

システムが不安定です。ログイン直後にページを更新すると、セッション変数がすぐに破棄されることがあります。それ以外の場合、連続して数回更新した後、ユーザーはログインしたままになります。あなたが見ている問題を教えてください。ありがとうございました!

4

1 に答える 1

2

PHPコードのすべてのページでsession_start()を使用するための重要なポイントに注意してください。コードから、一部のページにはsession_start();が含まれていないようです。

あなたのコードのもう一つのこと:

    header("Location: " . $_SESSION['redirect_to']);
    unset($_SESSION['redirect_to']);

コードを次のように変更する必要があります。

    a=$_SESSION['redirect_to'];
    unset($_SESSION['redirect_to']);
    header("Location: " . $a);
    exit();

リダイレクト後に設定を解除することはお勧めしません。また、以前のプロセスを閉じる必要があり、バックグラウンドでプロセスを実行し続ける場合があります。ヘッダーコマンドの後に何を試すかはお勧めしません..

于 2013-03-14T17:22:52.943 に答える