2015-04-17 58 views
3

我的登錄頁面在用於密碼的列類型爲TEXT時用於正常工作。 我已經更新了表內容,並用於密碼上的sql密碼功能,但現在格式爲varchar,頁面將不會進行身份驗證。下面當sql列類型從TEXT更改爲varchar時,無法登錄到php頁面

是有問題的代碼:

<main> 
      <?php 
       if(isset($_POST['submit'])){ 
        include 'databaselogin.php'; 

        $username = ucfirst(strtolower($_POST['username'])); 
        $username = mysqli_real_escape_string($mysqli, $username); 
        $password = $_POST['password']; 

        $sql = "SELECT * 
          FROM teams 
          WHERE name = '$username'"; 
        $result = $mysqli->query($sql) or die($mysqli->error.__LINE__); 

        if($result->num_rows == 1){ 
         $row = $result->fetch_assoc(); 
         $hash = $row["password"]; 

         if(password_verify($password,$hash)){ 
          session_start(); 
          $_SESSION["username"] = $row["name"]; 

          header("Location: http://www.josephade.com/fyp/dashboard.php"); 
          die(); 
         } 
        }else{ 
         //Show error incorrect password 
         include 'error.php'; 
        } 

        mysqli_close($mysqli); 
       } 
      ?> 
+1

更改它時,列中的散列值是否發生了變化? TEXT的長度和VARCHAR一樣長,足夠長嗎? –

+0

確保列內容未被截斷 –

+0

@ Fred-ii-文本沒有長度,但我確定使用的VARCHAR長度足夠長。 –

回答

4

隨着MySQL的文檔中發現BLOBTEXT這兩者都是相關的。

11.4.3 BLOB和TEXT類型

如果嚴格的SQL模式不啓用,您分配一個值到超過一個BLOB或TEXT列列的最大長度,該值被截斷以適應並生成警告。要截斷非空格字符,可以導致發生錯誤(而不是警告),並通過嚴格的SQL模式禁止插入值。

這將解釋數據丟失。

  • 因此,總共重建需要從文本到去VARCHAR,在我的評論中提到:

「你可能必須重建你的哈希值,然後」


我發現在這方面的另一個鏈接:

從該頁面檢索部分:

與MySQL 5.0.3開始,爲VARCHAR字段的最大字段長度從255個字符增加到65,535個字符。這是個好消息,因爲與TEXT字段相反,VARCHAR字段存儲在MyISAM存儲引擎的行內(InnoDB具有不同的特性)。 TEXT和BLOB字段不是按行存儲的 - 如果它們的列包含在SELECT子句中,它們需要單獨查找(並且可能讀取磁盤)。此外,以任何順序包含TEXT或BLOB列都將強制排序使用基於磁盤的臨時表,因爲用於臨時表的MEMORY(HEAP)存儲引擎需要使用該表。

因此,對於255到65k字符之間的列,使用VARCHAR字段而不是TEXT的好處看起來很明顯,在某些情況下乍一看:可能更少的磁盤讀取(對於查詢,包括列,因爲沒有超出-row數據)和更少的寫入(對於包括該列的排序的查詢)。