2014-01-05 42 views
0

我忙於提高自己的PHP技能並製作簡單的登錄腳本。我用foreach循環檢查$ accounts數組,但認爲我做錯了什麼,因爲沒有休息時腳本給每個錯誤的帳戶登錄提供錯誤。我只是不知道我需要用什麼來代替foreach。有人可以幫助我嗎?使用foreach檢查登錄數據?

簡單的HTML表單:

<form method="post"> 

    <label>E-mail:</label> 
    <input name="email" type="text" /> 

    <label>Password:</label> 
    <input name="password" type="password" /> 

    <input name="login" type="submit" value="Login" /> 

</form> 

PHP:

<?php $accounts = array(

     1 => array(
      'surname' => 'Matt', 
      'lastname' => 'Kent', 
      'email' => '[email protected]', 
      'password' => 'test123' 

     ), 
     2 => array(
      'surname' => 'Jake', 
      'lastname' => 'Johnssen', 
      'email' => '[email protected]', 
      'password' => 'test456' 
     ) 
    ); 

    if(isset($_POST['login'])) { 

     foreach($accounts as $account) { 

      if($account['email'] == $_POST['email'] && $account['password'] == $_POST['password']) { 
       echo 'You are logged in!'; 
       break; 
      } 
      elseif($account['email'] != $_POST['email']) { 
       echo 'Wrong e-mail'; 
       break; 
      } 
      elseif($account['password'] != $_POST['password']) { 
       echo 'Wrong password'; 
       break; 
      } 

     } 

    } 

    ?> 
+0

不需要休息。這不是開關盒。那你爲什麼要把數據放在數組中?如果它來自數據庫,那麼你可以檢查自己的查詢。 –

+0

foreach將遍歷數組,無論它是否正確。因此,當你有2個數組時,總是會是假的。還使用一組密碼不是很好的做法。特別是對於未被哈希的密碼(使用鹽),它似乎非常不安全。您是否無法使用數據庫使用PDO擴展與準備好的語句或MySQLi與準備好的語句 –

+0

@kumar_v好吧,但我用中斷,否則腳本給每個帳戶的錯誤,錯誤的登錄組合 – Robbert

回答

1

說我要登錄爲用戶2(傑克Johnssen)。然而,foreach將從user1開始(Matt Kent),並且因爲$account['email'] != $_POST['email']我將得到Fout e-mail adres錯誤,並且foreach將break

你可以不喜歡它,你有一個標誌$emailFound它可以讓你知道郵件是否是定義的數組或不

  • 只會檢查電子郵件密碼以下

    $emailFound = FALSE; 
    foreach ($accounts as $account) { 
        if ($account['email'] == $_POST['email']) { 
         if ($account['password'] == $_POST['password']) { 
          echo 'successful login!'; 
         } else { 
          echo 'wrong password'; 
         } 
         $emailFound = TRUE; 
         break; 
        } 
    } 
    if ($emailFound === FALSE) { 
        echo 'wrong email'; 
    } 
    
    • 匹配,所以它不會檢查傑克的密碼與馬特的密碼(如上所述)。

    這假定一個電子郵件不能被兩個用戶舉行,所以一旦正確的電子郵件被發現,你可以break循環爲以下用戶不感興趣了。


    案例1:我想以不正確的密碼登錄user2。在foreach會是這樣的

    1. 迭代:if ($account['email'] == $_POST['email'])返回false,所以沒有進一步的檢查
    2. 迭代:if ($account['email'] == $_POST['email'])返回true,所以裏面去
      • if ($account['password'] == $_POST['password'])返回false,所以走在別人
      • 示值誤差和break當我們完成

    正如你所看到的那樣。這是因爲在你當前的腳本中,不會有第二次迭代,因爲你總是break(這些elseif之一很可能是真的)。

  • +0

    好的,謝謝你的回答!所以,foreach是做這份工作的正確選擇? – Robbert

    +0

    我不會稱之爲「正確的選擇」。是的,你可以這樣做,如果你的用戶總是少於一小部分,那麼你就不會遇到那些嚴重的問題。但有沒有一個特定的原因,你不使用數據庫呢?他們的設計正是爲了這樣的工作,並且查詢數據庫比編寫自己的腳本來完成同樣的事情更爲高效和簡單(一旦你知道如何)。 – kero

    +0

    是的我想使用一個數據庫,但因爲這是一個快速嘗試讓我登錄一個使用數組,但現在我要看一些SQL教程。 – Robbert