如果用户IP位于禁止IP的数据库中,我希望有一个基本脚本会死在页面顶部。我有一个脚本,到目前为止将插入一个具有自动递增ID和IP的IP。我正在使用PDO库,如何从数据库中获取返回的数组并检查in_array?
以下是我如何返回数据库信息。
$query = "
SELECT
id,
ip
FROM banned
";
try
{
$stmt = $db->prepare($query);
$stmt->execute();
}
catch(PDOException $ex)
{
die("Failed to run query: " . $ex->getMessage());
}
$rows = $stmt->fetchAll();
然后这里只是我写的一个快速脚本,只是死在页面顶部并重定向。
if(in_array($_SERVER['REMOTE_ADDR'], $row["ip"]))
{
header("Location: banned.php")
die("Banned!");
}
我的整体问题是,如何获取获取的数据并将其放入数组?
答案 0 :(得分:0)
使用ip2long()
功能将IP地址转换为整数。将这些整数存储在数据库中,然后使用以下查询。正如GolezTroll在评论中指出的那样,请确保整数字段为UNSIGNED
。
$query = 'SELECT id, ip FROM banned WHERE ip = ';
$query .= ip2long($_SERVER['REMOTE_ADDR']);
$query .= ' LIMIT 1';
这样,您的banned
表对索引非常友好,而您最多只能从表中检索一个条目。您当前的代码每次都会获得每个条目,在您的Web服务器和mysql服务器上都会产生相当大的负载。
此外,您可以从禁止的表中删除id
列,因为ip
列应该作为主键自行运行。
答案 1 :(得分:0)
别。将所有这些地址查询到数组中是一种浪费。只需使用这样的查询:
SELECT
CASE WHEN EXISTS
(SELECT
'x'
FROM
banned
WHERE
ip = :ip) THEN
'Y'
ELSE
'N'
END AS IsBanned
当然,您必须填写正确的IP地址:IP。 此查询始终返回1个记录。如果IP地址被禁止,该记录总是包含'Y',如果不是,则包含'N'。 即使您不小心禁止IP两次,查询也会继续工作,尽管我会通过在该字段上添加唯一约束(唯一索引)来阻止它。
但请注意,IP禁止并不理想。许多人每天仍然拥有不同的IP地址。这意味着他们仍然可以访问您的网站,而无辜的其他人则无法访问您的网站。此外,整个家庭和公司使用相同的IP,因此阻止1个用户,可以阻止整个公司成千上万。
IP地址(IPv4,即)可以存储在整数字段中。但请注意,如果通过参数传递IP地址,则必须将其作为字符串传递,即使字段本身是整数也是如此。 MySQL整数参数是32位的符号。这意味着从128或更高的IP地址开始出现问题。它会搞砸你的比较。
答案 2 :(得分:0)
您已经将获取的数据放入数组中。
$rows = $stmt->fetchAll();
数组$ rows应该包含所有被禁止的IP。你可以通过添加
来检查它print_r($rows);
在获取所有语句之后。
希望这会有所帮助,如果还有其他任何问题,那就请问。