当密码的列类型为文本时,我的登录页就可以正常工作。我已经更新了表内容,并且习惯了密码上的sql密码函数,但是现在格式是varchar,页面将不进行身份验证。
以下是有关的守则:
<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);
}
?>发布于 2015-04-17 15:30:43
如MySQL文档中所示,BLOB和TEXT都是相关的。
11.4.3 BLOB和文本类型
如果未启用严格SQL模式,并且为超过该列最大长度的BLOB或TEXT列分配了一个值,则会截断该值以使其适合,并生成警告。对于非空格字符的截断,可以使用严格的SQL模式导致错误(而不是警告)并抑制值的插入。
这就解释了数据丢失的原因。
“那你就得重建你的哈希了”
我在这方面发现的另一个联系是:
从该页部分检索:
从MySQL 5.0.3开始,VARCHAR字段的最大字段长度从255个字符增加到65,535个字符。这是个好消息,因为VARCHAR字段(而不是文本字段)存储在MyISAM存储引擎的行中(InnoDB具有不同的特性)。文本和BLOB字段不存储在行中--如果它们的列包含在SELECT子句中,则需要单独查找(以及潜在的磁盘读取)。此外,在任何类型中包含文本或BLOB列将强制排序使用基于磁盘的临时表,这是用于临时表的内存(堆)存储引擎所要求的。 因此,对于255到65k字符的列,使用VARCHAR字段而不是文本的好处乍一看是显而易见的:对于包括列在内的查询(由于没有行外数据)和更少的写入(包括列在内的查询)和更少的写入(包括列在内的查询),这种好处是显而易见的。
https://stackoverflow.com/questions/29702114
复制相似问题