2013-02-10 44 views
-1

我在登記表,以防止對多個用戶名下面的代碼創建:我將如何停止多個電子郵件或用戶名?

connect_db(); 
    $check = mysql_query("SELECT username FROM school_users WHERE username = '$username'") or die(mysql_error()); 
    $check2 = mysql_num_rows($check); 

if ($check2 != 0) { 
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");} 

不過,我也想檢查郵件,在同一個語句:

connect_db(); 
     $check = mysql_query("SELECT username, email FROM school_users WHERE username = '$username' or email = '$email'") or die(mysql_error()); 
     $check2 = mysql_num_rows($check); 

    if ($check2 != 0) { 
if (???username???){ 
     respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}} 
else if (???email???) { 
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}} 
+3

從查詢中獲取用戶名和電子郵件,並檢查您的帖子值? – hank 2013-02-10 17:49:10

+1

[**請不要在新代碼**中使用'mysql_ *'函數](http://bit.ly/phpmsql)。他們不再被維護[並且被正式棄用](http://j.mp/XqV7Lp)。看到[**紅框**](http://j.mp/Te9zIL)?學習[*準備的語句*](http://j.mp/T9hLWi),並使用[PDO](http://php.net/pdo)或[MySQLi](http://php.net/ mysqli) - [這篇文章](http://j.mp/QEx8IB)將幫助你決定哪個。 – Kermit 2013-02-10 18:01:34

+3

^^^^儘可能真實,它對於常規的S.O用戶每天看到它10次以上有點繁瑣。 – 2013-02-10 18:21:39

回答

2

你可以嘗試做:

connect_db(); 
$check = mysql_query("SELECT 'User' validation 
         FROM school_users 
         WHERE username = '$username' 
         UNION ALL 
         SELECT 'Email' 
         FROM school_users 
         WHERE email = '$email'") or die(mysql_error()); 
$row = mysql_fetch_assoc($check); 

if($row) 
{ 
    if ($row["validation"] == 'User') { 
      respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");}} 
    else if ($row["validation"] == 'Email') { 
     respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");}} 
} 

或者您也可以單獨做到這一點...

//Validate UserName 
connect_db(); 
$check = mysql_query("SELECT username FROM school_users WHERE username = '$username'") or die(mysql_error()); 
$check2 = mysql_num_rows($check); 

if ($check2 != 0) { 
    respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");} 

//Validate Email 
connect_db(); 
$checkEmail = mysql_query("SELECT email FROM school_users WHERE email = '$email'") or die(mysql_error()); 
$checkEmail2 = mysql_num_rows($check); 

if ($checkEmail2 != 0) { 
    respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");} 

此外,您的代碼容易受到SQL注入攻擊,並且您正在使用不推薦使用的MySQL php函數。如果你想使你的代碼更好的那麼脆弱,一起來看看下面的鏈接:

Why shouldn't I use mysql_* functions in PHP?

What could i use instead of mysql_ functions?

Prepated Statements

Prepared Statements with MySQLi

+0

Sql注入會很好! – 2013-02-10 18:07:58

+0

我剛剛展示了一種可能的方式來完成OP所要做的事情。我還發布了一些其他鏈接,這些鏈接可以幫助他更好地完成代碼,比如避免使用mysql_函數和準備語句。主動權是他的全部。 – 2013-02-10 18:11:21

+0

對於其他人來說,對於堆棧溢出作爲匿名代碼查找程序的警告將會很好。 – 2013-02-10 23:50:30

1

你也可以做到這一點在一個聲明中:

SELECT username 
FROM school_users 
WHERE username = '$username' or email = '$email' 

如果你這樣做,你需要改變消息給用戶。 。 。 「您的用戶名或電子郵件(或兩者)已被使用」。

要在一個聲明自定義消息,你可以使用聚合:

select (case when max(username = '$username') = 1 and max(email = '$email' = 1 
      then 'both' 
      when max(username = '$username') = 1 
      then 'username' 
      when max(email = $email) = 1 
      then 'email' 
     end) as WherePresent 
from school_users 
WHERE username = '$username' or email = '$email' 

這將返回0行,如果一切正常。否則,它會返回一行,其中包含「both」,「username」,「email」之一,表明哪一個是重複的。

+0

我想每個人都有一個特定的消息。一個如果兩個,如果只有一個用戶,一個如果只有電子郵件。我只是不知道該怎麼趕上。 – user2058041 2013-02-10 18:19:23

+0

我該如何去執行此操作?仍num_rows? – user2058041 2013-02-10 19:35:54

+0

你會以相同的方式執行此操作。如果num的行數是0,那麼一切都沒問題。否則,您需要查看返回的值。 – 2013-02-10 19:57:08

1

最初的代碼並不像您想象的那麼遠。

$check = mysql_query("SELECT username, email FROM school_users WHERE username = '$username' or email = '$email' LIMIT 1") or die(mysql_error()); //Limit one reduces the time mysql searches the db since it stops on the first occurence 
     $check2 = mysql_fetch_assoc($check); //we do not only want to know the count of matching rows, but the values return in email and username field 

//trimming makes sure we do not have any spaces at the beginning or end 
//strtolower makes sure we set UserName == usERnaME == username etc.pp. 
if (strtolower(trim($row['username'])) == strtolower(trim($_POST['username']))){ // check the result 
     respond("error", "Sorry, the username ".$_POST['username']." is already in use. Please choose a different username.");} 
} 
else if (strtolower(trim($row['email'])) == strtolower(trim($_POST['email']))) { // and again for email adress 
    respond("error", "Sorry, the email ".$_POST['email']." is already in use. Please choose a different email.");} 
} 
+0

我不認爲我想限制一個。如果用戶和電子郵件都被帶走,會怎麼樣? – user2058041 2013-02-10 18:47:34

+0

然後用戶將反覆嘗試兩次;)無論你是否限制,他總是會......同時檢查BOTH的代碼比方便更容易混淆;)但是一如既往:只要你喜歡就行因爲它的工作沒問題:D – itsid 2013-02-10 23:32:17

相關問題