2014-10-03 99 views
-1

我有一個登錄功能,我想返回一個變量的值,如果假$變量值:PHP函數返回虛假和不工作

function login($email, $password, $mysqli) { 
[...] 
// check if username exists 
if ($stmt->num_rows == 1) { 
    // check 
if ($db_password == $password) { 
    //check 
} else { 
    // Invalid password 
    $error = '2'; 
    return false; 
} else { 
     // No user exists. 
     $error = '1'; 
     return false; 

這是的process_login

// the login function is included in this page 
if (login($email, $password, $mysqli) == true) { 
    // Login success 
    header('Location: /index.php'); 
} else { 
    // Login failed 
    header("Location: /login.php?error=$error"); 
} 

我想要函數返回錯誤變量的值,但它不起作用。

怎麼回事?

謝謝!

+0

我缺少的東西,它會只能傳遞?如果你想返回錯誤變量的值,使用'return $ error;'。 – Barmar 2014-10-03 22:50:18

+0

最佳實踐:不要告訴用戶它的用戶名或密碼是否有誤。如果你發出太多的信息,攻擊者可以集中攻擊。如果登錄失敗,只需從函數中返回'false'即可。 – 2014-10-03 22:51:39

+0

你說得對,謝謝你的提示! – 2014-10-03 22:54:18

回答

0

如前所述,我們不應讓用戶知道用戶名或密碼錯誤。 但這只是一個練習(我仍然開始使用php)。

我們可以安全地移除其他兩個。

function login($email, $password, $mysqli) { 
    [...] 
    $exit = false; 
    // check if username exists 
    if ($stmt->num_rows > 0) { 
     // check 
     if ($db_password == $password) { 
      // checked 
      $exit = true; 
     } else { 
      // Invalid password 
      $exit = 2; 
     } 
    } else { 
     // No user exists. 
     $exit = 1; 
    } 

    return $exit; 
} 

無需進行比較,如果登錄()返回true

// the login function is included in this page 
if (login($email, $password, $mysqli)) { 
    // Login success 
    header('Location: /index.php'); 
} else { 
    // Login failed 
    header("Location: /login.php?error=$error"); 
} 
0

這應該做的伎倆:)

function login($email, $password, $mysqli) { 
[...] 
// check if username exists 
if ($stmt->num_rows == 1) { 
    // check 
if ($db_password == $password) { 
    //check 
    return true; 
} else { 
    // Invalid password 
    $error = '2'; 
    return $error; 
} else { 
     // No user exists. 
     $error = '1'; 
     return $error; 
...... 


// the login function is included in this page 
if (login($email, $password, $mysqli) === true) { //check for type (bool)true 
    // Login success 
    header('Location: /index.php'); 
} else { 
    // Login failed 
    header("Location: /login.php?error=$error"); 

} 
+0

謝謝,但我已經嘗試過,因爲一些未知的原因將我重定向到索引...和idk如果有什麼關係.htaccess重定向到index.php(我正在使用動態包括,我需要它) – 2014-10-03 22:59:24

0

你不能有兩個相同的其他條件if語句,你應該返回變量$錯誤,而不是返回false,如果你真的需要知道的錯誤數量,但只爲你所知。正如一位用戶告訴你,儘量不告訴用戶登錄錯誤到底在哪裏。只要告訴客戶登錄/密碼的詳細信息不正確

+0

它是一箇舊的和不好的縮進代碼(如果仔細觀察,你會看到兩個if語句)。這僅僅是我在學習php時的一個練習。無論如何,我會回答我自己的問題。 – 2016-01-17 16:23:26