2010-09-12 62 views
2

我正在尝试使用PHP和mysql进行简单的登录,并使用Sessions。我有代码,理论上它应该可以工作,但它会将我重定向到登录页面(刷新它),而不是将我带到配置文件。PHP MYSQL问题

$username = $_POST['username']; 

$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '$username' AND `status`='Confirmed' "; 

$result = mysql_query($query); 

if (mysql_num_rows($result) == 1){  

$result2 = mysql_query($query);  

$row = mysql_fetch_row($result2); 

    $_SESSION['conf_code'] = $row[0]; 

    $uid = $row[0]; 
session_register($uid); 


header('location:profile.php?conf='.$row[0]); 

}  
else{ 
    echo 'Wrong username'; 
} 
+0

如果您没有登录,您是否在配置文件页面上有任何一种'测试'脚本重新指引您? – d2burke 2010-09-12 18:36:32

+0

是否至少在刷新时显示“错误的用户名”? – 2010-09-12 18:41:34

+0

是的,这两个问题。每个页面上都有一个session_registered检查,需要进行身份验证。如果我直接导​​航到这个脚本,它会显示错误的用户名。 – 2010-09-12 21:19:09

回答

1

没有它不应该在理论上
工作试试这个

<?php 
$username = mysql_real_escape_string($_POST['username']); 
$query = "SELECT `confirmcode` FROM `fb_network` 
      WHERE `username` = '$username' AND `status`='Confirmed' "; 
$result = mysql_query($query) or trigger_error(mysql_error().$query); 
if ($row = mysql_fetch_row($result)){  
    session_start(); 
    $_SESSION['conf_code'] = $row[0]; 
    header('Location: profile.php'); 
    exit; 
} else { 
    echo 'Wrong username'; 
} 

但可以有其他的问题,从代码中你没有张贴在这里R以外的原因。
事实上,只有调试才能告诉你什么是肯定的问题

+0

您是否想要消除'$ result2'?你的'fetch'仍然有'$ results2'而不是'$ results' – d2burke 2010-09-12 18:41:53

+0

谢谢。更正 – 2010-09-12 18:42:38

+0

好帖子,但我想知道为什么查询运行两次。你在原文中看到了什么会阻止它正确运行,除了你添加的错误和dup查询? – d2burke 2010-09-12 18:51:35

0

我看到您的代码只有两个选项 - 显示“错误的代码”或重定向到其他页面。没有地方你重定向到登录页面?

0

您需要在代码的其余部分之前通过sessions_start()启动会话。

+0

是的,如果您使用会话,则您需要在每个想要访问的页面上使用session_sart()。 – 2010-09-12 18:27:56

1

我会使用用户定义的函数,并使其检查登录凭据并从函数返回true或false。

你可以使用类似这样的东西。

function check_login ($username, $password) { 
      $query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '$username' AND `status`='Confirmed' "; 
      $result = mysql_query($query); 
      $row = mysql_fetch_array($result); 
     if(mysql_num_rows($result) == 0) { 
      return false; 
      } 
     if(mysql_num_rows($result) == 1) { 
      $_SESSION['loggedin'] = "true"; 
      header('location:profile.php?conf='.$row[0]); 
      return true; 
      } 
      } 

然后轻松地调用该函数并显示相应的消息。

检查下面的代码..

<?php 
    session_start(); 
    /** If the User is already Logged in then redirect to login.php **/ 
    if(isset($_SESSION['loggedin'])){ 
    header("Location: login.php"); 
    } 
    else { 
    if(check_login($_POST['username'], $_POST['password'])) { 
    header('location:profile.php?conf='.$row[0]); 
    } 
    } 

althoough的代码是不准确的,但是这可能是足以让你去。

+0

并记住如果您使用会话,则需要在每个页面上使用session_start()。 – 2010-09-12 18:35:10

0

如果您在配置文件页面上有任何一种“测试”脚本来重新指引您,如果您未登录,它可能是上面的代码会让你登录,但不会正确地将会话变量带到配置文件页面中,然后再次将用户发送回去登录。

确保使用变量在每个页面上正确启动会话,并确保它们两端都匹配。

0

你有两个主要问题:

  1. 您没有使用session_start告诉PHP开始跟踪您正在使用session_register会议
  2. session_register要求register_globals开启,希望它不在您的环境中。它也希望它的参数是一个字符串,它是你希望存储的变量的名字。您应该改用$_SESSION['uid'] = $row[0];

您还应该阅读关于SQL注入的问题,这是您的代码显示的一个非常严重和常见的安全漏洞。

这里是你的代码的修正版本:

<?php 
session_start(); //it's fine to just do this by habit at the top of every page 

$username = $_POST['username']; 

//I added mysql_real_escape_string - please read about "sql injection", as it is a very serious and common problem! 
$query = "SELECT `confirmcode` FROM `fb_network` WHERE `username` = '".mysql_real_escape_string($username)."' AND `status`='Confirmed' "; 

$result = mysql_query($query); 

if (mysql_num_rows($result) == 1) { 

    $result2 = mysql_query($query); 

    $row = mysql_fetch_row($result2); 

    $_SESSION['conf_code'] = $row[0]; 

    //not sure if this is what you weree going for or not 
    $_SESSION['uid'] = $row[0]; 

    header('location:profile.php?conf='.$row[0]); 

}  
else { 
    echo 'Wrong username'; 
} 
轮廓

然后。php,检查是否有人登录:

<?php 
session_start(); 

if(! isset($_SESSION['uid'])) 
    //Not logged in! 

if($_SESSION['uid'] != $_GET['conf']) 
    //trying to access someone else's page! 
+0

这是愚蠢的访问权限检查,你不觉得吗?应该没有GET使用。 – 2010-09-12 19:12:36

+0

我同意,但我想保持尽可能接近原始提交的代码。不能一下子教所有东西! – notJim 2010-09-12 19:20:54