2015 年 9 月 23 日 水曜日
今度作るシステムに投票機能が必要だったので調べてみた。確認したかったのは、どのように重複投票チェックをしているかの一点です。
CheeseCakeでは、投票の履歴を記録し、投票のたびに投票履歴がないかチェックしています。
投票履歴の記録に使われているテーブルはratinghistories。
mysql> show fields from cc2_ratinghistories;
+------------+-------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+------------+-------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| photo_id | int(11) | NO | MUL | NULL | |
| visitor_id | varchar(32) | NO | | NULL | |
| created | datetime | NO | | NULL | |
| modified | datetime | NO | | NULL | |
+------------+-------------+------+-----+---------+----------------+
投票された写真のIdをphoto_idに、投票者のIdをvisitor_idに格納します。
Cookieにvisitorキーの値が格納されている場合は$visitorIdにセットし、ratinghistoriesテーブルからレコードが存在するかチェックしています。Cookieに値が格納されていなかった場合は逆に値を格納。
if ($this->Cookie->read('visitor')){ $visitorId = $this->Cookie->read('visitor'); $hasVoted = $this->Ratinghistory->hasAny('Ratinghistory.photo_id = '.$photoId.' AND Ratinghistory.visitor_id = "'.$visitorId.'"');}else{ $hasVoted = false; $visitorId = md5(uniqid(time())); $this->Cookie->write('visitor', $visitorId, true, '1 month');}
Cookie->writeの4つ目のパラメータに’1 month’を指定し、visitorIdを1ヶ月保存しています。これで、一ヶ月間は重複して投票できなくなるわけか。なるほど。
あとは、投票チェックの結果にあわせて処理を変えればいいだけですね。
if ($hasVoted){
$message = __('You can only vote once per photo.', true);
$this->Session->setFlash($message, 'default', array(), 'error');
}else{
$this->__updateRating($photoId, $visitorId);
$message = __('Thanks, your vote has been counted.', true);
$this->Session->setFlash($message, 'default', array(), 'success');
}
このエントリーのトラックバックURL:
http://www.bmoo.net/archives/2009/01/171034.html/trackback