2015-09-01 304 views
1

我是一名PHP新手,我使用了一个简单的登录表单,其中包含源代码。代码正在工作,但它不会将我重定向到主页,而是保持在登录页面中。下面是验证码,负责重定向,如果用户输入正确的凭据:在php登录后重定向页面

ob_start(); 
session_start(); 
$error=''; 
if(isset($_POST['submit'])){ 
if(empty($_POST['username']) || empty($_POST['password'])){ 
    $error="Username or Password is invalid"; 
} 
else{ 
    $username=$_POST['username']; 
    $password=$_POST['password']; 

    $cxn=mysql_connect("localhost","root","admin"); 
    $username=stripslashes($username); 
    $password=stripslashes($password); 
    $username=mysql_real_escape_string($username); 
    $password=mysql_real_escape_string($password); 

    $db=mysql_select_db("hrdb",$cxn); 
    $query=mysql_query("select * from login where Username='$username' AND 
    Password='$password'",$cxn); 

    $rows=mysql_num_rows($query); 
    if($rows==1){ 
     $_SESSION['log_user']=$username; 
     echo "test"; 
     header('Location: http://localhost/HRMS/profile.php'); 
     exit; 
    }else{ 
     $error="Username or password is invalid"; 
    } 
    mysql_close($cxn); 
    } 
    } 
    ob_end_flush(); 
+0

既然你刚刚开始,那么告诉你不要使用任何'mysql_'函数的好时机。您将希望使用'mysqli_'或'PDO'来进行数据库连接。 – Rasclatt

+0

我尝试将每个mysql替换为mysqli,但我有许多像mysqli这样的错误期望成为资源,但字符串被给予,因此我将它还原回到mysql,但是如果您可以重新编码它以适合mysqli,那么它就好。 –

+0

如果你正在练习,这个脚本是好的,但为了实际使用,这不是一个好的脚本。 – Rasclatt

回答

0

您可以使用header()函数来发送新的HTTP头,但是这必须在任何发送到浏览器HTML或文本(例如在声明之前)。

您可能希望header电话后,包括die

header("Location: http://localhost/HRMS/profile.php"); 
die(); 
+0

发生的事件一直停留在同一页面上。 –

+0

@NewbieN在将任何输出发送到浏览器之前,您需要执行此操作。 –

0

我会建议你使用的mysqli替代MySQL和 也有细微的变化,请仔细检查它 和测试工作的代码现在好了。

ob_start(); 
    session_start(); 
    $error=''; 


    if(isset($_POST['submit'])){ 
     if(empty($_POST['username']) || empty($_POST['password'])){ 
      $error="Username or Password is invalid"; 
     } 
     else{ 
      $username=$_POST['username']; 
      $password= md5($_POST['password']); 

      $cxn= mysqli_connect("localhost","root","","hrdb"); 
      $username=stripslashes($username); 
      $password=stripslashes($password); 
      $username=mysqli_real_escape_string($cxn,$username);; 
      $password=mysqli_real_escape_string($cxn,$password);; 

      $query=mysqli_query($cxn,"select * from user_mst_tbl where USER_NAME='".$username."' AND 
      PASS_WORD='".$password."'"); 

      $rows=mysqli_num_rows($query); 
      if($rows==1){ 
       $_SESSION['log_user']=$username; 
       echo "test"; 
       header('Location: http://localhost/HRMS/profile.php'); 

      }else{ 
       $error="Username or password is invalid"; 
      } 
      mysql_close($cxn); 
     } 
    } 
    ob_end_flush(); 
+0

我试过你的代码,但我收到以下错误:警告:mysqli_real_escape_string()期望正好2个参数,1给出 –

+0

这是因为该示例仍在使用该部分中的mysql_' – Rasclatt

+1

应该是$ $ = mysqli_real_escape_string($ cxn ,$用户名);'。与'$ password'一样。 –

0

您收到的错误:

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

因为你已经安装了XAMPP更高版本。

您需要考虑使用prepared statement而不是deprecatedmysql_* API。在您的查询中使用它之前,您不需要清理每个变量,因为准备好的语句将为您执行。

如果您打算使用PHP的功能header(),请确保在调用header()之前没有任何输出。

还请检查您的profile.php,如果它也有header()调用,它会将页面重定向回登录页面。

<?php 

/* MAKE SURE THAT THERE ARE NO HTML/OUTPUTS ABOVE THIS CODE */ 

ob_start(); 
session_start(); 
$error = ""; 

/* ESTABLISH CONNECTION */ 
$con = new mysqli("localhost", "root", "admin", "hrdb"); 

/* CHECK CONNECTION */ 
if (mysqli_connect_errno()) { 
    printf("Connect failed: %s\n", mysqli_connect_error()); 
    exit(); 
} 

if(isset($_POST['submit'])){ 

    if(empty($_POST['username']) || empty($_POST['password'])){ 
    $error="Username or Password is invalid"; 
    } 
    else{ 

    if($stmt = $con->prepare("SELECT Username FROM login WHERE Username = ? AND Password = ?")){ /* CHECK AND PREPARE THE QUERY */ 
     $stmt->bind_param("ss",$_POST["username"],$_POST["password"]); /* BIND THESE VARIABLES TO YOUR PREPARED QUERY; s STANDS FOR STRINGS */ 
     $stmt->execute(); /* EXECUTE THE QUERY */ 
     $rows = $stmt->num_rows; /* GET NUMBER OF ROWS/RESULTS */ 
     if($rows == 1){ /* IF FOUND RESULT */ 
     $stmt->bind_result($username); /* STORE THE RESULT TO THIS VARIABLE */ 
     $stmt->fetch(); /* FETCH THE RESULT */ 
     $_SESSION['log_user'] = $username; /* STORE THE RESULT TO THIS SESSION VARIABLE */ 
     /* header('LOCATION: http://localhost/HRMS/profile.php'); REDIRECT THE PAGE TO profile.php */ 
     ?> 
      <meta http-equiv="refresh" content=".5; URL='profile.php'"/> <!-- REDIRECT TO profile.php IN HALF A SECOND --> 
     <?php 
     } 
     else { 
     $error="Username or password is invalid"; 
     } 
     $stmt->close(); 
    } /* END OF PREPARED STATEMENT */ 

    } /* END OF ELSE */ 

} /* END OF ISSET SUBMIT */ 

ob_end_flush(); 

?> 

您还应该保护存储在数据库中的密码。您可以使用password_hash()

+0

我试了代码是的,我没有得到任何错误,但即使我输入了正确的用户名和密码,当我的用户名和密码是简单的admin和minda连续时,它仍然提示我无效的用户名或密码。 –

+0

@NewbieN - 你登录表的列是'Username'和'Password',对吧?我已经更新了我的答案,并把'username'而不是'username' - * CASE SENSITIVE * –

+0

我检查了profile.php,但它只包含“include('session.php')” –