2014-04-25 73 views
-2

所以,我試圖讓非常基本登錄使用PHP:PHP - 基本登錄檢查?

<?php 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $users = array("Billy", "Bob"); 
    $passes = array("billy123", "pass1234"); 

    for ($i = 0; $i < count($users); $i++) { 
     $user = $i; 
     if ($username === $users[$i]) { 
      if ($password === $passes[$user]) { 
       echo "Logged in as " .$users[$user]; 
      } 
     } 
     else if ($username !== $users[$i] && $password !== $passes[$i]) { 
      echo "Login failed"; 
     } 
    } 
?> 

我不能發佈圖片,但它打印"Logged in as BillyLogin failed"完全一樣的。當我以Bob的身份登錄時,它說"Logged in as BobLogin failed"我不知道爲什麼我似乎無法弄清楚。有人可以解釋發生了什麼,並告訴我如何解決它?

在此先感謝。

回答

1

當然出現這種情況,是因爲的用戶名/密碼組合一場比賽,你回聲出「登錄失敗」 ......

你想要做什麼,而不是循環通過整個陣列,看看是否有匹配 - 和只有輸出「登錄失敗」循環如果有 沒有。

$login_successful = false; 
for ($i = 0; $i < count($users); $i++) { 
    if ($username === $users[$i] && $password === $passes[$i]) { 
     echo "Logged in as " .$users[$i]; 
     $login_successful = true; 
     break; // no need to continue the loop here, so we break out of it 
    } 
} 
if (!$login_successful) { 
    echo "Login failed"; 
} 

而且因爲這將打破,如果由於某種原因,你$users$passes陣列不會有條目相同數量的以任何理由在某些時候,你應該考慮使用更合適的數據結構好 - 可能會是

$login_credentials = array(
    arrays('username' => 'Billy', 'password' => 'billy123'), 
    arrays('username' => 'Bob', 'password' => 'pass1234'), 
); 

即通過以及更簡潔,更易循環:

$login_successful = false; 
foreach ($login_credentials as $login_credential) { 
    if ($username === $login_credential['username'] && $password === $login_credential["password"]) { 
     echo 'Logged in as ' . $username; 
     $login_successful = true; 
     break; // no need to continue the loop here, so we break out of it 
    } 
} 
if (!$login_successful) { 
    echo 'Login failed'; 
} 
-1

嘗試下面的代碼:

$username = $_POST['user']; 
$password = $_POST['pass']; 
$user["Bob"]="pass"; 
if ($username==$user[$username]){ 
echo "Authenticated"; 
} else { 
echo "bad password"; 
} 
0

如果你的問題是,你是不是打破了別人後循環已經通過認證,所以根它仍然會檢查循環中的其他人,並會在每次迭代時回顯登錄狀態。你想要的是緩存登錄的用戶ID,如果有人登錄,設置用戶ID並打破循環。如果用戶標識在循環後設置,則它們已登錄,否則它們不會。

<?php 
    $username = $_POST["username"]; 
    $password = $_POST["password"]; 

    $users = array("Billy", "Bob"); 
    $passes = array("billy123", "pass1234"); 

    $user_id=-1; 

    for ($i = 0; $i < count($users); $i++) 
    { 
     if ($username === $users[$i] && $password === $passes[$i]) 
     { 
      $user_id=$i; 
      break; 
     } 
    } 

    if($user_id>=0) 
    { 
     echo "Logged in as " .$users[$user_id]; 
    }else 
    { 
     echo "Login failed"; 
    } 
?>