我有下面的简单代码,用于在数据库中插入一些失败的登录值,但是我有一些问题:
1- ip地址被保存在数据库中为零,没有成功,无论我做什么(在这方面疯狂)。2-我在一个简单的查询中使用了当前时间戳来获取日期和时间,既然我使用了准备好的语句--它不能处理它,我就不得不使用日期(‘Y:I:s’);这会给出错误的时间。
我的代码是:
<?php
$username = $_SESSION['Name'];
$ip_address = $_SERVER['REMOTE_ADDR'];
$attempted = date('Y-m-d H:i:s');
$query = "INSERT INTO failed_logins (username, ip_address, attempted) VALUES(?, ?, ?)";
$failed = $conn->prepare($query);
$failed->bindParam(1, $username);
$failed->bindParam(2, $ip_address);
$failed->bindParam(3, $attempted);
$failed->execute();
?>
我在数据库中的ip_address行是int(11),它没有签名。
任何建议都会有帮助,谢谢
更新:
,我做了下面的工作,但还是没有运气:
我改变了:
$ip_address = $_SERVER['REMOTE_ADDR'];
对此:
$ip_address = ip2long($_SERVER['REMOTE_ADDR']);
发布于 2016-04-26 16:35:56
我被迫使用日期(‘Y:I:s’),它给出了错误的时间。
您是否尝试过设置date_default_timezone_set
,即:
date_default_timezone_set('America/Los_Angeles');
不能使用int
存储包含点、和冒号的变量。将DB ip_address
行更改为
int(11)
至
varchar(15); //ipv4
ALTER TABLE `sometable`
MODIFY COLUMN `ip_address` varchar(15);
或
varchar(45); //ipv6
ALTER TABLE `sometable`
MODIFY COLUMN `ip_address` varchar(45);
如果您想存储ipv6
地址
参考文献:
Maximum length of the textual representation of an IPv6 address?
发布于 2016-04-26 16:44:55
还可能得到IP(ish):
(string)$ip_address = getRealIpAddr();
function getRealIpAddr() {
(string)$ip='';
if (array_key_exists('HTTP_CLIENT_IP', $_SERVER) && !empty($_SERVER['HTTP_CLIENT_IP'])) { //check ip from share internet
$ip .= filter_input(INPUT_SERVER, 'HTTP_CLIENT_IP');
} elseif (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER) && !empty($_SERVER['HTTP_X_FORWARDED_FOR'])) { //to check ip is pass from proxy
$ip .= filter_input(INPUT_SERVER, 'HTTP_X_FORWARDED_FOR');
} else {
$ip .= filter_input(INPUT_SERVER, 'REMOTE_ADDR');
}
return $ip;
}
https://stackoverflow.com/questions/36870701
复制相似问题