2017-05-26 24 views
1

我試圖在數據庫中保存遠程用戶IP。爲此目的,我創建了一列爲int(10) UNSIGNED使用準備好的狀態保存遠程IP

當我嘗試這樣的一切工作,但IP保存像127.0.0.1

$ipaddr = $_SERVER['REMOTE_ADDR']; 
$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :ipaddr)'); 

$stmt->execute(array(
    ':body' => $_POST['k3jZGEeX1k1oo'], 
    ':author' => $_POST['k3k0xKicU0eHQ'], 
    ':email' => $email, 
    'url' => $url, 
    'ip' => $ipaddr 
)); 

當我嘗試使用INET_ATON沒有進入數據庫。

$ipaddr = $_SERVER['REMOTE_ADDR']; 
$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :INET_ATON(ipaddr))'); 

$stmt->execute(array(
     ':body' => $_POST['k3jZGEeX1k1oo'], 
     ':author' => $_POST['k3k0xKicU0eHQ'], 
     ':email' => $email, 
     'url' => $url, 
     'ip' => $ipaddr 
)); 

請注意:INET_ATON(ipaddr)。我如何用準備好的語句來做到這一點?

+1

':INET_ATON'?這是一個內置函數https://dev.mysql.com/doc/refman/5.7/en/miscellaneous-functions.html#function_inet-aton爲什麼冒號?你想要的是'INET_ATON(:ip)' –

+0

你不應該使用'int(10)UNSIGNED'。這是一個「奇怪」的數字......你有3個點('.')。所以把它改爲'varchar(12)' - >'XXX.YYY.ZZZ.WWW' - > 12 – matiaslauriti

+0

@ Fred-ii-我試過也是這樣,但後來我有'錯誤500' –

回答

1

As @ Fred-ii-表示你應該檢查錯誤。我也可以推薦this solution,並建立在PHP函數ip2long。你的情況會

$ipaddr = $_SERVER['REMOTE_ADDR']; 
$ip = sprintf("%u", ip2long($ipaddr)); 

$stmt = $pdo->prepare('INSERT INTO comment (body, author, email, date, url, ip) VALUES (:body, :author, :email, NOW(), :url, :ip)'); 

$stmt->execute(array(
    ':body' => $_POST['k3jZGEeX1k1oo'], 
    ':author' => $_POST['k3k0xKicU0eHQ'], 
    ':email' => $email, 
    ':url' => $url, 
    ':ip' => $ip 
)); 

選擇,看看實際的IP,那麼你可以(從@弗雷德-II-評論再次)在查詢中使用INET_NTOA

+0

數組中不需要冒號,只能在非常罕見的情況下使用。然而,OP並沒有對我在評論中提出的問題發表任何評論。 –

+0

其實你是對的。它們在'execute()'和'bindParam()'調用中是可選的。它們僅在'SQL語句'中是必需的 –