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