繁体   English   中英

PHP / Mysql身份验证脚本从查询获取NULL结果

[英]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();
?>

您的代码有很多问题。

  • 您的SQL查询格式错误
  • 您实际上并没有从查询结果中获取任何值
  • 你的哈希很弱
  • 您没有使用准备好的语句
  • 您正在使用过时的会话功能

这是必须的

<?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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM