Javascript 检查可能不存在的会话变量

Javascript 检查可能不存在的会话变量,javascript,php,html,session-variables,Javascript,Php,Html,Session Variables,我有一个会话,当用户登录时会启动,但是某些代码可能会被点击,询问会话变量可能还不存在,这里是否还有检查变量的方法,或者是否有其他方法 如果用户不是管理员,PHP运行时会隐藏一个框,但该检查可能在用户登录之前发生。我如何检查会话变量值 我尝试过将代码移动到一个单独的页面,比如登录页面,但是没有效果,登录只是一个弹出窗口,而不是另一个窗口 session_start(); $connect= new mysqli('localhost', 'root', '', 'login') or die("

我有一个会话,当用户登录时会启动,但是某些代码可能会被点击,询问会话变量可能还不存在,这里是否还有检查变量的方法,或者是否有其他方法

如果用户不是管理员,PHP运行时会隐藏一个框,但该检查可能在用户登录之前发生。我如何检查会话变量值

我尝试过将代码移动到一个单独的页面,比如登录页面,但是没有效果,登录只是一个弹出窗口,而不是另一个窗口

session_start();

$connect= new mysqli('localhost', 'root', '', 'login') or die("connection failure, please try again later");

$username= $_GET["username"] ?? '';
$password= $_GET["password"] ?? '';

echo "<br>","$username";

$getsalt="SELECT * FROM users WHERE uname='$username'";

$salt= $connect->query($getsalt);

$currentsalt = "";

while($row=$salt->fetch_assoc()) {
    $currentsalt = $row["salt"];
    $_SESSION["uname"] = $row["uname"];
    $_SESSION["id"] = $row["id"];
    echo'<br>', 'is admin ', $row['is_admin'];
    $_SESSION["is_admin"] = 1;
    if($row["is_admin"] == 1) {
        echo 'is  admin';
        $_SESSION["is_admin"] = 1;
    } else {
        echo 'is not admin';
    }
}
echo "<br>","$password";
echo "<br>", $currentsalt;

if($currentsalt == null) {
        echo "user doesnt exist";
} else {
$hashed= sha1($password.$currentsalt);

echo "<br>", $hashed;

$getaccount="SELECT * FROM users WHERE uname='$username' AND pass='$hashed'";

$result= $connect->query($getaccount);

if($result-> num_rows>0) {
    while($row=$result->fetch_assoc()) {
        echo "<br>","Admin name is: " . $row["uname"];
        header("Location: /index.php");
    }
} else {
    echo "<br>","sorry password was incorrect";
}
}
session_start();
$connect=new mysqli('localhost','root','login')或die(“连接失败,请稍后再试”);
$username=$\u获取[“username”]??“”;
$password=$\u获取[“密码”]??“”;
回显“
”,“$username”; $getsalt=“从用户中选择*,其中uname='$username'; $salt=$connect->query($getsalt); $currentsalt=“”; 而($row=$salt->fetch_assoc()){ $currentsalt=$row[“salt”]; $\会话[“uname”]=$行[“uname”]; $\会话[“id”]=行[“id”]; 回显“
”、“是管理员”、$row[“是管理员”]; $\会话[“是\管理”]=1; 如果($row[“is_admin”]==1){ echo“是管理员”; $\会话[“是\管理”]=1; }否则{ echo“不是管理员”; } } 回显“
”,“$password”; echo“
”,$currentsalt; 如果($currentsalt==null){ 回显“用户不存在”; }否则{ $hashed=sha1($password.$currentsalt); echo“
”,$hash; $getaccount=“从用户中选择*,其中uname='$username'和pass='$hashed'; $result=$connect->query($getaccount); 如果($result->num_rows>0){ 而($row=$result->fetch_assoc()){ echo“
”,“管理员名称为:”.$row[“uname”]; 标题(“Location:/index.php”); } }否则{ 回显“
”,“对不起,密码不正确”; } }
您可以尝试使用
if(isset($\u SESSION['name'])&&$\u SESSION['name'])

此代码检查变量是否存在并具有某些值

编辑:根据最新评论添加新答案

我将分两部分回答你的问题

检查是否设置了会话变量。 您可以通过使用检查变量是否存在

如果变量不存在,则不会生成警告。这意味着empty()本质上是的简明等价物!isset($var)| |$var==false。

对所有受保护的页面执行登录检查。 建议在为登录用户保留的所有页面顶部添加登录检查

您可以按如下方式添加登录检查

创建一个名为
checkLogin()

然后,无论您想在何处限制未经授权的用户访问该页面,都应包括此
checkLogin()
函数


确保已将此函数添加到应用程序的公用文件中

此问题已解决,但我不知道如何将其标记为已解决。关键是您必须使用session_start();,在每个页面上启动会话;,多亏了无效的机器人和Railson luna,它们中的任何一个现在都可以工作了

我已经修改了问题中给出的代码,如下所示

我注意到您的代码中有一些不好的做法,并对它们添加了注释。请读一下


您可以通过
if(isset($\u session['fieldName']){session exists}
检查会话是否存在,而不仅仅是在用户登录时,始终使用session\u start()即可。如何在脚本开始时启动会话?会话似乎已启动,但它没有拾取会话变量。在解决并给出答案后,无需添加“[已解决]”。接受一个答案就意味着它是这样的。请详细说明。要检查的值是什么?这里检查
$row['is_admin']
是否为1。如果是,则将
$\u SESSION['is\u admin']
设置为零。这意味着,如果
$行['is_admin']
为1,那么作为
$会话['is_admin']
,您将拥有零。现在再次检查您的逻辑和代码。是的,更改了,会话变量仍然没有被提取,登录代码在单独的php文件中是否重要?请在问题中发布完整的代码(登录和登录检查)。@ihatephp您的代码中有一些错误(错误的做法)。如果可能,您应该将
uname
作为数据库中唯一的字段。然后只获取一条与用户名匹配的记录并检查密码。然后,仅当密码匹配时才设置会话变量。我会更新我的答案事实上问题不是我所检查的,而是通过了什么,没有通过会话变量,可能是一个代码超过两页的问题。谢谢,我一定会做这些更改,只是一个单一的项目,所以使用不好的编码实践不会有太大的问题,但这是一个很好的注释,它确实使代码更易于阅读。
if (empty($_SESSION['is_admin'])) {
    // do the action if the currently logged in user is not an admin
} else {
    // do the action if an admin user is logged in
}
function checkLogin(){
    if (!empty($_SESSION['user_id'])) {
        return true;
    } else {
        header("Location: https://YOUR_LOGIN_PAGE_URL");
        die();
}
<?php
session_start();
$connect= new mysqli('localhost', 'root', '', 'login') or die("connection failure, please try again later");

$username= $_GET["username"] ?? ''; // Username and password should not be passed as a part of the URL. Use POST instead
$password= $_GET["password"] ?? ''; // Username and password should not be passed as a part of the URL. Use POST instead


// Get the details of the user having the given Username
// Make the username field unique so that no two users can have the same username.

$getsalt="SELECT * FROM users WHERE uname='$username' LIMIT 1";
$userRow = $connect->query($getsalt)->fetch_assoc();

// No user found matching username
if (empty($userRow)) {
    // Handle the errors gracefully. Redirect the user back to the login page with an error message, instead of printing an error message.
    // echo "User doesn't exist.";
    // die();
    $_SESSION['loginError'] = "No users found"; 
    header('Location: login.php');
    die();

} else {
    // User found, now check the password

    // HERE YOU CAN AVOID AN UNNECESSARY DATABASE CALL.


    $salt = $userRow['salt'];
    $passwordHash = sha1($password . $salt);
    if ($userRow['pass'] === $passwordHash) {
        // password check succeeded. Let the user logged in
        $_SESSION['uname'] = $userRow['uname'];
        $_SESSION['id'] = $userRow['id'];
        if (!empty($userRow['is_admin'])) {
            $_SESSION['is_admin'] = 1;
        }
        header("Location: /index.php");
    } else {
        // Password check failed. Do not allow the user to logged in
        // Handle the errors gracefully. Redirect the user back to the login page with an error message
        // echo "Incorrect Password";
        // die();
        $_SESSION['loginError'] = "Incorrect Password"; 
        header('Location: login.php');
        die();
    }
}
<?php
session_start();
if (!empty($_SESSION['loginError'])) {
?>
<div class="error-message"><?php echo $_SESSION['loginError'];?> </div>
<?php 
unset($_SESSION['loginError'];// we do not need this error message anymore
} 
?>

// Rest of your login page code goes here...