2011-11-15 105 views
1

我有一個名爲'IP'的表的數據庫。它有2列Id(int11)ip(varchar15),並與值的行:id 1, ip 127.0.0.1檢查IP地址是否存儲在數據庫中

現在回到在PHP我有以下幾點:

$ip = $_SERVER['REMOTE_ADDR']; 
$query = "SELECT * FROM ip WHERE ip='$ip'"; 

if(mysql_query($query)) { 
    echo "Ip is already in database"; 
} 
else { 
    echo "Ip is not in database"; 
} 

現在我得到的問題是,如果語句仍成真的話,如果我改變IP說:125.0.0.1

我一直試圖修復它2小時,但仍然無法弄清楚我做錯了什麼。

+0

另外,通過將IP地址存儲爲整數,可以使得效率更高。使用MySQL函數[INET_ATON](http://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_inet-aton)和INET_NTOA在地址和整數之間轉換,並使用UNSIGNED INT列爲ip。好處是固定的行大小,更快的索引和更快的查找速度。 –

+0

好吧,我喜歡更快!我會盡力現在就這樣。 – Seltjoek

回答

5

mysql_query()如果查詢成功執行,即使沒有結果,也不會返回false。嘗試使用mysql_num_rows()代替:

$ip = mysql_real_escape_string($_SERVER['REMOTE_ADDR']); 
$query = "SELECT * FROM ip WHERE ip='$ip'"; 
$result = mysql_query($query); 

if (mysql_num_rows($result) > 0) { 
    echo "Ip is already in database"; 
} 
else { 
    echo "Ip is not in database"; 
} 

通過我加mysql_real_escape_string圍繞REMOTE_ADDR VAR的方式,你應該總是淨化你的輸入:)

+0

感謝您的快速回復,它就像一個魅力! 關於mysql_real_escape_string。有人可以操縱它嗎? – Seltjoek

+0

我並不完全確定是誠實的,我的直覺說可能有人將惡意值注入到變量中,但我不確定。如果我沒有明確地設置自己的變量,我總是會在謹慎的方面犯錯:) – Clive

+0

好的,那麼這也是一件好事。 Tnx :) – Seltjoek

4

使用mysql_num_rows檢查的記錄數!

$query = mysql_query("SELECT * FROM ip WHERE ip='". $_SERVER['REMOTE_ADDR'] ."'"); 
$num = mysql_num_rows($query); 

if($num > 0) { 
    echo "Exists"; 
} 
else { 
    echo "Does not exist"; 
} 
+0

感謝Wesso的快速回復! – Seltjoek