- 论坛徽章:
- 0
|
三十四.用写一个类实现会员管理,要求实现:
1)用文件存储会员信息,会员注册输入用户名和电子邮件就行。
2)用户信息包括:用户名,电子邮件。
3)要求用户可以登录、退出和注销用户。
4)如果用户没有退出,下次登录自动显示用户名。
5)保存用户上次浏览时间。
- class User {
- private $error = null; //出错信息
- const DATA_FILE = './data.file'; //用户数据文件
- const SEPARATOR = "\t"; //数据行分隔符
-
- public function __construct() {
- if(!$this->getIsLogin()) {
- if($_COOKIE['user']) { //用户没退出
- $cookie = @unserialize($_COOKIE['user']);
- if(isset($cookie['name']) && isset($cookie['email'])) {
- !$this->login($cookie['name'],$cookie['email']) && $this->logout();
- }
- }
- }
- }
- /**
- * 用户登陆
- * @param unknown_type $userName
- * @param unknown_type $email
- */
- public function login($userName,$email) {
- if($this->getIsLogin()) {
- return true;
- }
-
- $find = $this->getUser($userName,$email);//寻找某用户
- if(!$find) {
- $this->error = 'no user';
- return false;
- }
- $lastView = $find['last_view'];
- $content = file_get_contents(self::DATA_FILE);
- //更新访问时间
- file_put_contents(self::DATA_FILE,str_replace($userName.self::SEPARATOR.$email.self::SEPARATOR.$lastView,$userName.self::SEPARATOR.$email.self::SEPARATOR.time(),$content));
- $lastView = $find['last_view'];
- $cookie = array();
- $cookie['user']['name'] = $_SESSION['user_name'] = $userName;//用session保存登陆用户信息
- $cookie['user']['email'] = $_SESSION['email'] = $email;
- $_SESSION['last_view'] = $lastView;
- setcookie('user',@serialize($cookie),time()+14400);//生成cookie
- return true;
- }
- /**
- * 用户注册
- * @param $username
- * @param $email
- */
- public function register($username,$email) {
- $this->format($username,$email);
- if(!$username || !$email) {
- $this->error = 'no user or no email';
- return false;
- }
- if($this->getIsLogin()) {
- $this->error = 'has logined';
- return false;
- }
- if($this->getUser($username,$email)) {
- $this->error = 'registered by another';
- return false;
- }
- try {
- $f = fopen(self::DATA_FILE,'a');
- flock($f,LOCK_EX);
- fwrite($f,$username.self::SEPARATOR.$email.self::SEPARATOR.time()."\n");//写入一行
- flock($f,LOCK_UN);
- }
- catch (Exception $e) {
- fclose($f);
- $this->error = $e->getMessage();
- return false;
- }
- fclose($f);
- return true;
- }
- /**
- * 寻找用户,找到返回用户信息,找不到返回false;
- * @param $username
- * @param $email
- */
- public function getUser($username,$email) {
- $this->format($username,$email);
- try {
- $f = fopen(self::DATA_FILE,'r');
- if ($f) {
- while (!feof($f)) {
- $buffer = fgets($f, 4096);
- list($username1,$email1,$time1) = explode(self::SEPARATOR,$buffer);
- if($username1 == $username && $email1 == $email) {
- return array('user_name'=>$username1,'email'=>$email1,'last_view'=>$time1);
- }
- }
- fclose($f);
- }
- }
- catch (Exception $e) {
- fclose($f);
- return false;
- }
- return false;
- }
- /**
- * 规范化字符串
- * @param $user
- * @param $email
- */
- public function format(&$user,&$email) {
- $username = str_replace(self::SEPARATOR,'',trim($username));
- $email = str_replace(self::SEPARATOR,'',trim($email));
- }
- /**
- * 退出:清除session和cookie
- */
- public function logout() {
- unset($_SESSION['user_name']);
- unset($_SESSION['email']);
- unset($_SESSION['last_view']);
- setcookie('user','',time()-1);
- }
- /**
- * 获取是否登陆
- */
- public function getIsLogin() {
- if($_SESSION['user_name']) {
- return true;
- }
- return false;
- }
- /**
- * 获取错误信息
- */
- public function getError() {
- return $this->error;
- }
- }
复制代码 |
|