2010-05-02 39 views
1

由於某些原因,當用戶輸入全新的用戶名時,會顯示錯誤消息<p>Username unavailable</p>,並且名稱不會被存儲。我想知道是否有人可以幫助找到我的代碼中的缺陷,所以我可以修復這個錯誤?謝謝PHP和MySQL用戶名驗證和存儲問題

這是PHP代碼。

if($_POST['username'] && trim($_POST['username'])!=='') { 
    $u = "SELECT * 
      FROM users 
      WHERE username = '$username' 
      AND user_id <> '$user_id'"; 
    $r = mysqli_query ($mysqli, $u) or trigger_error("Query: $u\n<br />MySQL Error: " . mysqli_error($mysqli)); 

    if (mysqli_num_rows($r) == TRUE) { 
     echo '<p>Username unavailable</p>'; 
     $_POST['username'] = NULL; 
    } else if(isset($_POST['username']) && mysqli_num_rows($r) == 0 && strlen($_POST['username']) <= 255) { 
     $username = mysqli_real_escape_string($mysqli, $_POST['username']); 
    } else if($_POST['username'] && strlen($_POST['username']) >= 256) { 
     echo '<p>Username can not exceed 255 characters</p>'; 
    } 
} 
+0

您能否詳細說明您要實現的目標?不是代碼方式,而是目的。 – VolkerK 2010-05-02 09:21:33

回答

1

嘿,mysqli_num_rows將總是因爲你的查詢有效,是真實的。相反,你必須檢查它返回的行數,當然如果你想創建一個新用戶,它應該是零。因此,檢查的行數等於1

if (mysqli_num_rows($r) == 1) echo "<p>Username unavailable</p>"; $_POST['username'] = NULL; 

或者做這種方式:

if (mysql_i_num_rows($r) == 0) { 
    // There isn't a user with this username yet, so create new user 
} else { 
    echo "Username not available"; 
} 
+0

不,沒有運氣,雖然 – php 2010-05-02 08:55:07

+0

我不確定。在PHP中,0和null都是相等的。因此,如果值被檢查爲真比它應該是大於0 換句話說:如果 ($ VAL ==假); if($ val == 0); if($ val ==「」);如果($ val == null); 都一樣。 如果字符串中包含的任何值比它是真實的(而不是假/零/空之外)。 – Chaim 2010-05-02 14:18:32

0

不管怎麼說,這是一個不好的做法與真比較,因爲它總是返回一個int,使用而不是:

mysqli_num_rows($r) > 0 
0

既然你沒有指定的$username$user_id,你的

碼值
$u = "SELECT * 
      FROM users 
      WHERE username = '$username' 
      AND user_id <> '$user_id'"; 

將評估爲

$u = "SELECT * 
       FROM users 
       WHERE username = '' 
       AND user_id <> ''"; 

我猜想,這是不是你的意圖的查詢,你會被檢索與一個空白用戶名的所有條目。