2011-05-05 81 views
1

我有一個用戶名檢查PHP,並且當有人輸入值'username2'時,'用戶名'已經存在,它返回它已被採取。MySQL/PHP數據庫值檢查不允許多餘的字符

include 'connect.php'; 

$username = $_POST['r_username']; 
$password = $_POST['r_password']; 
$email = $_POST['r_email']; 

$qry = "SELECT * FROM users WHERE 'username' = '$username'"; 

if(mysql_query($qry) != ''){ 
    echo "<script type='text/javascript'> 
    alert('This username has already been taken!'); 
    window.location = 'register.php'; 
    </script>"; 
}else{... 

感謝您的幫助!

+1

奇怪的是,它不應該那樣做。你能在這種情況下顯示'$ qry'包含什麼嗎?此外,你的代碼容易受到[SQL注入。](http://stackoverflow.com/questions/601300/what-is-sql-injection) – 2011-05-05 06:24:54

+1

數據庫中的用戶名列多長時間? – Marco 2011-05-05 06:25:09

+1

你好,[小鮑比桌](http://bobby-tables.com/) – Quentin 2011-05-05 06:26:13

回答

1
$query_response = mysql_query($qry) 
if (mysql_num_rows($query_response) > 0) { 
echo "<script type='text/javascript'> 
    alert('This username has already been taken!'); 
    window.location = 'register.php'; 
    </script>"; 
} 
else { 
echo 'This username has not been taken yet. Please, proceed'; 
} 

看看mysql_query返回什麼。您的條件(mysql_query($qry) != '')將始終爲true

此外,使用反引號代替撇號(')將列名稱包含在查詢中。現在您比較$ username字符串與字符串username,但不是username列。

順便說一句,我同意其他人。您的查詢不受SQL注入保護。使用mysql_real_escape_string像這樣:

"SELECT * FROM users WHERE `username` = '".mysql_real_escape_string($username)."'"; 
+0

我在最後輸入了一個帶有數字的用戶名,它工作的很好,但是當我輸入了完全相同的用戶名(在驗證它在數據庫中)後,它沒有發生錯誤。 – Christopher 2011-05-05 06:32:48

2

$qry = "SELECT * FROM users WHERE 'username' = '$username'";

我不知道很多關於PHP或MySQL,但只是想詢問是否FIELD_NAME應該是「用戶名」或不帶引號。可能是它將其作爲值而不是column_name。我不確定

+0

沒錯。他應該使用反引號。 – Nemoden 2011-05-05 06:30:13