2009-10-04 73 views
0

我有一段效率低下的代碼用於根據用戶輸入其用戶名或電子郵件地址來重置密碼。 PHP腳本根據使用的標識符而分支。如果用戶輸入了他們的用戶名,但是他們輸入了他們的電子郵件地址,那麼我將它摺疊成現在可以工作的一種。這裏是突出的代碼:密碼重置腳本僅觸發一半時間

$identifier = isset($_POST["username"])?"username":"email"; 
$ident = isset($_POST["username"])?trim(mysqli_real_escape_string($mysqli,(check_chars_username($_POST["username"])))):trim(mysqli_real_escape_string($mysqli, (check_chars_email($_POST["email"])))); 


    //create and issue the query 
    $sql = "SELECT * FROM aromaMaster WHERE $identifier = '$ident'"; 
    $sql_res =mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli)); 

    if(mysqli_num_rows($sql_res) == 0) { 
     //wrong login info 
     header("Location: password_reset_form.html/error=$ident"); 
     exit(); 
    } 
     $info = mysqli_fetch_array($sql_res); 
     $userid = $info["id"]; 
     $username = stripslashes($info["username"]); 
     $email = stripslashes($info["email"]); 

我已檢查並加倍檢查電子郵件表單字段被稱爲電子郵件,它是。這讓我撓了撓頭。特別有趣的是頭重定向。當我輸入一個電子郵件地址並被重定向時,$ ident變量顯示爲空。

+2

要麼通過一些調試器(PHP + Zend?)運行它,要麼在設置它們以確保它們是它們應該是的之後至少回顯$ identifier和$ ident。 – 2009-10-04 01:39:34

+0

將來只需在標題中省略標籤。它混淆了這個問題。 – random 2009-10-04 01:39:49

+0

@ e.c.h.o .:會做,對不起。 @igro:正如我所說的,我確實追加了$ ident到查詢字符串,並且它顯示爲空。然而,在嘗試$標識符時,出於某種原因它說「用戶名」。我猜isset是錯誤的測試 - 將它改爲!empty()並且效果很好。謝謝! – user97410 2009-10-04 01:44:15

回答

0

正如您在評論中指出的,您必須檢查$_POST數組的username變量爲空。

除了之前和測試之前,檢查變量是否在第一位也是一個好主意,因爲它是空白的。

$identifier = 
(isset($_POST["username"]) && !empty($_POST["username"])) ? "username":"email"; 

當你跨越發送您的形式,所有的文本輸入字段會通過,即使他們是空白。空白與空白不同。這就是三元運算符的第一部分在您的初始代碼中始終爲true的原因。

+0

優秀的答案。我可能會補充說這可以簡化爲'$ identifier =(!empty($ _POST ['username']))? 'username':'email';' - 使用'isset'和'!空'在這種情況下有點多餘。 – 2018-02-09 18:33:01