php - 简单的 PHP/MySQL 用户注册有效,但无法使用用户名登录

标签 php mysql

我正在开发一个简单的用户登录系统,以便在我自己的机器上练习。

我有一个带有用户名、密码和电子邮件的 mysql 表用户。我能够通过以下方式注册新用户:

//short variable names:

$email = $_POST['email'];
$username = $_POST['username'];
$password = $_POST['password'];
$password2 = $_POST['password2'];

session_start();

//attempt to register
register($username, $email, $password); 

我创建了这个函数来输入数据库,它使用以下函数工作:

 function register($username, $email, $password){
//register new person with db
//return true or error

//connect to db
$db = db_connect();

//check if username is unique
$result = $db->query("SELECT * from user where username = '".$username."'");
if(!$result){
    throw new Exception('Could not execute query');
}

if($result->num_rows>0){
    throw new Exception('That username is taken - go back and choose another one.');
}

//if ok, put in db
$result = $db->query("INSERT into user values
        ('".$username."', sha1('".$password."'), '".$email."')");

if(!$result){
    throw new Exception('Could not register you in database - Please try again later.');
}

return true;

然后我注册了变量

//register session variable
$_SESSION['valid_user'] = $username;

echo 'Your registration was successful. Go to the members page to start setting up your profile!';

当我尝试使用用户名和密码登录时,它不起作用这里是登录代码:

function login($username, $password){
//check username and password with db
$db = db_connect();

//check if username unique
$result = $db->query("SELECT * FROM user where username = '".$username."' and password = sha1('".$password."')");
if(!$result){
    throw new Exception('Could not log you in.');
}
if($result->num_rows > 0){
    return true;
} else {
    throw new Exception('Could not log you in.');
}
}

我知道这并不安全,它只是在我的机器上练习,这样我就可以升级,有人有任何解释吗?密码在数据库中注册为 sha1 varchar,我认为那是我做错的地方??

感谢帮助

最佳答案

问题很可能出在您对密码的 VARCHAR 定义中。 sha1 是 160 BIT 长。

无论如何,我不建议将密码存储在 VARCHAR 字段中,而是使用 BINARY(20)UNHEX 函数来转换 SHA1 值到二进制。

如果数据库中有大量记录(数千、数百万),binary(20) 比 varchar 或 char 占用的内存少得多。

将其更改为CHAR(40)

关于php - 简单的 PHP/MySQL 用户注册有效,但无法使用用户名登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15510607/

相关文章:

mysql - 位字段上的 group_concat() 在 Mysql 中返回垃圾

php - Codeigniter $this->db->insert_id() 在 mysqli 上返回 0 但 $this->db->query ('SELECT LAST_INSERT_ID()' ) 有效

Mysql - 序列化失败 : 1213 Deadlock found when try to get lock; try restarting transaction

MySQL 查询,仅在查询生命周期内存储一些计算数据

mysql - 计算一列中每一行的相同值

php - Codeigniter 从数据库记录中选择前一天

javascript - 没有互联网连接的推送器

php - PDO::exec 还是 PDO::execute?

php - 如何将 Base64 PNG 转换为 JPG 图像?

php - 如何检查电子邮件域是否是 php 中的 gmail,然后删除 "@gmail.*"?