0

出于某种原因,我一直尝试登录并不断收到错误消息,即用户名和密码无效。我已经尝试在编码中设置密码而不是使用 post 方法。有人有什么想法吗?

另外,我知道 md5 已经不行了,但是现在 idc 关于这一点,一旦我的所有功能完成,我将切换到 SHA-2,稍后我会对其进行加盐和哈希处理。

<?php
include_once"dbconnection.php";
session_start();
$mysqli = new mysqli($host, $username, $password, $database);
if(isset($_POST['login'])){
        if ($stmt = $mysqli->prepare("SELECT email, password FROM users WHERE email=? AND password=? LIMIT 1")) 
        {
            $email = $_POST['email'];
            $password = md5($_POST['password']);
            $stmt->bind_param('ss', $email, $password);
            $stmt->execute();
            $stmt->bind_result($email, $password);
            $stmt->fetch();
            if($stmt->fetch() == true)
            {
                $_SESSION['Logged'] = 1;
                $_SESSION['Email'] = $email;
                header('Location: blogzone.php');
                exit();
            } else {
                echo "Wrong Username or Password!";
            }
            $stmt->close(); 
        }
        else 
        {   

        }
    }
$mysqli->close();
?>

我的 HTML

<form action="login.php" method="post" name="login">
   <input type="text" name="email" /><br />
   <input type="password" name="password" id="password"/><br />
   <input type="submit" value="Login" name="login" />
</form>
4

3 回答 3

1

您已经fetch()mysqli 语句if对象上调用过一次,然后在您的条件下再次调用它。

        $stmt->fetch();            // <---- Notice you already fetched the result
        if($stmt->fetch() == true) // <---- This is your problem right here
        {
            /* ... */
        } else {
            echo "Wrong Username or Password!";
        }

请注意,一旦您获取结果,就没有更多的行要获取,然后mysqli_stmt::fetch将返回NULL。如果您想检查if条件中的结果或将调用结果存储mysqli_stmt::fetch在变量中并改为检查,请不要在第一次获取它。

于 2013-01-03T02:37:28.413 回答
1

我认为问题是没有获取所需的参数。试试这个代码(未经测试)

<?php
include_once"dbconnection.php";
session_start();
$mysqli = new mysqli($host, $username, $password, $database);
if(isset($_POST['login'])){
        $stmt = $mysqli->prepare("SELECT email, password FROM users WHERE email=? AND  password=? LIMIT 1");
        $email = $_POST['email'];
        $password = md5($_POST['password']);
        $stmt->bind_param('ss', $email, $password);
        $stmt->execute();
        $stmt->bind_result($email, $password);
        $stmt->store_result();
        if($stmt->num_rows == 1)  //To check if the row exists
            {
                while($stmt->fetch()) //fetching the contents of the row

                  {$_SESSION['Logged'] = 1;
                   $_SESSION['Email'] = $email;
                   header('Location: blogzone.php');
                   exit();
                   }

            }
            else {
                echo "Wrong Username or Password!";
            }
            $stmt->close();
            $stmt->free_result();
        }
        else 
        {   

        }
$mysqli->close();
?>
于 2013-01-03T02:58:22.373 回答
0

我不知道你是否得到了答案,但试试这个:

打印出他们在登录表单(不是来自数据库)中插入的用户密码的散列版本,并查看它们是否匹配。

echo md5($_POST['password']);

它可能有助于确定。假设数据库中的匹配但最后缺少字符串,您就会知道您没有将 varchar 设置为足够大以容纳数据库中的行。

于 2013-05-25T05:57:00.250 回答