2013-10-26 30 views
1

我有这个奇怪的问题。我想制作一个使用用户名来识别应该显示哪些内容的页面。它似乎工作正常,除了一件事。在特定页面上从会话中读取错误的值。我在浏览器中检查了会话的值,但这里的价值似乎是正确的。我会告诉你的代码:阅读时会话值错误

这是我的登录功能,使用PHP:

<?php 

//CONNECT TO DATABASE 
$db = mysqli_connect("localhost","root","MyPassword","MyDBName"); 
if($db->connect_errno){ 
die('connection error: ' . $db->connect_errno); 
} 

    //CHECK IF LOGIN DATA IS SUBMITTED AND IS CORRECT 
if(isset($_POST['action'])){ 
switch($_POST['action']){ 
    case "login": 
     $pw = $_POST['pw']; 
     $loginUn = $db->real_escape_string($_POST['loginUn']); 
     $result = mysqli_query($db,"SELECT `Password` FROM `accounts` WHERE `Username`='" .$loginUn. "'"); 
     if(mysqli_num_rows($result) != 0){ 
      $dbpw = $result->fetch_object(); 
      $VI = explode("-",$dbpw->Password); 
      $dbpw = openssl_decrypt($VI[1],"blowfish","",0,$VI[0]); 
      if($pw == $dbpw){ 
       $login = true; 
       $_SESSION['login'] = true; 
       $_SESSION['Username'] = $_POST['loginUn']; 
       $un = $_POST['loginUn']; 
      } 
     } 
     break; 
    case "logout": 
      $_SESSION['login'] = false; 
      $_SESSION['Username'] = ""; 
     break; 
} 
}else{ 
    if(isset($_SESSION['login'])){ 
     $login = $_SESSION['login']; 
     $un = $_SESSION['Username']; 
    } 
} 

?> 

它似乎很好地工作,因为它在使用它的页面。 我已经在数据库中制作了一些虚拟帐户,使用这些用户名:Admin和User。 这里是页面的代码出了问题:

PHP:

//THIS IS NOT THE SAME PAGE AS THE PREVIOUS PHP CODE 
$login = false;    //CHECK IF USER HAS LOGGED IN 
$un = "";     

if(isset($_SESSION['login'])){ 
$login = $_SESSION['login'];  //IF LOGGED IN SET TO SESSION VALUE 
$un = $_SESSION['Username'];  //SET $UN TO USERNAME IN SESSION 
} 

然后我用JavaScript和PHP,以提醒该变量包含的值:

<script type="text/javascript"> 
    alert("$un = <?php echo $un;?>"); 
</script> 

与登录变量似乎没有问题,因为它具有良好的价值,但变量$ un是错误的。当我没有登录时,它没有任何价值,这是正确的,但是当我登录时,它包含值Admin,即使我没有使用Admin登录。在浏览器选项中,cookie值似乎是正确的。我检查了每个页面上的cookie,它工作得很好,只是不在这个页面上。我在做什么错误,使得浏览器(这是Firefox的顺便说一句)认为它始终是管理员登录?

+0

为什么标记为'javascript'?它与JavaScript无关,它与PHP和cookie有关。 –

+0

我用javascript来提醒值... –

+0

这是无关紧要的。我已经移除了标签。 –

回答

0

我刚刚发现我做错了什么。一段我发现不相关的代码,错过了a =,因此变量没有被比较,但被设置为错误的值。

+0

你应该仍然使用'$ _SESSION' – kelunik

1

正如前面在评论中提到的那样,脚本中存在很多安全风险。

你应该看看PHP的sessions来建立你的登录。使用会话时,将只有一个存储ID的cookie,所有数据将存储在您的服务器上,并且不能由用户修改。

您的问题与'管理员'保持为cookie值可能是一个缓存问题。

+0

我该如何解决这个缓存问题?我会看看这个会议,谢谢。 –

+0

您是否尝试清除浏览器的缓存? – kelunik

+0

刚刚做过,但并未解决问题。这些会话的使用也没有。 –