我做了一个注册表和一个登录表。
我先使用trim()
然后md5()
将密码存储在数据库中。
我使用相同的方法在登录表单中检查数据库中的密码,但由于某些未知原因,我无法匹配登录表单中的md5密码。
我想要的只是从数据库中检索密码。
问题是当我将它存储在数据库中并在php myadmin中检查时,md5密码类似于123456789
,当我在登录表单中回显它时它给了我1234567890
。最后零为零创建问题,否则整个md5密码匹配。我的数据库排序规则是latin_1_swedish_ci
。
有任何整理问题吗?
我使用varchar值255然后文本等但没有解决方案。
格式或结构有问题吗?
请帮我正确检索md5密码,消除不必要的零。
function login()
{
if(isset($_POST['login']))
{
if(!$_POST['username'] || !$_POST['password'])
{die (mysql_error());}
else
{
$username = trim($_POST['username']);
$username = addslashes($_POST['username']);
$password = trim($_POST['password']);
$password = md5($_POST['password']);
echo $password;
$check_username = mysql_query("SELECT * FROM users WHERE username = '".$username."'")or die(mysql_error());
$check_username2 = mysql_num_rows($check_username);
if ($check_username2 == 0)
{die ("Username and password doesnt exist");}
else
{
$check_pass = mysql_query("SELECT * FROM users WHERE username = '".$password."'")or die(mysql_error());
$check_pass2 = mysql_num_rows($check_pass);
echo $check_pass2;
}
}
}
}
和
function register()
{
if(isset($_POST['submit']))
{
if(!$_POST['first_name'] || !$_POST['last_name'] || !$_POST['username'] || !$_POST['password'])
{header ("Location:user_registration.php");}
else
{
$firstname = trim($_POST['first_name']);
$firstname = addslashes($_POST['first_name']);
$lastname = trim($_POST['last_name']);
$lastname = addslashes($_POST['last_name']);
$username = trim($_POST['username']);
$username = addslashes($_POST['username']);
$password = trim($_POST['password']);
$password = md5($_POST['password']);
connect();
if($mysql_check_user = mysql_query("SELECT * FROM `users` WHERE `username` LIKE '$username' "))
{
$check_row = mysql_num_rows($mysql_check_user);
if($check_row > 0)
die ("username Exist");
else
{
$store = mysql_query
("INSERT INTO `project_upload`.`users`
(`id`, `fname`, `lname`, `username`, `password`)
VALUES (NULL, '$firstname', '$lastname', '$username', '$password')");
}
if ($store)
{echo "You have regstered succesfully. please go to <a href = 'uploads_login.php'>login page</a>"; }
else {echo mysql_error();}
}
}
}
}
答案 0 :(得分:4)
您遇到的问题是,您在登录代码的开头有一些类似于:echo $password;
的内容,以及之后的几行代表echo $check_pass_2;
在浏览器的字符串中看起来像0后来。这是因为$check_pass_2
只计算了从mysql查询返回的行数,这是0,因为没有用户使用与密码相同的用户名。所以你真正的问题是mysql查询,它检查是否有用户使用与用户输入的密码相同的用户名,这很奇怪。尝试将login.php中的上一个查询更改为:
$check_pass = mysql_query("SELECT * FROM users WHERE password = '".$password."'")
or die(mysql_error());
请注意,username = '".$password."'
已更改为password = '".$password."'
。
其次,你应该明白,如果你做了类似的事情:
$pass = trim($_POST['pass']);
$pass = md5($_POST['pass']);
然后$ pass变量只是md5'd而没有修剪效果,为此你应该这样做:
$pass = trim($_POST['pass']);
$pass = md5($pass);
但是你不应该修剪你的密码,因为这只是奇怪和不方便,它并没有真正添加任何东西。
执行此操作的行:
if($mysql_check_user
= mysql_query("SELECT * FROM `users` WHERE `username` LIKE '$username' "))
if-statement是superfluos,因为你只是在做一个赋值,你可以删除if,只是让变量原样。即:
$mysql_check_user = mysql_query("SELECT * FROM `users` WHERE `username` LIKE '$username'");
此外,尝试在编码时保留某种样式,这样可以更容易地阅读代码。大多数代码编辑器默认都有此功能,也许您需要在每个换行符上按TAB才能正确缩进,这是一个巨大的帮助,尽管如此。它的外观示例:
function register()
{
if(isset($_POST['submit']))
{
if(!$_POST['first_name'] ||
!$_POST['last_name'] ||
!$_POST['username'] ||
!$_POST['password'])
header ("Location:user_registration.php");
else
{
$firstname = trim($_POST['first_name']);
$firstname = addslashes($_POST['first_name']);
$lastname = trim($_POST['last_name']);
$lastname = addslashes($_POST['last_name']);
$username = trim($_POST['username']);
$username = addslashes($_POST['username']);
$password = trim($_POST['password']);
$password = md5($_POST['password']);
connect();
if($mysql_check_user = mysql_query("SELECT * FROM `users` WHERE `username` LIKE '$username' "))
{
$check_row = mysql_num_rows($mysql_check_user);
if($check_row > 0)
die ("username Exist");
else
{
$store = mysql_query
("INSERT INTO `project_upload`.`users`
(`id`, `fname`, `lname`, `username`, `password`)
VALUES (NULL, '$firstname', '$lastname', '$username', '$password')");
}
if ($store)
echo "You have regstered succesfully. please go to <a href = 'uploads_login.php'>login page</a>";
else
echo mysql_error();
}
}
}
}
答案 1 :(得分:2)
实际上没有解密MD5字符的选项。如果要进行比较,必须将输入转换为MD5字符串,然后可以轻松地与db中的存储值进行比较。