mysqli准备好的声明不会登录

时间:2013-01-03 02:24:49

标签: php html login mysqli

由于某种原因,我一直试图登录并继续收到我的错误,用户名和密码无效。我已经尝试在编码中设置密码而不是使用post方法。有人有任何想法吗?

另外,我知道md5不再是好的了,但是现在就说明了这个问题,一旦我的所有功能完成,我将切换到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>

3 个答案:

答案 0 :(得分:1)

您已经在 mysqli语句对象上调用fetch()一次,然后在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中将调用结果存储在变量中,请不要第一次获取它,而是检查一下。

答案 1 :(得分: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();
?>

答案 2 :(得分:0)

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

打印出他们在登录表单中插入的用户密码的哈希版本(不是从数据库中),看看它们是否匹配。

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

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

相关问题