1

我正在尝试编写一个 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;

请问我有2个问题:

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

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

谢谢!亚历克斯

4

1 回答 1

2

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)我不知道,是吗?

于 2010-11-20T15:35:10.660 回答