gpt4 book ai didi

PostgreSQL:比较 IPv4 地址的前 3 个数字?

转载 作者:行者123 更新时间:2023-11-29 13:07:24 32 4
gpt4 key购买 nike

我正在尝试编写一个 PHP 脚本,其中用户可以评价其他用户的“好”:

   create table pref_rep (
id varchar(32) references pref_users(id) check (id <> author),
author varchar(32) references pref_users(id),
author_ip inet,
good boolean,
last_rated timestamp default current_timestamp
);

为了(尝试)防止篡改我想删除在过去一小时内来自同一 IP 的同一 ID 的条目

(由于代理/路由器导致的偶尔误报是可以的 - 因为失去评级是可以的,因为作者可以在以后的任何时间重新提交它;但是让一些白痴在不同的目录下注册是不行的id 并在我离开网站时破坏我的整个数据库):

   /* _author_ip will be $_SERVER['REMOTE_ADDR'] */
create or replace function pref_update_rep(_id varchar,
_author varchar, _author_ip inet,
_good boolean) returns void as $BODY$
begin
delete from pref_rep
where id = _id and
author_ip = _author_ip and
age(to_timestamp(last_rated)) < interval '1 hour';

update pref_rep set
author = _author,
author_ip = _author_ip,
good = _good,
last_rated = current_timestamp
where id = _id and author = _author;

if not found then
insert into pref_rep(id, author, author_ip, good)
values (_id, _author, _author_ip, _good);
end if;
end;
$BODY$ language plpgsql;

我有两个问题:

1) 如果我只想比较的前 3 个数字IP 地址而不是 4,我该怎么做?(是的,我知道 IPv4 网络的 A、B、C 类型,这里无关紧要...)

2) 我需要为我的表添加索引吗还是 id 和 author 已经编入索引?

谢谢!亚历克斯

最佳答案

1) 您可以使用 & 运算符:

postgres=# SELECT '1.2.3.4'::inet & '255.255.255.0'::inet;
?column?
----------
1.2.3.0
(1 row)

所以,你可以比较一下

(author_ip & '255.255.255.0'::inet) = (_author_ip & '255.255.255.0'::inet)

2) 我不知道,是吗?

关于PostgreSQL:比较 IPv4 地址的前 3 个数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4233041/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com