2010-11-20 6 views
1

Ich versuche, ein PHP-Skript zu programmieren, in dem Benutzer kann die „Güte“ des anderen Benutzers bewerten:PostgresSQL: Vergleich der ersten 3 Nummern einer IPv4-Adresse?

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 
    ); 

To (versuchen zu) verhindern Manipulation Ich mag löschen Einträge für die gleiche ID von der gleichen IP im Laufe der letzten Stunde

(gelegentlich falsche Positive wegen Proxies/Router sind ok - weil es in Ordnung ist, eine Bewertung zu verlieren, da der Autor es später erneut einreichen kann Zeit, aber es ist nicht in Ordnung, einen Idioten unter verschiedenen IDs registrieren zu lassen und meine gesamte Datenbank zu beschädigen, während ich nicht auf der Website bin):

/* _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; 

Ich habe 2 Fragen wenden Sie sich bitte:

1), wenn ich nur die ersten 3 Zahlen von die IP-Adresse anstelle der 4, wie ich es tun kann, um vergleichen, möge? (ja, ich weiß, über die A, B, C Typen von IPv4-Netzwerken, spielt hier keine Rolle ...)

2) Muss ich einen Index zu meinem Tisch oder sind id hinzuzufügen und Autor bereits indiziert?

Vielen Dank! Alex

Antwort

2

1) Sie können das & Betreiber:

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

So können Sie vergleichen

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

2) Ich weiß nicht, sind sie?

Verwandte Themen