PHP学习笔记 用户注册模块用户类以及验证码类
author:一佰互联 2019-04-30   click:146
所以,把第一章,可重用类的代码贴出来,便于以后查阅以及供给有需要的朋友。
: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;