2013-04-15 100 views
0

該代碼用於更新用戶登錄的IP地址。當我打印$ sql字符串時,它似乎是正確的,IP地址是1886883852,但更新到mysql後,值是2149463110.我試圖在mysql中將數據類型設置爲INT(11)bigint(12),都是一樣的。 如果我嘗試寫一個字符串作爲php mysql更新IP地址無法正常工作

UPDATE ddns SET LastIP=1886883852, LastUpdate=now() WHERE ID=1 

直接,而不使用任何變量,它工作正常。

真的不明白。任何人都可以幫忙?

//get dns 
function getIP(){ 
     //check the current ip address registered 
     //Test if it is a shared client 
     if (!empty($_SERVER['HTTP_CLIENT_IP'])){ 
      $ipaddr=$_SERVER['HTTP_CLIENT_IP']; 
     //Is it a proxy address 
     }elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){ 
      $ipaddr=$_SERVER['HTTP_X_FORWARDED_FOR']; 
     }else{ 
      $ipaddr=$_SERVER['REMOTE_ADDR']; 
     } 
     $ipaddr = ip2long($ipaddr); 
     return $ipaddr; 
} 

$ipaddr = getIP(); 
$sql = "UPDATE ddns SET LastIP=$ipaddr, LastUpdate=now() WHERE ID=1"; 
echo $sql; **//here UPDATE ddns SET LastIP=1886883852, LastUpdate=now() WHERE ID=1** 
$result = mysqli_query($dbh,$sql) or die("Query failed:"); 
**//Here after updated, the value of ipaddr in database is 2149463110** 
if ($result) 
     echo "Update ddns successfully"; 
else 
     echo "faild to update ddns"; 
+1

爲什麼插入變量而不是使用預處理語句?這不是mysql上mysqli的主要好處之一嗎? – Barmar

+0

無論我如何處理這個問題,它都不應該發生。我能想到的唯一改變就是轉向準備好的聲明,如@Barmar所建議的。 – Sammitch

+0

謝謝。準備好的聲明似乎與mysqli有問題。從vi更改編輯器後,問題得到解決。很奇怪。 – alzhao

回答

0

最後我找到原因。當我使用Chrome訪問和更新時,數據庫將寫入2149463110,當我使用firefox或safari時,結果將是1886883852. 任何解釋?

0

你有沒有試過這樣:

$sql = "UPDATE ddns SET LastIP='$ipaddr', LastUpdate=now() WHERE ID=1"; 

的IP地址顯示爲一個字符串,所以它需要被引用。或者你可以var_dump $ _SERVER superglobal爲了檢查字段類型。或超過內存的限制。

僅用於測試用例,您可以將字段類型更改爲float,varchar或甚至文本。

+0

LastIP是int,不是字符串。其實起初我使用過字符串,它也很奇怪,同樣的問題。當打印$ sql時,這是正確的,有我的IP。但更新後,它是另一個字符串中的IP。 – alzhao

+0

我非常想法,但我仍然有一些想法。我看到你總是更新ID = 1。所以任何可以訪問你的應用程序的人都會用它的IP進行更新。所以,也許,你有一個機器人,它不斷地訪問你的應用程序,並重新設置你的IP爲ID = 1。如果您還將應用程序上傳到託管服務器,也可能是內部機器人。 –

+0

謝謝。 ID = 1僅針對發佈代碼進行修改。 – alzhao