You could try would i did for my voting system. store ips on a seperate table, then before the vote button appears it checks to see if the ip is already present., if they have already voted the button does not appear.
Then u have to have a function that deletes the ip database after 2 weeks, or whatever.
For the voting, the best way is to have 2 collums, no of votes and link rating. every time you rate a site, the number of votes goes up one and the link rating increases by the rate amount (ie if it was 7/10 the rating increases by 7.)
then in your function to display the rating. you need to display the average vote (ie. rating divided by number of votes)
by having a seperate table for ips means that u can see how many people are voting and on what. Also means that one person can vote on loads of things, but not on one thing twice in a given period, like as i suggested 2 weeks.
i'm happy to help further..