2017年5月15日 星期一

使用 MySQL CASE

正在開發的一個手機應用程式,預計會有數十萬人使用;而程式內的獎品,有可能會吸引程序員暴力衝擊。為了減輕問題的發生,除了使用三層加密外,還想到限制 IP 的執行次數。但怎樣做才好?IP 地址儲存到檔案,可能會產生大量檔案;多人在線時,寫入順序會否受到影響;儲取時的 I/O 處理又會否太慢...等等問題,都是值得測試及細心研究。最終,我選擇了用數據庫。

利用 MySQL 的 CASE 可以令事情變得簡單:
//  10 seconds before
$secondBefore = date("Y-m-d H:i:s", time()-10);

$query = "UPDATE `".$this->tableName."` SET".
         " accessCount=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN accessCount+1 ELSE 1 END".
         ", lastModifiedBy=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN lastModifiedBy ELSE '$createdBy' END".
         ", lastModifiedAt=CASE".
         " WHEN lastModifiedAt>='".$secondBefore."' THEN lastModifiedAt ELSE NOW() END".
         ", userAgent='$userAgent'".
         " WHERE ipAddress='$ipAddress'".
         " AND createdBy='$createdBy'";

$resultArray = $this->sqlDatabase->query($query);
$affectedRows = $this->sqlDatabase->affected_rows;

沒有留言: