簡體   English   中英

會話變量不起作用? (PHP)

[英]Session variables not working? (PHP)

我對 2 個文件有疑問: login_config.phpprofile.php

  • login_config.php 包含一個登錄系統,它在完成多種形式的身份驗證后將 $_SESSION['key'] 設置為 true。
  • profile.php 是用戶成功后重定向到的頁面。

我希望 profile.php 上的數據只能通過設置 $_SESSION['key'] 訪問(成功登錄后)。

我的問題:我的代碼有什么問題? 此外,為什么我在登錄提交時會出現錯誤,如果 $_SESSION['key'] 為假/未設置,而不是目標 profile.php 頁面,則該錯誤應該返回?

代碼:(login_config.php)

<?php

// POST VARIABLES
$submit = $_POST['login_submit'];
$username = $_POST['login_username'];
$password = $_POST['login_password'];
$email = $_POST['login_email'];

require 'password_config.php';

if(isset($submit)){

    require 'db/connect.php';

    // PASSWORD VERIFYING
    $pass_query = "SELECT password FROM users WHERE email='$email'";
    $queried = mysql_query($pass_query);
    while($row = mysql_fetch_array($queried)){
        $user_pass = $row['password'];
        $veri_password = password_verify($password, $user_pass);
    }
    if(!$veri_password === true){$errors[] = '-Account does not exist ';}

    // CHECKING NUM ROWS
    $sql = "SELECT id, username FROM users WHERE password='$user_pass' AND email='$email'";
    $entered_user = mysql_query($sql);
    $num_rows = mysql_num_rows($entered_user);


    // ERRS ARRAY ESTABLISHED
    $errors = array();

    // FURTHER VERIFYING
    if( empty($password) || empty($email) )
    {
        $errors[] = 'Please do not leave fields empty';
    }
    elseif( $num_rows != 1 )
    {
        $errors[] = '-Account does not exist ';
    }
    elseif( $num_rows == 1 )
    {
        session_start();
        $_SESSION['key'] === true;

        while($row = mysql_fetch_array($entered_user)){
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = $email;
            $_SESSION['user'] = $row['username'];
            $_SESSION['pass'] = $password;
            header('Location: profile.php');
            exit();
        }

    }
}   

代碼:(profile.php)

<?php

session_start();

if($_SESSION['key'] !== true){
    die ("please <a href='login.php'>log in</a> to view this page");
}
?>
<html>
<head>
    <title>Profile</title>
    <link href='css/main.css' rel='stylesheet' />
</head>
<body>
    <div id='container'>
        <?php require 'include/header.php'; ?>
        <?= 'NJM ID # ==>'.$_SESSION['id'].'<br />'.'Username ==>'.$_SESSION['user'].'<br/>'.'Password ==>'.$_SESSION['pass'].'<br/>'.'<br />' ?>
        <a href='logout.php'>Log out!</a>
        <br />
        -OR-
        <br />
        <p>Try our beta mode<a href='forum.php'> forum</a></p>
        <?php require 'include/footer.php'; ?>
    </div>
</body>
</html>

注意:我知道在當前的代碼狀態下我很容易受到 SQL 攻擊,我稍后會修復這個問題,我也堅持使用已棄用的 MySQL 版本。

profile.php中你必須調用session_start(); 在使用$_SESSION之前。 session_start()不僅會啟動一個新會話,還會繼續一個現有會話(如果您願意,它會“啟動”會話處理功能)。 如果不調用它,您將無法使用$_SESSION

第一:我會使用三元運算符來檢查我需要的值是否存在,以避免“未定義索引'login_username'”錯誤。 像這樣:

$username = isset($_POST['login_username']) ? $_POST['login_username'] : '';
$password = isset($_POST['login_password']) ? $_POST['login_password']) : '';
$email = isset($_POST['login_email']) ? $_POST['login_email'] : '';

第二:出於安全原因,我會使用 PDO 連接 MySQL 服務器,而不僅僅是。

session_start();

if (isset($submit)){
    // select all data from db for the current user
    $st = $db->prepare('SELECT * FROM users WHERE email=?');
    $st->execute([$email]);
    //$rows = count_rows_here
    if($rows == 1){
        $row = $stmt->fetch();
        if(password_verify($password, $row['pass'])){
            $_SESSION['key'] = true; // notice the '=', and not '==='
            $_SESSION['id'] = $row['id'];
            $_SESSION['email'] = $row['email'];
            $_SESSION['user'] = $row['username'];
            $_SESSION['pass'] = $row['password'];
            header('Location: profile.php');
       } else {
           echo 'Error!';
       }
   }
}

在您轉到下一個 PHP 頁面后,我會先嘗試刪除exit()調用。 沒有必要,因為它下面沒有代碼,它可能會影響會話(但我不這么認為)

如果這不起作用(可能不會)在您開始會話var_dump($_SESSION)並查看/發布其內容后添加到profile.php

我通過為 $_SESSION['key'] 分配一個具有值的變量來解決此問題。

$_SESSION['key'] = $check = 'check';

然后在 profile.php 中進行測試,我輸入了以下代碼:

if(isset(!$_SESSION['key'])){die ('example')}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM