2013-09-27 18 views
-2

我想在用戶忘記用戶名時返回用戶名。我再次驗證他們的電子郵件地址,但由於某種原因,它只是說'錯誤:無法找到用戶名'。我正在使用我希望的正確的mysqli語法。不會返回用戶名的MYSQLI結果

if (isset($_POST['user'])) { 
    $email = mysqli_real_escape_string($con, $_POST['email']); 
    $username = ""; 
    if (!eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email)) { 
     $errmsg = 'Error: ' . $email . ' is not a valid email address'; 
    } else { 
     $query = "SELECT email FROM admin WHERE email = '$email'"; 
     $results = mysqli_query($con, $query); 

     $query2 = mysqli_fetch_array($results); 

     if ($query2 == 0) { 
      $errmsg = 'Error: ' . $email . ' is not found, please try again'; 
     } 
     if (!errmsg) { 
      $getuname = "SELECT * FROM admin WHERE email = '$email'"; 
      if (!mysqli_query($con, $getuname)) { 
       die('Error: ' . mysqli_error($con)); 
      } 
      $row = mysql_fetch_array($getuname); 
     } 
     $username = '<div class="registersuccess">Your username is: ' . $row['username'] . '</div>'; 
    } 
    $username = '<div class="registererror">Error: cannot find username</div>'; 

    mysqli_close($con); 
} 

我是一個noob當談到這一點,但我很確定這是正確的。如果不是我出錯的地方?

+0

一件事,你應該使用'preg_match',而不是'這已棄用eregi'加mysql_'的'混合和'mysqli_'作出*災難正在進行中。* –

+0

看起來像你在if語句之外設置「找不到」值,所以它總是被擊中。如果你的代碼格式正確,這將更容易注意到。 – Mansfield

+1

不需要2個不同的查詢,你只能在一箇中完成。 –

回答

0

我在代碼中發現了一些錯誤,您可以在Mark B和Amal Murali的答案中看到錯誤。讓我讓你的else塊簡單明瞭。您只能使用1個查詢而不是2個查詢。

else { 
    $query = mysqli_query("SELECT * FROM admin WHERE email = '$email'"); 
    $row = mysqli_fetch_array($query); 
    $numrows = mysqli_num_rows($query); 
    if (!$errmsg){ 
     if($numrows == 0) { 
      $errmsg = 'Error: '.$email.' is not found, please try again'; 
       // or here you can add message like Cannot find username 
     } 
     else 
     { 
      $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>'; 
     } 
} 
0

你的代碼是一場災難。您使用的是ereg,自石器時代以來已被棄用。您將調用混合到mysql(不是i)和mysqli(使用i)庫。它們不可互換並且不相互兼容。

您需要切換到preg函數,並在一個單一的mysql庫上進行標準化。由於mysql也被棄用,請僅使用mysqli

$row = mysql_fetch_array($getuname); 
       ^^^---note the LACK of an i 

if (!errmsg){ 
    ^^^--note the lack of a $ sign, meaning this is undefined/undeclared constant. 
+0

我覺得我應該指出,雖然這個答案包含了很好的建議,但它並沒有真正回答這個問題。 – Mansfield

+2

如果OP甚至沒有正確運行查詢/正確檢索數據,OP可能會從數據庫中獲取用戶名?這就像抱怨汽車擋風玻璃上有一個死亡錯誤,它在懸崖上行駛後會爆炸成一百萬件。 –

+0

雅得愛馬克的類比;-)我記得「郵遞員」一點; *經典。* –

1

這些都是一些我注意到的錯誤:

  • 你做if (!errmsg)但有沒有這樣的常數,你想if (!$errmsg)代替。

  • 正如Marc B指出的那樣,您正在做$row = mysql_fetch_array($getuname);,但您想要$row = mysqli_fetch_array($getuname);

另外,您所描述的特定問題,可能是因爲剛mysqli_close語句之前$username聲明。您正在重置$username的值,無論您的數據庫查詢的結果如何,它總是會回顯相同的消息。

$username = ""; 
if(condition) 
{ 
    # code ... 
} 
else 
{ 
    # code ... 
} 
$username = '<div class="registererror">Error: cannot find username</div>'; 
mysqli_close($con); 

這是您的代碼中的許多邏輯錯誤之一。用適當的縮進結構if-else塊,你不應該有這個問題。

0

變化的這部分代碼:

if (!errmsg){ 
     $getuname = "SELECT * FROM admin WHERE email = '$email'"; 
     if (!mysqli_query($con,$getuname)) 
     { 
      die('Error: ' . mysqli_error($con)); 
     } 
     $row = mysql_fetch_array($getuname); 
    }  
    $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>'; 
} 
$username = '<div class="registererror">Error: cannot find username</div>'; 

到:

if (!errmsg){ 
     $getuname = "SELECT * FROM admin WHERE email = '$email'"; 
     $uresult = mysqli_query($con, $getuname); 
     if (!$uresult)) 
     { 
      die('Error: ' . mysqli_error($con)); 
     } 
     $row = mysqli_fetch_array($uresult); 
     if ($row) { 
     $username = '<div class="registersuccess">Your username is: '.$row['username'].'</div>'; 
     } else { 
     $username = '<div class="registererror">Error: cannot find username</div>'; 
    } 
    } 

你的錯誤:

  • 你分別致電mysql_fetch_array,而不是mysqli_fetch_array
  • 您正在將SQL字符串傳遞給mysql_fetch_array,而不是mysqli_query的結果。
  • 您沒有檢查是否返回了一行,您只是無條件地設置了$username - 先是成功消息,然後是失敗消息。