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 相关文章推荐
提升PHP执行速度全攻略(下)
Oct 09 PHP
PHP memcache扩展的三种安装方法
Apr 26 PHP
初学CAKEPHP 基础教程
Nov 02 PHP
解析php中call_user_func_array的作用
Jun 07 PHP
php生成N个不重复的随机数实例
Nov 12 PHP
PHP操作mysql数据库分表的方法
Jun 09 PHP
Yii控制器中操作视图js的方法
Jul 04 PHP
Yii2简单实现给表单添加验证码的方法
Jul 18 PHP
基于win2003虚拟机中apache服务器的访问
Aug 01 PHP
PHP序列化的四种实现方法与横向对比
Nov 29 PHP
PHP实现微信提现(企业付款到零钱)
Aug 01 PHP
php use和include区别总结
Oct 13 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实现图片添加描边字和马赛克的方法
2014/12/10 PHP
PHP使用new StdClass()创建空对象的方法分析
2017/06/06 PHP
php转换上传word文件为PDF的方法【基于COM组件】
2019/06/10 PHP
PHP封装请求类实例分析【基于Yii框架】
2019/10/17 PHP
php高性能日志系统 seaslog 的安装与使用方法分析
2020/02/29 PHP
javascript得到XML某节点的子节点个数的脚本
2008/10/11 Javascript
dropdownlist之间的互相联动实现(显示与隐藏)
2009/11/24 Javascript
js二级地域选择的实现方法
2013/06/17 Javascript
JS字符串截取函数实例
2013/12/27 Javascript
js超时调用setTimeout和间歇调用setInterval实例分析
2015/01/28 Javascript
很实用的js选项卡切换效果
2016/08/12 Javascript
AngularJS实现页面跳转后自动弹出对话框实例代码
2017/08/02 Javascript
swiper 自动图片无限轮播实现代码
2018/05/21 Javascript
小程序封装路由文件和路由方法(5种全解析)
2019/05/26 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
JS箭头函数和常规函数之间的区别实例分析【 5 个区别】
2020/05/27 Javascript
快速解决vue2+vue-cli3项目ie兼容的问题
2020/11/17 Vue.js
[00:36]DOTA2勇士令状莱恩声望物品——冥晶之厄展示
2018/05/25 DOTA
在Python的框架中为MySQL实现restful接口的教程
2015/04/08 Python
Python绘制3d螺旋曲线图实例代码
2017/12/20 Python
django框架CSRF防护原理与用法分析
2019/07/22 Python
python threading和multiprocessing模块基本用法实例分析
2019/07/25 Python
pyinstaller打包opencv和numpy程序运行错误解决
2019/08/16 Python
pytorch三层全连接层实现手写字母识别方式
2020/01/14 Python
opencv+python实现鼠标点击图像,输出该点的RGB和HSV值
2020/06/02 Python
python代码能做成软件吗
2020/07/24 Python
详解Python中list[::-1]的几种用法
2020/11/16 Python
如何设置PyCharm中的Python代码模版(推荐)
2020/11/20 Python
css3旋转木马_动力节点Java学院整理
2017/07/12 HTML / CSS
ruby如何进行集成操作?Ruby能进行多重继承吗?
2013/10/16 面试题
教师绩效工资方案
2014/02/01 职场文书
村干部培训方案
2014/05/02 职场文书
企业法人代表授权委托书
2014/10/02 职场文书
2014年妇产科工作总结
2014/12/08 职场文书
敬老院活动感想
2015/08/07 职场文书
一文了解MySQL二级索引的查询过程
2022/02/24 MySQL