2013-04-15 1 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

Почему вы интерполируете переменные вместо использования подготовленного оператора? Разве это не одно из основных преимуществ mysqli над mysql? – 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, чтобы проверить тип поля. Или превышение предела памяти.

Только для тестового случая вы можете изменить тип поля на float, varchar или даже на текст.

+0

LastIP is int, а не строка. На самом деле сначала я использовал строку, это тоже странно, та же проблема. Когда вы печатаете $ sql, это правильно, имеет мой IP. но после обновления это другой IP-адрес в строке. – alzhao

+0

У меня очень много идей, но у меня есть мысли. Я вижу, что вы всегда обновляете ID = 1. Поэтому каждый, кто может получить доступ к вашему приложению, будет обновлять его IP-адресом. Итак, возможно, у вас есть бот, который постоянно обращается к вашему приложению и перезаписывает ваш IP для ID = 1. Если также может быть внутренний бот, если вы загрузили приложение на хостинг. –

+0

Спасибо. ID = 1 изменен только для публикации кода. – alzhao

Смежные вопросы