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

mysqli ステートメントオブジェクトで既にfetch()1 回呼び出してから、条件で再度呼び出します。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結果をフェッチすると、フェッチする行が残っていないことに注意してくださいNULLif条件の結果を確認したい場合や、呼び出しの結果を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 に答える