2015-10-24 56 views
1

我正在创建登录表单,个人档案页面和注销,但是当我在页面上收到错误的用户名消息并单击x按钮时,它不会关闭。另外,当我只添加用户名并单击登录按钮时,页面将变为空白。有人能帮助我找出这里的歪斜吗?使用PHP和MySQL项目构建登录页面

<?php 

     /* 
      STEPS WE NEED TO TAKE... 

      1. Build Login HTML form 
      2. Check if form has been submitted 
      3. Validate form data 
      4. Add form data to variables 
      5. Connect to database 
      6. Query the database for username submitted 
      6.1 If no entries: show error message 
      7. Store basic user data from database in variables 
      8. Verify stored hashed password with the one submitted in the form 
      8.1 If invalid: show error message 
      9. Start a session & create session variables 
      10. Redirect to a "profile page" 
      10.1 Provide link to "logout" page 
      10.2 Add cookie clear to logout page 
      10.3 Provide link to log back in 
      11. Close the MySQL connection 
     */ 

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

      // build a function to validate data 
      function validateFormData($formData) { 
       $formData = trim(stripslashes(htmlspecialchars($formData))); 
       return $formData; 
      } 

      // create variables 
      // wrap the data with our function 
      $formUser = validateFormData($_POST['username']); 
      $formPass = validateFormData($_POST['password']); 

      // connect to database 
      include('connection.php'); 

      // create SQL query 
      $query = "SELECT username, email, password FROM users WHERE username='$formUser'"; 
      //store the result 
      $result = mysqli_query($conn, $query); 

      // verify if result is returned 
      if(mysqli_num_rows($result) > 0) { 

       // store basic user data in variables 
       while($row - mysqli_fetch_assoc($result)) { 
        $user = $row['username']; 
        $email = $row['email']; 
        $hashedPass = $row['password']; 
       } 

       // verify hashed password with the typed password 
       if(password_verify($formPass, $hashedPass)) { 

        // correct login details! 
        // start the session 
        session_start(); 

        // store data in SESSION variable 
        $_SESSION['loggedInUser'] = $user; 
        $_SESSION['loggedInEmail'] = $email; 

        header("Location: profile.php"); 
       } else { // hashed password didn't verify 

        // error message 
        $loginError = "<div class='alert alert-danger'>Wrong username/password combination. Please try again.</div>"; 

       } 
      } else { // there are no results in database 

       $loginError = "<div class='alert alert-danger'>No such user in database. Please try again. <a class='close' data-dismiss='alert'>&times;</a></div>"; 

      } 

      // close the mysql connection 
      mysqli_close($conn); 
     } 

    ?> 

    <!DOCTYPE html> 

    <html> 

     <head> 

      <meta charset="utf-8"> 
      <meta http-equiv="X-UA-Compatible" content="IE=edge"> 
      <meta name="viewport" content="width=device-width, initial-scale=1"> 

      <title>Login</title> 

      <!--Bootstrap CSS--> 
      <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css"> 

       <!--HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries--> 
      <!--WARNING: Respond.js doesn't work if you view the page via file://--> 
      <!--[if lt IE 9]> 
       <script src="https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script> 
       <script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script> 
       <![endif]--> 
     </head> 

     <body> 
      <div class="container"> 
       <h1>Login</h1> 
       <p class="lead">Use this form to log into your account</p> 
       <?php echo $loginError; ?> 

       <form class="form-inline" action="<?php echo htmlspecialchars($_SERVER['PHP_SELF']); ?>" method="post"> 
        <div class="form-group"> 
         <label for="login-username" class="sr-only">Username</label> 
         <input type="text" class="form-control" id="login-username" placeholder="username" name="username"> 
        </div> 
         <div class="form-group"> 
         <label for="login-password" class="sr-only">Password</label> 
         <input type="password" class="form-control" id="login-password" placeholder="password" name="password"> 
        </div> 
        <button type="submit" class="btn btn-default" name="login">Login!</button> 

       </form> 

      </div> 


    <!--Bootstrap JS--> 
      <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>  
     </body> 
    </html> 
+0

问题是数据库中是否存在散列密码以及列的类型是否正确和足够长以容纳散列。 10次​​中有9次,这就是问题所在。发布数据库模式将在这里将猜测放在它之外。 –

+0

Fred,我的数据库密码的varchar设置为255.到目前为止,还没有现有的散列密码。我正在尝试创建一个登录页面来在数据库中创建一个。 –

+0

那你去那吧。没有密码,没有登录。用'password_hash()'创建一个。 –

回答

0

“弗雷德,在我的数据库密码的VARCHAR被设置为255没有现有的哈希密码的呢。我试图创建一个登录页面创建一个在数据库中。 - 丹尼尔科尔特斯“

问题是,没有在您的数据库中进行比较散列密码。

您将需要使用password_hash()函数创建一个。

旁注:

使用stripslashes(htmlspecialchars不防范SQL注入。这是最好用事先准备好的声明

+0

@DanielCortes不客气Daniel,* cheers * –

+0

使用准备好的声明真的是“最好的”吗? 'filter_var'&sanitizing是否符合您的规模? – David

+0

@David是的,涉及到数据库。看看他们的'validateFormData()'函数。这对于防止SQL注入没有太大作用。我写的关于这个的东西,与'filter_var'没有任何关系,完全是两个不同的动物。 –

0

也是你的警报没有消失,因为引导依赖于jQuery的lib和你没有导入它。

+0

谢谢jarguez,现在它的功能正在发生变化,新的挑战是我创建的地址簿不会添加新的客户端。 –