2012-05-09 16 views
0

私は間違っていることを理解しようとしてきました。ユーザーがアクティブになってもユーザーが回線26でアクティブになっているかどうかを確認すると、ユーザーはユーザー名またはパスワードが間違っているが正しいことを知らせる回線38にユーザーを送ります。 2つの行はコードの左側にあります。ifとelse format? php

<?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 
    ?> 
+5

簡略化!シンプル化、シンプル化、シンプル化!ネストされたif-elsesの半ダースレベルを持つことは、単に複雑すぎるだけです。 – deceze

+1

私が見ている2つの問題は$ accounts ['password'] NOT $ accounts [パスワード](32行目)でなければなりません。$ query_count == 0、NOT $ query_count == null(22行目) –

+0

@jezternz 0はnullと同じではありませんか? – Ahatius

答えて

0

は、私はあなたが$accounts = mysql_fetch_array($query_accounts);

$アカウントに問題があると思うです

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

} 
1

右バット私に際立っている唯一のものは、キーは私の最高の推測にあなたのコードを見てPHPの定数、に変換されます

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

次の行でありますは定義されていません。次のように、キーを引用符で囲みます。

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

私はそれはあなたの問題を解決:)

+0

私はあなたに感謝していませんでしたが、それは私の問題で助けになりませんでした。とにかく与えられたコードの – Chris

+0

..データベースに接続するためのコードはありません...接続文字列はありません... –

+0

それでは、どういうエラーが発生していますか?リダイレクトされていないページにリダイレクトされていますか?あなたが私に症状を教えれば、細部の美しさ、私はあなたに問題を教えてあげます:) – Bryan

0

を無効(後藤ログイン)ヘッダを送信した後に死ぬことはないのに役立ちます願っていますか?

0

あなたの唯一の解決策は、簡素化することです!この:

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

がずっと良いように表現されています。代わりにちょうどdie INGの

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

... 

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

... 

echo 'Success!'; 

、あなたは、エラーを表示headerを使用してリダイレクトし、includeエラーページ、return機能または任意の他、あなたが必要とすることができますそれを行うには、は、その時点でロジックを停止します。正常な人間が理解できるような形になったら、問題は消えてしまいます。

0

私は表記

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

} 
else 
{ 
    ... 

} 

を使用しますが、簡単にelse部分がifビットと一致するものを識別することができます。

コードでこれを行うと、何がうまくいかないかを知ることができます。

1

は、いくつかの問題がありますが、あなたが使用する必要がインデックスとして、行と列が含まれている配列:

A)実際には1つしか一致しない場合、2つの異なる行が表示されることがあります。それぞれの "fetch"は2行です(行26 $ active = mysql_fetch_array($ query_accounts); $ accounts = mysql_fetch_array($ query_accounts) "ポインタを下に移動する行

b)変数のタイプを確認します。

i)が返す整数をはmysql_num_rowsが、あなたは

IIをゼロにするために比較している)も値0とNOT NULLまたは空白の文字列を返している[ 'アクティブ'] $行を確認してください。どちらの場合でもネガを確認するために、より安全な場合があります。

if (mysql_num_rows($result) > 0) { 

    if ($row['active']) { 
     // active state 
    } else { 
     // inactive state 
    } 
} else { 
    // Not found 
}