-6

したがって、ログインしてパスワードが正しい場合は常に、パスワードが正しくないと表示されます。これをどのように修正しますか

<?php
session_start();
require "php/dbc.php";

$username     = mysql_real_escape_string($_POST['username']);
$password     = mysql_real_escape_string($_POST['password']);
$enc_password = md5($password);

if ($username && $password) {
    $query  = mysql_query("SELECT * FROM login WHERE username='$username'");
    $numrow = mysql_num_rows($query);
    if ($numrow != 0) {
        while ($row = mysql_fetch_assoc($query)) {
            $db_username  = $row['username'];
            $enc_password = $row['password'];
        }
        if ($username == $db_username && $enc_password == $db_password) {
            //echo "Logged in <a href='members.php'>Click here to enter the members area</a>";
            $_SESSION['username'] = $db_username;
            header("location: members.php");
        } else {
            header("location: top_nav.html?error=Incorrect Password");
        }
    } else {
        header("location: top_nav.html?error=That user doesn't exist");
    }
} else {
    header("location: top_nav.html?error=All fields are required");
}
?>
4

1 に答える 1

2

エラーは、データベースに保存されたパスワードを取得してテストする方法にあります。

while ($row = mysql_fetch_assoc($query)){
    $db_username = $row['username'];
    $enc_password = $row['password']; // this should probably be $db_password
}
if ($username == $db_username && $enc_password == $db_password){ 
// this condition will be false as $db_password is null, 
// and so not equal to $enc_password which is currently set to the database value

あなたのアプローチは少し回り道です。通常、後でテストするためにデータベースからパスワードをロードするのではなく、ユーザー名と暗号化された着信パスワードを照会します。

また、mysql ライブラリの PHP マニュアル ページにある大きな赤いボックスにも注意を払う必要があります。

この拡張モジュールは PHP 5.5.0 で非推奨になり、将来的に削除される予定です。代わりに、MySQLi または PDO_MySQL 拡張機能を使用する必要があります。詳細については、MySQL: API ガイドの選択および関連する FAQ も参照してください。この機能の代替手段は次のとおりです。

mysqli_connect()

PDO::__construct()

以下のコメントで述べたように、PDO と準備されたクエリを利用する必要があります。

于 2012-12-21T00:59:22.060 に答える