[英]PHP/Mysql authentication script getting NULL result from query
我正在做一个测试项目,试图学习更多有关PHP和Mysql的知识,而不是其他知识。 因此,我决定为我的测试网站构建一个身份验证引擎,但是查询存在问题。
基本上,如果我跑步...
SELECT * FROM users WHERE name="tester" and passwd=md5('pass');
从mysql控制台,我得到...
+--------+---------------+----------------------------------+
| name | email | passwd |
+--------+---------------+----------------------------------+
| tester | test@test.com | 1a1dc91c907325c69271ddf0c944bc72 |
+--------+---------------+----------------------------------+
1 row in set (0.00 sec)
但是,当我从PHP代码中发出相同的查询(至少我认为是相同的)时(请参阅下文),我似乎得到了NULL结果,因此身份验证失败。
<?php
include 'db_connect.php';
$username = $_POST['username'];
$passwd = $_POST['passwd'];
// To protect MySQL injection (more detail about MySQL injection)
//$username = stripslashes($username);
//$passwd = stripslashes($passwd);
//$username = mysql_real_escape_string($username);
//$passwd = mysql_real_escape_string($passwd);
//Encrypted password
$secpasswd = md5($passwd);
$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";
$result=mysql_query($dbconnect,$sql);
var_dump($result);
// Mysql_num_row is counting table row
$count=mysql_num_rows($result);
//var_dump($count);
// If result matched $myusername and $mypassword, table row must be 1 row
if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("username");
session_register("passwd");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}
ob_end_flush();
?>
您的代码有很多问题。
这是必须的
<?php
include 'db_connect.php';
//Encrypted password
$secpasswd = sha512($_POST['passwd'].$_POST['username']);
$sql = "SELECT * FROM users WHERE name = ? and passwd = ?";
$stm = $pdo->prepare($sql);
$stm->execute(array($_POST['username'], $secpasswd));
$row = $stm->fetch();
if($row){
$_SESSION["username"] = $row[username];
header("location:login_success.php");
exit;
} else {
echo "Wrong Username or Password";
}
请注意,此代码使用PDO进行数据库交互
您的查询不相同:
SELECT ... passwd=md5('pass')
是不一样的
SELECT ... passwd=password_hash_here
在第一种情况下,mysql 知道您从md5调用返回了一个字符串。 在第二种情况下,您只是在查询中填充了一个空字符串,MySQL被强制视为字段名称(如果以字母字符开头)或无效数字(如果以数字开头)。
尝试
SELECT ...passwd='$password_hash'
代替。
正如肖恩在上面的评论中指出的那样,您需要将$ secpasswd括在单引号中。 所以
$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";
变
$sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd';";
但是我要回答的主要原因是让您知道您正在使用的mysql方法已被弃用。 您应该考虑使用mysqli或PDO代替。
马上,我注意到您的密码字符串没有用引号引起来。 尝试更改此:
$sql="SELECT * FROM users WHERE name='$username' and passwd = $secpasswd";
对此
$sql="SELECT * FROM users WHERE name='$username' and passwd = '$secpasswd'";
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.