在同一页面中使用会话变量的登录表单

Login form with session vars in the same page

我正在尝试 运行 我的小测试脚本,一个带有 PHP 的登录面板。

我希望 index.php 有一个任何人都可以查看的 public 部分,但是当用户登录时应该看到 public 页面以及我从基于数据库的其他数据关于数据会话(例如,用户名)。

为了更好地理解所有内容,我将附上一张图片,说明我希望它如何运行我的脚本(示例):

我的代码如下:

index.php

<!DOCTYPE html>
<html lang="es">
    <head>
        <title>PHP - Log in - test page</title>
        <style>
            .container{text-align:justify;width:300px;}
            span{font-size:22px;}

        </style>
    </head>
    <body>
    <div class="info">
        <h1>PHP TEST PAGE</h1>
<?php
    if ($login_session == null)
    {
        echo "<span><a href='loginpanel.php'>Log in</a></span>";
    }
    else
    {
        echo "<span>{$login_session}</span>";
        echo "<span><a href='loginpanel.php'>Log out</a></span>";
    }
?>
    <div class="container">
        <p>
            Lorem ipsum dolor sit amet, usu ei mazim exerci everti, quas numquam interesset sed te. Dicunt epicurei moderatius sed at. Integre detraxit quaerendum ut has. Sea ut viderer sensibus.
        </p>
        <p>
            Sed ad idque detraxit probatus, ne feugiat mediocrem eos. Quo an veniam iisque, ignota integre elaboraret vix ut. Et mea ludus aliquid legimus, nam te illud atqui cetero. Tempor feugiat delicatissimi pro ad.
        </p>
    </div>
</body>

loginpanel.php

<?php
    require_once('login.php');
    $error = isset($_GET['error']) ? $_GET['error'] : NULL; 
?>
<!DOCTYPE html>
<html lang="es">
    <head>
        <title>Log in panel</title>
    </head>
    <body>
        <form action="" method="POST">
            <input maxlength='64' name="username" type="user" placeholder="User" required>
            <input maxlength='64' name="password" type="password" placeholder="Pass" required>
            <button type="submit" name="submit">LOG IN</button>
        </form>
        <h4 style="color:crimson;"><?php if ($error == 1){echo "Wrong user or pass";} ?></h4>
    </body>
</html>

conexion.php

<?php
    $connection = new mysqli("127.0.0.1","root","myultrasecureandsecretpassword","mydatabase");
    if (mysqli_connect_errno())
    {
        echo "ERROR; THE APOCALYPSIS IS NEAR!: " . mysqli_connect_error();
    }
?> 

login.php

<?php
    require_once('conexion.php');
    session_start();//starting session
    $error=''; //variable to store error message
    if (isset($_POST['submit']))
    {
        if (empty($_POST['username']) || empty($_POST['password']))
        {
            $error = "user or pass wrong"; 
        }
        else 
        {
            // Define $username and $password 
            $username=$_POST['username']; 
            $password=$_POST['password']; 

            // To protect MySQL injection for Security purpose 
            $username = stripslashes($username);
            $password = stripslashes($password);
            $username = mysqli_real_escape_string($connection, $username);
            $password = mysqli_real_escape_string($connection, $password);

            //SQL query to fetch information of registerd users and finds user match.
            $query=$connection->query("SELECT usuario
                                FROM usuarios
                                WHERE usuario='{$username}' 
                                AND password='{$password}'
                                ");
            $fila=$query->fetch_row();
            $rows = mysqli_num_rows($query);
            if ($rows == 1)
            {
                $_SESSION['login_user']=$username;//Initializing Session
                header("Location: index.php");//Redirecting to other page
            }
            else 
            {
                header("Location: loginpanel.php?error=1");//Redirecting to other page
            }
            //Closing Connection
            mysqli_close($connection);
        }
    }
?>

session.php

<?php
    require_once('conexion.php');
    session_start();// Starting Session
    //Storing session
    $user_check=$_SESSION['login_user'];

    //SQL query to fetch complete information of user
    $ses_sql = $connection->query("SELECT usuario FROM usuarios WHERE usuario='{$user_check}'");
    $row = $ses_sql->fetch_assoc();

    $login_session=$row['usuario'];
    if(!isset($login_session))
    {
        //Closing Connection
        mysqli_close($connection);
        header('Location: index.php');//Redirecting to home page 
    }
?>

logout.php

<?php
    session_start();
    if(session_destroy()) //Destroying all sessions
    {
        header("Location: index.php"); //Redirecting to home page
    }
?>

这正是我想要的!我怎样才能实现它? 我应该更改我的代码什么? 在我的实际代码中,存在以下错误:

Notice: Undefined variable: login_session in C:\xampp\htdocs\testlogin\index.php on line 15

感谢阅读!

Notice: Undefined variable: login_session in C:\xampp\htdocs\testlogin\index.php on line 15

好的,请看一下 index.php 的第 15 行:

if ($login_session == null)

这是该文件中 PHP 代码的第一行。 $login_session 没有实际定义。所以即使没有通知,它也永远不会有价值。

变量在脚本执行之间不保持它们的值。每次执行脚本时,它都是从无到有。如果您想在该执行之外保留一个值,则需要将其保留在某个地方。根据变量的 name 判断,您可能想使用 a session value.

您可能会像这样检查值:

if (isset($_SESSION['login']))

(也许还添加了对值 本身 的第二次检查,而不仅仅是它是否存在)

你会用这样的方式写信给它:

$_SESSION['login'] = $row['usuario'];

从一页到下一页,代码不保留任何变量记忆。值需要保存在一页的某处,以便另一页读取。