0

私は自分が間違っていることを理解しようとしています。ユーザーがアクティブ化されている場合でも、ユーザーが26行目でアクティブ化されているかどうかを確認すると、38行目にユーザーが送信され、ユーザー名またはパスワードが間違っているが正しいことが通知されます。コードの左側に 2 行あります。

   <?php
      require("includes/inc.php");
      if ($_SESSION['username'] != null){
        # Redirect the user to the member area
        header('Location: member.php');
      } else {
        # Check if the user is trying to login
        if ($_GET['do'] == "login"){
          # If they are, process the details they have provided. Else, continue with showing the form
          $username = trim(sanitize($_POST['username']));
          $password = trim(sanitize($_POST['password']));
          # Check if the username and password are empty
          if (($username == null) || ($password == null)){
            header('Location: login.php?error=field_blank');
          } else {
            $query_accounts = mysql_query("SELECT * FROM users WHERE `username` = '$username' LIMIT 1");
            $query_count = mysql_num_rows($query_accounts);
            if ($query_count == null){
              // User not found
              header('Location: login.php?error=details_wrong');
            } else {
//Line 26          $active = mysql_fetch_array($query_accounts);
                if ($active['active'] == 0) {
                    header('Location: login.php?error=activate');
                } else {
                   $accounts = mysql_fetch_array($query_accounts);
                    // Check if the password matches the user's password
                     if ($accounts[password] == password($password)){
                    // The password is correct, start a session for the user
                        $_SESSION['username'] = $username;
                        header('Location: member.php');
                    } else {
                    // Incorrect password
//Line 38                   header('Location: login.php?error=details_wrong');
                }
              }
            }
          }
        } else {
    ?>
    <!doctype html>
    <html>
    <head>
    <title>PHP Login & Registration</title>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <link rel="stylesheet" type="text/css" href="css/style.css" />
    <div id="main">  
    <h1>Login</h1>
    </head>
    <body>
        Need a account? <a href="register.php">Register</a>
        <!-- Display Messages -->
        <?php
          # -> Messages
          if ($_GET['error'] == "field_blank"){ echo "<div class='error'>The username and/or password field was left blank</div>\n"; }
          elseif ($_GET['error'] == "details_wrong"){ echo "<div class='error'>The username and/or password was incorrect</div>\n"; }
          elseif ($_GET['error'] == "activate"){ echo "<div class='error'>Please activate your account.</div>\n"; }
          elseif ($_GET['success'] == "logout"){ echo "<div class='success'>You are now logged out</div>\n"; }
          elseif ($_GET['success'] == "complete"){ echo "<div class='success'>You are now registered, please activate your account by visiting your email.\n"; }
        ?>

          <!-- Login Form -->
          <form action="?do=login" method="post" autocomplete="on">
            <fieldset>
            <p>Username</p>
            <input type="text" name="username" size="40" maxlength="20" /> <br />
            <p>Password</p>
            <input type="password" name="password" size="40" maxlength="30" /> <br />
            <input type="submit" value="Login" style="width:80px;" />
            </fieldset>
        <?php include "footer.php"; ?>
          </form>
    </div>
    </body>
    </html>
    <?php
        } // End Check Login
      } // End check if logged in
    ?>
4

5 に答える 5

1

いくつかの問題があります:

a) 行を 2 回取得します (26 行目 $active = mysql_fetch_array($query_accounts); と、$accounts = mysql_fetch_array($query_accounts); のすぐ下)。 「フェッチ」はポインタを行の下に移動します

b) 変数の型を確認します。

i) mysql_num_rows は整数を返しますが、null と比較しています

ii) $row['active'] が文字列 null または空白ではなく、値 0 を返していることも確認してください。どちらの場合もネガをチェックする方が安全かもしれません。

if (mysql_num_rows($result) > 0) {

    if ($row['active']) {
        // active state
    } else {
        // inactive state
    }
} else {
    // Not found
}
于 2012-05-09T04:17:18.857 に答える
1

すぐに私に際立っている唯一のものは、次の行です

                 if ($accounts[password] == password($password)){

キーは PHP 定数に変換されますが、あなたのコードを見る限り、定義されていません。次のように、キーを引用符で囲みます。

                 if ($accounts["password"] == password($password)){

問題の解決に役立つことを願っています:)

于 2012-05-09T04:04:47.747 に答える
0

表記を使っています

if (...)
{
   if (...)
   {
      ...
   }
   else
   {
      ...
   }

}
else
{
   ...   

}

elseこれにより、どの部分がビットと一致するかを簡単に特定できifます。

コードでこれを行うと、何が問題なのかを見つけることができます。

于 2012-05-09T04:14:56.803 に答える
0

あなたに問題があると思います$accounts = mysql_fetch_array($query_accounts);

$accounts は、使用する必要があるインデックスとして行と列を含む配列です

while($accounts = mysql_fetch_array($query_accounts))
{

}
于 2012-05-09T04:17:00.060 に答える
0

あなたの唯一の解決策は単純化することです!これ:

if (...) {
    if (...) {
        if (...) {
            ...
        }
    } else {
        ...
    }
    ...
} else {
    ...
}

次のように表現する方がはるかに適切です。

if ($someImportantCondition == false) {
    die('Important condition not met');
}

...

if ($someOtherImportantCondition == false) {
   die('Some other important condition not met');
}

...

echo 'Success!';

単にdieing する代わりに、エラーを表示したり、 を使用してリダイレクトしheaderたり、includeエラーページを関数からリダイレクトしたり、その時点でロジックを停止するreturn必要があるその他のことを行うことができます。その流れを普通の人間が理解できる形にすれば、問題は解決します。

于 2012-05-09T04:09:51.797 に答える