2010-11-20 8 views
1

Kullanıcıların 'in diğer kullanıcıların "iyiliğini" derecelendirebileceği bir PHP betiğini programlamaya çalışıyorum:PostgresQL: Bir IPv4 adresinin ilk 3 sayısının karşılaştırılması?

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

Kurcalamayı engellemek (xtx13) girişlerini silmek istiyorum son bir saat içinde aynı IP'den gelen aynı kimlik

(proxy/yönlendiriciler nedeniyle ara sıra yanlış pozitifler iyidir - çünkü yazar daha sonra tekrar gönderebileceği için bir derecelendirmeyi kaybetmek iyidir ; ama farklı id altında kayıtlı bazı aptallar ve web sitemden uzaktayken veritabanımın tamamını bozmak iyi değil:

 /* _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 soru var lütfen:

1) 4 yerine 'in ilk 3 sayısını karşılaştırmak istiyorum, bunu nasıl yapabilirim? (Evet, A, B, C tipi IPv4 ağlarının türlerini biliyorum, burada önemi yok ...)

2) tablosuna bir indeks eklemem gerekir mi yoksa id ve yazar zaten dizine eklenmiş mi?

Teşekkürler! Alex

cevap

2

1) & operatörünü kullanabilirsiniz: Yani

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

, sen

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

2) Bilmiyorum karşılaştırabilirsiniz, bunlar?