vote($_POST['vote']); * if (!$result) { * // error * } * // success * } * * $result = $vote->load(); * if (!$result) { * // error * } * // success * echo $vote->rate('vote1'); * echo $vote->rate('vote2'); * echo $vote->rate('vote3'); */ class Kingyoya_SimpleVote { /** * データファイルパス * @private * @var string */ var $_file; /** * 解析結果 * @private * @var array */ var $_data; /** * 合計数 * @private * @var int */ var $_int; /** * コンストラクタ * @param string file */ function Kingyoya_SimpleVote($file) { if (!$file || !is_string($file)) { trigger_error("Failed get file", E_USER_WARNING); return; } if (!is_file($file)) { trigger_error("File is not exists: {$file}", E_USER_WARNING); return; } if (!is_readable($file)) { trigger_error("File is not readable: {$file}", E_USER_WARNING); return; } $this->_file = $file; } /** * ファイルデータを読み込み * @return boolean */ function load() { $file =& $this->_file; if (!$file || !is_string($file)) { trigger_error("Failed get file", E_USER_WARNING); return false; } if (!is_file($file)) { trigger_error("File is not exists: {$file}", E_USER_WARNING); return false; } if (!is_readable($file)) { trigger_error("File is not readable: {$file}", E_USER_WARNING); return false; } /* * ファイルからカウントを取得 */ $fp = fopen($file, 'r'); if (!$fp) { trigger_error("Failed open file: {$file}", E_USER_WARNING); return false; } $data = array(); $total = 0; while($fp && !feof($fp) && $row = fgetcsv($fp, 1024, ',')) { if (!$row) continue; $vote = (string) $row[0]; if (!$vote || !is_string($vote)) { trigger_error("Faield get vote from file: ", E_USER_WARNING); continue; } if (!isset($data[$vote])) { $data[$vote] = array( 'count' => 0 ,'rate' => 0 ); } $data[$vote]['count'] ++; $total ++; } /* * カウントから割合を算出 */ foreach ($data as $vote=>$value) { $data[$vote]['rate'] = ($data[$vote]['count'] / $total) * 100; } $this->_data =& $data; $this->_total =& $total; return true; } /** * カウントを取得 * @param string vote * @return int */ function count($vote) { if (!$vote) { trigger_error("Failed get vote", E_USER_WARNING); return false; } if (!is_string($vote)) { trigger_error("Failed get string vote", E_USER_WARNING); return false; } $data =& $this->_data; if (!isset($data) || !is_array($data)) { trigger_error("Data has not read yet", E_USER_WARNING); return false; } if (!isset($data[$vote]) || !is_array($data[$vote]) || !isset($data[$vote]['count'])) { return 0; } return (int) $data[$vote]['count']; } /** * 割合を取得 * @param string vote * @return int */ function rate($vote, $precision = 0) { if (!$vote) { trigger_error("Failed get vote", E_USER_WARNING); return false; } if (!is_string($vote)) { trigger_error("Failed get string vote", E_USER_WARNING); return false; } $data =& $this->_data; if (!isset($data) || !is_array($data)) { trigger_error("Data has not read yet", E_USER_WARNING); return false; } if (!isset($data[$vote]) || !is_array($data[$vote]) || !isset($data[$vote]['rate'])) { return 0; } return round($data[$vote]['rate'], $precision); } /** * 合計数を取得 * @return int */ function total() { $data =& $this->_data; if (!isset($data) || !is_array($data)) { trigger_error("Data has not read yet", E_USER_WARNING); return false; } return (int) $this->_total; } /** * 投票を記録 * @param string vote * @return boolean */ function vote($vote) { if (!$vote) { trigger_error("Failed get vote", E_USER_WARNING); return false; } if (!is_string($vote)) { trigger_error("Failed get string vote", E_USER_WARNING); return false; } $file =& $this->_file; if (!$file || !is_string($file)) { trigger_error("Failed get file", E_USER_WARNING); return false; } if (!is_file($file)) { trigger_error("File is not exists: {$file}", E_USER_WARNING); return false; } if (!is_writable($file)) { trigger_error("File is not writable: {$file}", E_USER_WARNING); return false; } $vote = preg_replace('/\\\\/', '', $vote); $vote = str_replace("'", "''", $vote); if (isset($_SERVER['REMOTE_ADDR'])) { $remoteaddr = (string) $_SERVER['REMOTE_ADDR']; $remoteaddr = preg_replace('/[^\w_\-\.]/', '', $remoteaddr); $remoteaddr = str_replace("'", "''", $remoteaddr); } else { $remoteaddr = 'unknown'; } $fp = fopen($file, 'a'); if (!$fp) { trigger_error("Failed open data file", E_USER_ERROR); return false; } $result = flock($fp, LOCK_EX); if (!$result) { trigger_error("Failed lock data file", E_USER_ERROR); return false; } if (!fwrite($fp, '"')) { trigger_error("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, $vote)) { trigger_error ("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, '","')) { trigger_error ("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, $remoteaddr)) { trigger_error ("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, '","')) { trigger_error ("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, date('Y-m-d H:i:s'))) { trigger_error ("Failed write data", E_USER_ERROR); return false; } if (!fwrite($fp, "\"\r\n")) { trigger_error ("Failed write data", E_USER_ERROR); return false; } fclose($fp); return true; } }