PHP学习笔记 用户注册模块用户类以及验证码类


Posted in PHP onSeptember 20, 2011

所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友。
:User类,包括读取和设置数据库,以及保存更改交互

<?php 
class User{ 
private $uid; 
private $fields; 
public function __construct(){ 
$this->uid=null; 
$this->fields=array('username'=>'','password'=>'','emailAddr'=>'','isActive'=>false); 
} 
public function __get($field){ 
if($field=='userId'){ 
return $this->uid; 
}else{ 
return $this->fields[$field]; 
} 
} 
public function __set($field,$value){ 
if(array_key_exists($field,$this->fields)){ 
$this->fields[$field]=$value; 
} 
} 
//return if username is valid format 
public static function validateUsername($username){ 
return preg_match('/^[A-Z0-9]{2,20}$/i',$username); 
} 
//return if email address is valid format 
public static function validateEmailAddr($email){ 
return filter_var($email,FILTER_VALIDATE_EMAIL); 
} 
//return an object populated based on the record‘s user id 
public static function getById($user_id){ 
$user=new User(); 
$query=sprintf('SELECT USERNAME,PASSWORD,EMAIL_ADDR,IS_ACTIVE '. 
'FROM %sUSER WHERE USER_ID=%d',DB_TBL_PREFIX,$user_id); 
$result=mysql_query($query,$GLOBALS['DB']); 
if(mysql_num_rows($result)){ 
$row=mysql_fetch_assoc($result); 
$user->username=$row['USERNAME']; 
$user->password=$row['PASSWORD']; 
$user->emailAddr=$row['EMAIL_ADDR']; 
$user->isActive=$row['IS_ACTIVE']; 
ChromePhp::log($user_id); 
$user->uid=$user_id; 
} 
mysql_free_result($result); 
return $user; 
} 
//return an object populated based on the record's username 
public static function getByUsername($username){ 
$user=new User(); 
$query=sprintf('SELECT USER_ID,PASSWORD,EMAIL_ADDR,IS_ACTIVE '. 
'FROM %sUSER WHERE USERNAME="%s"',DB_TBL_PREFIX,mysql_real_escape_string($username,$GLOBALS['DB'])); 
$result=mysql_query($query,$GLOBALS['DB']); 
if(mysql_num_rows($result)){ 
$row=mysql_fetch_assoc($result); 
$user->username=$username; 
$user->password=$row['PASSWORD']; 
$user->emailAddr=$row['EMAIL_ADDR']; 
$user->isActive=$row['IS_ACTIVE']; 
$user->uid=$row['USER_ID']; 
} 
mysql_free_result($result); 
return $user; 
} 
//save the record to the database 
public function save(){ 
//update existing user's information 
if($this->uid){ 
$query = sprintf('UPDATE %sUSER SET USERNAME = "%s", ' . 
'PASSWORD = "%s", EMAIL_ADDR = "%s", IS_ACTIVE = %d ' . 
'WHERE USER_ID = %d', 
DB_TBL_PREFIX, 
mysql_real_escape_string($this->username, $GLOBALS['DB']), 
mysql_real_escape_string($this->password, $GLOBALS['DB']), 
mysql_real_escape_string($this->emailAddr, $GLOBALS['DB']), 
$this->isActive, 
$this->userId); 
return mysql_query($query, $GLOBALS['DB']); 
}else{ 
//create a new user 
$query=sprintf('INSERT INTO %sUSER(USERNAME,PASSWORD,' . 
'EMAIL_ADDR,IS_ACTIVE) VALUES ("%s","%s","%s",%d)', 
DB_TBL_PREFIX, 
mysql_real_escape_string($this->username,$GLOBALS['DB']), 
mysql_real_escape_string($this->password,$GLOBALS['DB']), 
mysql_real_escape_string($this->emailAddr,$GLOBALS['DB']), 
$this->isActive); 
if(mysql_query($query,$GLOBALS['DB'])){ 
$this->uid=mysql_insert_id($GLOBALS['DB']); 
return true; 
}else{ 
return false; 
} 
} 
} 
//set the record as inactive and return an activation token 
public function setInactive(){ 
$this->isActive=false; 
$this->save(); 
$token=random_text(5); 
$query=sprintf('INSERT INTO %sPENDING (USER_ID,TOKEN)' . 
'VALUES (%d,"%s")',DB_TBL_PREFIX,$this->uid,$token); 
return (mysql_query($query,$GLOBALS['DB']))?$token:false; 
} 
//clear the user's pending status and set the record as active 
public function setActive($token){ 
$query=sprintf('SELECT TOKEN FROM %sPENDING WHERE USER_ID=%d ' . 
'AND TOKEN="%s"',DB_TBL_PREFIX,$this->uid,mysql_real_escape_string($token,$GLOBALS['DB'])); 
$result=mysql_query($query,$GLOBALS['DB']); 
if(!mysql_num_rows(($result))){ 
mysql_free_result($result); 
return false; 
}else{ 
mysql_free_result($result); 
$query=sprintf('DELETE FROM %sPENDING WHERE USER_ID=%d ' . 
'AND TOKEN="%s"',DB_TBL_PREFIX,$this->uid,mysql_real_escape_string($token,$GLOBALS['DB'])); 
if(!mysql_query($query,$GLOBALS['DB'])){ 
return false; 
}else{ 
$this->isActive=true; 
return $this->save(); 
} 
} 
} 
} 
?>

如何使用:
<?php 
//create user instance 
$u=new User(); 
$u->username='jack'; 
$u->password=sha1('gogo'); 
$u->emailAddr='zjczoo@gmail.com'; 
$u->save();//save this user 
?>

<?php 
$u=User::getByUsername('jack');//update user('jack') 
$u->password=sha1('newgogo'); 
$u->save();//save new jack 
?>

:验证码类:这个比较简单,你可以自己加个图片==
<?php 
//must start or continue session and save CAPTCHA string in $_SESSION for 
//it to be available to other requests 
if(!isset($_SESSION)){ 
session_start(); 
header('Cache-control:private'); 
} 
//create a 65*20 pixel image 
$width=65; 
$height=20; 
$image=imagecreate(65,20); 
//fill the image background color 
$bg_color=imagecolorallocate($image,0x33,0x66,0xFF); 
imagefilledrectangle($image,0,0,$width,$height,$bg_color); 
//fetch random text 
$text=random_text(5); 
//determine x and y coordinates for centering text 
$font=5; 
$x=imagesx($image)/2-strlen($text)*imagefontwidth($font)/2; 
$y=imagesy($image)/2-imagefontheight($font)/2; 
//write text on image 
$fg_color=imagecolorallocate($image,0xFF,0xFF,0xFF); 
imagestring($image,$font,$x,$y,$text,$fg_color); 
//save the CAPTCHA string for later comparison 
$_SESSION['captcha']=$text; 
//output the image 
header('Content-type:image/png'); 
imagepng($image); 
imagedestroy($image); 
?>

另外,该类用到了random_text()函数,代码如下:
<?php 
function random_text($count,$rm_similar=false){ 
$chars=array_flip(array_merge(range(0,9),range('A','Z'))); 
if($rm_similar){ 
unset($chars[0],$chars[1],$chars[2],$chars[5],$chars[8],$chars['B'],$chars['I'],$chars['O'],$chars['Q'],$chars['S'],$chars['V'],$chars['Z']); 
} 
for($i=0,$text='';$i<$count;$i++){ 
$text.=array_rand($chars); 
} 
return $text; 
} 
?>

连接数据库类:
<?php 
// database connection and schema constants 
define('DB_HOST', 'localhost'); 
define('DB_USER', 'username'); 
define('DB_PASSWORD', 'yourpassword'); 
define('DB_SCHEMA', 'WROX_DATABASE'); 
define('DB_TBL_PREFIX', 'WROX_'); 
// establish a connection to the database server 
if (!$GLOBALS['DB'] = mysql_connect(DB_HOST, DB_USER, DB_PASSWORD)) 
{ 
die('Error: Unable to connect to database server.'); 
} 
if (!mysql_select_db(DB_SCHEMA, $GLOBALS['DB'])) 
{ 
mysql_close($GLOBALS['DB']); 
die('Error: Unable to select database schema.'); 
} 
?>

sql语句:
DROP TABLE IF EXISTS WROX_PENDING; 
DROP TABLE IF EXISTS WROX_USER; 
CREATE TABLE WROX_USER ( 
USER_ID INTEGER UNSIGNED NOT NULL AUTO_INCREMENT, 
USERNAME VARCHAR(20) NOT NULL, 
PASSWORD CHAR(40) NOT NULL, 
EMAIL_ADDR VARCHAR(100) NOT NULL, 
IS_ACTIVE TINYINT(1) DEFAULT 0, 
PRIMARY KEY (USER_ID) 
) 
ENGINE=MyISAM DEFAULT CHARACTER SET gb2312 
COLLATE gb2312_chinese_ci AUTO_INCREMENT=0; 
CREATE TABLE WROX_PENDING ( 
USER_ID INTEGER UNSIGNED PRIMARY KEY NOT NULL, 
TOKEN CHAR(10) NOT NULL, 
CREATED_DATE TIMESTAMP DEFAULT CURRENT_TIMESTAMP, 
FOREIGN KEY (USER_ID) 
REFERENCES WROX_USER(USER_ID) 
) 
ENGINE=MyISAM DEFAULT CHARACTER SET gb2312 
COLLATE gb2312_chinese_ci;
PHP 相关文章推荐
MYSQL数据库初学者使用指南
Nov 16 PHP
PHP实现MySQL更新记录的代码
Jun 07 PHP
php以post形式发送xml的方法
Nov 04 PHP
PHPExcel内存泄漏问题解决方法
Jan 23 PHP
PHP设置进度条的方法
Jul 08 PHP
PHP7.0版本备注
Jul 23 PHP
PHP购物车类Cart.class.php定义与用法示例
Jul 20 PHP
Thinkphp框架中D方法与M方法的区别
Dec 23 PHP
PHPMailer发送邮件
Dec 28 PHP
PHP+redis实现的限制抢购防止商品超发功能详解
Sep 19 PHP
laravel-admin 管理平台获取当前登陆用户信息的例子
Oct 08 PHP
PHP cookie与session会话基本用法实例分析
Nov 18 PHP
PHP无刷新上传文件实现代码
Sep 19 #PHP
PHP通过正则表达式下载图片到本地的实现代码
Sep 19 #PHP
PHP下利用shell后台运行PHP脚本,并获取该脚本的Process ID的代码
Sep 19 #PHP
php去除重复字的实现代码
Sep 16 #PHP
PHP与SQL注入攻击防范小技巧
Sep 16 #PHP
php中判断字符串是否全是中文或含有中文的实现代码
Sep 16 #PHP
php中模拟POST传递数据的两种方法分享
Sep 16 #PHP
You might like
搜索附近的人PHP实现代码
2018/02/11 PHP
PHP基于session.upload_progress 实现文件上传进度显示功能详解
2019/08/09 PHP
javascript dom 基本操作小结
2010/04/11 Javascript
jQuery判断当前点击的是第几个li的代码
2014/09/26 Javascript
Javascript中的几种URL编码方法比较
2015/01/23 Javascript
JS中使用apply、bind实现为函数或者类传入动态个数的参数
2016/04/26 Javascript
Javascript中浏览器窗口的基本操作总结
2016/08/18 Javascript
JS类的定义与使用方法深入探索
2016/11/26 Javascript
DropDownList实现可输入可选择(两种版本可选)
2016/12/07 Javascript
详解Jquery的事件操作和文档操作
2016/12/19 Javascript
JavaScript实现时钟滴答声效果
2017/01/29 Javascript
JS+CSS实现下拉刷新/上拉加载插件
2017/03/31 Javascript
Vue2.0 多 Tab切换组件的封装实例
2017/07/28 Javascript
利用百度地图API获取当前位置信息的实例
2017/11/06 Javascript
vue.js中ref和$refs的使用及示例讲解
2019/08/14 Javascript
layui radio点击事件实现input显示和隐藏的例子
2019/09/02 Javascript
JavaScript实现省市区三级联动
2020/02/13 Javascript
详细分析Node.js 多进程
2020/06/22 Javascript
[01:10]DOTA2次级职业联赛 - EP战队宣传片
2014/12/01 DOTA
[47:26]完美世界DOTA2联赛 LBZS vs Forest 第二场 11.07
2020/11/09 DOTA
在Django的模板中使用认证数据的方法
2015/07/23 Python
用Python读取几十万行文本数据
2018/12/24 Python
Python-ElasticSearch搜索查询的讲解
2019/02/25 Python
python自动化之Ansible的安装教程
2019/06/13 Python
详解Python Matplotlib解决绘图X轴值不按数组排序问题
2019/08/05 Python
通过 Python 和 OpenCV 实现目标数量监控
2020/01/05 Python
python shell命令行中import多层目录下的模块操作
2020/03/09 Python
Python如何实现远程方法调用
2020/08/07 Python
Python模块常用四种安装方式
2020/10/20 Python
python日志通过不同的等级打印不同的颜色(示例代码)
2021/01/13 Python
微软俄罗斯官方网站:Microsoft俄罗斯
2016/09/18 全球购物
施工人员岗位职责
2013/12/12 职场文书
求职信写作要突出重点
2014/01/01 职场文书
3.15国际消费者权益日主题活动活动总结
2014/03/16 职场文书
个人股份合作协议书
2014/10/24 职场文书
2014年招商引资工作总结
2014/11/22 职场文书