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实现多服务器session共享之NFS共享的方法
Mar 16 PHP
PHP Squid中可缓存的动态网页设计
Sep 17 PHP
如何使用Strace调试工具
Jun 03 PHP
smarty获得当前url的方法分享
Feb 14 PHP
php实现上传图片生成缩略图示例
Apr 13 PHP
PHP采集类snoopy详细介绍(snoopy使用教程)
Jun 19 PHP
在win系统安装配置 Memcached for PHP 5.3 图文教程
Mar 03 PHP
Netbeans 8.2与PHP相关的新特性介绍
Oct 08 PHP
php 多文件上传的实现实例
Oct 23 PHP
PHP实现求解最长公共子串问题的方法
Nov 17 PHP
thinkPHP框架通过Redis实现增删改查操作的方法详解
May 13 PHP
Yii框架布局文件的动态切换操作示例
Nov 11 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实现文本数据导入SQL SERVER
2015/05/17 PHP
php去掉文件前几行的方法
2015/07/29 PHP
php处理复杂xml数据示例
2016/07/11 PHP
ThinkPHP中调用PHPExcel的实现代码
2017/04/08 PHP
thinkphp5 加载静态资源路径与常量的方法
2017/12/24 PHP
Laravel5.7 Eloquent ORM快速入门详解
2019/04/12 PHP
laravel 创建命令行命令的图文教程
2019/10/23 PHP
Javascript base64编码实现代码
2011/12/02 Javascript
jquery创建一个新的节点对象(自定义结构/内容)的好方法
2013/01/21 Javascript
node.js 动态执行脚本
2016/06/02 Javascript
jQuery自适应轮播图插件Swiper用法示例
2016/08/24 Javascript
JS前端开发判断是否是手机端并跳转操作(小结)
2017/02/05 Javascript
Vue中的数据监听和数据交互案例解析
2017/07/12 Javascript
使用JavaScript开发跨平台的桌面应用详解
2017/07/27 Javascript
jQuery实现表格冻结顶栏效果
2017/08/20 jQuery
vue2.0 element-ui中el-select选择器无法显示选中的内容(解决方法)
2018/08/24 Javascript
JS数组Reduce方法功能与用法实例详解
2020/04/29 Javascript
React 条件渲染最佳实践小结(7种)
2020/09/27 Javascript
[51:39]DOTA2-DPC中国联赛 正赛 Magma vs LBZS BO3 第二场 2月7日
2021/03/11 DOTA
Python中Continue语句的用法的举例详解
2015/05/14 Python
Python 多进程和数据传递的理解
2017/10/09 Python
python Crypto模块的安装与使用方法
2017/12/21 Python
Python3中的bytes和str类型详解
2019/05/02 Python
python pandas写入excel文件的方法示例
2019/06/25 Python
Python 整行读取文本方法并去掉readlines换行\n操作
2020/09/03 Python
Python GUI之tkinter窗口视窗教程大集合(推荐)
2020/10/20 Python
python中yield的用法详解
2021/01/13 Python
CSS3的文字阴影—text-shadow的使用方法
2012/12/25 HTML / CSS
化验室技术员岗位职责
2013/12/24 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
个人贷款收入证明
2014/10/26 职场文书
2014年法制宣传日活动方案
2014/11/02 职场文书
茶楼服务员岗位职责
2015/02/09 职场文书
python Tkinter的简单入门教程
2021/04/11 Python
python3操作redis实现List列表实例
2021/08/04 Python
vue 实现弹窗关闭后刷新效果
2022/04/08 Vue.js