2016-01-22 29 views
0

當前正在嘗試爲學校做一個項目,就php而言,代碼是好的。當我運行它時,我輸入用戶名和密碼並單擊提交按鈕,但似乎沒有發生任何事情,我仍然在登錄頁面上。PHP登錄屏幕不會移動到下一頁

<?php 
session_start(); 
try{ 
    $databaseConnection = new PDO('mysql:host=127.0.0.1;dbname=mycontacts','root',''); 
    $databaseConnection->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION); 
} catch(PDOException $e) { 
    echo 'Error: '.$e->getMessage(); 
} 
if(isset($_POST['login'])) { 
    $errMsg = ''; 
    $username = trim($_POST['username']); 
    $password = trim($_POST['password']); 

    if ($username == ''){ 
     $errMsg .= "You must enter your Username <br />"; 
    } 
    if($password == '') { 
     $errMsg .= 'You must enter your Password<br>'; 
    } 
    if ($errMsg == '') { 
     $records = $databaseConnection->prepare('SELECT id,username,password from users WHERE username = :username'); 
     $records->bindParam(':username',$username); 
     $records->execute(); 
     $results = $records->fetch(PDO::FETCH_ASSOC); 
     if(count($results) > 0 && password_verify($password, $results['password'])){ 
      header('location:mainMenu.php'); 
      exit(); 
     }else { 
      $errMsg .= 'Username and Password are not found<br />'; 
     } 
    } 
} 
?> 


<!DOCTYPE html> 
<html lang="en"> 
<head> 
    <meta charset="UTF-8"> 
    <title>Login</title> 
    <link rel="stylesheet" href="CSS/main.css"> 
</head> 
<body> 
    <h1>Welcome to the Contact List</h1> 
    <br /> 
    <br /> 
    <div> 
    <form method="post" class="submit" name="login"> 
     <h3><u>Please login</u></h3> 
     <p>Username: <input type="text" name="username" maxlength="15" size="20" /> </p> 
     <p>Password: <input type="text" name="password" maxlength="15" size="20" /> </p> 
     <input type="submit" value="Submit" name="login" /> 
    </form> 
    </div> 
</body> 
</html> 

數據庫名稱是mycontacts 表名是用戶 中的字段ID(主),用戶名,密碼

當用戶名和密碼推杆,屏幕將保持在與登錄文本框中沒有任何內容,查詢時也沒有任何錯誤。

+2

你沒有'形式action' http://www.w3schools.com/tags/att_form_action.asp – Kisaragi

+0

可能在標題之前輸出。檢查錯誤http://php.net/manual/en/function.error-reporting.php –

+2

@Kisaragi行動默認爲自我,如果沒有給出和OP有它的條件語句,所以這不是問題在這裏。 –

回答

4

「ID INT(4)用戶名VARCHAR(20)密碼VARCHAR(20)」

有你的問題。 (也請參閱我的腳註)。

由於密碼列的長度不足以容納哈希,因此MySQL在您身上失敗了。

password_hash()函數產生的散列長度爲60個字符,即IF您確實使用該函數創建了散列。

將它增加到60並重新開始(注意:手冊建議255雖然)。意思是,清除你的密碼,生成新密碼並重新登錄。

  • http://php.net/manual/en/function.password-hash.php

    PASSWORD_DEFAULT - 使用bcrypt算法(默認爲PHP 5.5.0的)。請注意,隨着新的更強大的算法添加到PHP中,此常量將隨時間而改變。出於這個原因,使用這個標識符的結果的長度會隨着時間而改變。因此,建議將結果存儲在數據庫列中,該列可以擴展超過60個字符(255個字符將是一個不錯的選擇)。

PASSWORD_BCRYPT - 使用CRYPT_BLOWFISH算法創建哈希。這將使用「$ 2y $」標識符產生標準的crypt()兼容散列。結果將始終爲60字符串,或失敗時爲FALSE。


腳註:

另外,還要確保你沒有頭之前輸出。 <?php標記之前的空格將導致該問題,並阻止您的代碼執行,並且對於其他任何後續文件(例如用於標題的文件)應該如此。因此,您需要刪除<?php標籤之前的空間。

請教關於堆棧以下幾點:

添加error reporting到您的文件(S)的頂部,這將有助於找到錯誤。

<?php 
error_reporting(E_ALL); 
ini_set('display_errors', 1); 

// Then the rest of your code 

旁註:顯示錯誤應該只在分期完成,並且從不生產。


正如評論指出:你不呼應$errMsg,雖然不會導致你的代碼不是重定向或正確執行。

如果您使用的是未顯示的JS/Ajax,那麼您需要將其排除。

您的表單和提交按鈕也有重複的名稱屬性name="login"。從<form>刪除name="login",這可能是衝突。

你也可以看看ircmaxell的回答是:

+0

而且他不是私人的'$ errMsg。='用戶名和密碼中的錯誤msg'$ errMsg'未找到
';'。 –

+0

@ViníciusFagundes我會做到這一點。現在在電話裏大聲笑 –