由于需要搭建一个简单的框架来进行API接口开发,所以简单的mvc框架当然是首选.最原始,最简洁的mvc框架.下面来介绍下.

一. 项目目录结构:

app 
|-controller    存放控制器文件 
|-model        存放模型文件 
|-view        存放视图文件

core
|-lib        存放自定义类库 
|-config    存放配置文件 
|--config.php   系统配置文件

|--conn.php   数据库连接文件

|--db_config.php   数据库配置文件 
|-mysql_db.php    数据库类文件

|-runtime    缓存文件

db_caches 数据库缓存文件

logs日志文件

|-index.php    入口文件

| -dispatcher.php

| -loader.php

| -router.php

二.项目架构

1.先介绍index.php,附源码:

<?php
include("./core/ini.php");
include("./core/config/config.php");
include("./core/global.fun.php");
include("./core/common.php");initializer::initialize();//加载将要用到的目录文件,即调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
$router = loader::load("router");//加载URL处理文件,对url进行解析--加载loader函数的静态函数load
dispatcher::dispatch($router);//router.php文件,这个文件的作用就是映射URL,对URL进行解析.根据解析到的URL参数加载相关controller及action
?>

2.初始化项目文件 ./core/ini.php 源码:

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . "core/main");
//set_include_path — Sets the include_path configuration option
function __autoload($object){require_once("{$object}.php");
}

这个文件首先设置了include_path,也就是我们如果要找包含的文件,告诉系统在这个目录下查找。其实我们定义__autoload()方法,这个方法是在PHP5增加的,就是当我们实例化一个函数的时候,如果本文件没有,就会自动去加载文件

3.加载系统配置文件./core/config.php 源码:

<?php/** 设置页面编码格式*/header("content-type:text/html;charset=utf-8");//禁用错误报告error_reporting(0);date_default_timezone_set("PRC");//定义常量define("URL_PATH","http://blog.csdn.net/haiqiao_2010");//服务器IPdefine('IMG_PATH',"http://blog.csdn.net/haiqiao_2010");//服务器图片目录//判断日志是否开启defined("APP_LOG") or define("APP_LOG",true);if (APP_LOG) {$GLOBALS['log'] = new APIlog();set_exception_handler(array($GLOBALS['log'],'quit'));set_error_handler(array($GLOBALS['log'],'error_handle'));}define('IS_CGI',substr(PHP_SAPI, 0,3)=='cgi' ? 1 : 0 );define('IS_WIN',strstr(PHP_OS, 'WIN') ? 1 : 0 );define('IS_CLI',PHP_SAPI=='cli'? 1   :   0);if(!defined('APP_NAME')) define('APP_NAME', basename(dirname($_SERVER['SCRIPT_FILENAME'])));if(!IS_CLI) {// 当前文件名if(!defined('_PHP_FILE_')) {if(IS_CGI) {//CGI/FASTCGI模式下$_temp  = explode('.php',$_SERVER["PHP_SELF"]);define('_PHP_FILE_',  rtrim(str_replace($_SERVER["HTTP_HOST"],'',$_temp[0].'.php'),'/'));}else {define('_PHP_FILE_',    rtrim($_SERVER["SCRIPT_NAME"],'/'));}}if(!defined('__ROOT__')) {// 网站URL根目录if( strtoupper(APP_NAME) == strtoupper(basename(dirname(_PHP_FILE_))) ) {$_root = dirname(dirname(_PHP_FILE_));}else {$_root = dirname(_PHP_FILE_);}define('__ROOT__',   (($_root=='/' || $_root=='\\')?'':$_root));}//支持的URL模式define('URL_COMMON',      0);   //普通模式define('URL_PATHINFO',    1);   //PATHINFO模式define('URL_REWRITE',     2);   //REWRITE模式define('URL_COMPAT',      3);   // 兼容模式}if(!defined('APP_ROOT')) {//项目根路径// 网站URL根目录$_root = dirname(_PHP_FILE_);$_root = (($_root=='/' || $_root=='\\')?'':$_root);$_root = str_replace("/system","",$_root);define('APP_ROOT', $_root  );}if(!defined('APP_ROOT_PATH'))//项目绝对路径define('APP_ROOT_PATH', str_replace("\\","/",substr(dirname(__FILE__),0,-11)));if(!defined('PAGE_SIZE'))//im:页面大小define('PAGE_SIZE',15);?>

4.加载通用的方法的文件./core/global_fun.php 源码:

<?php//header("content-type:text/html;charset=utf-8");/*
    *   过滤sql语句的关键字
    */function strip_sql($string){
       global $search_arr,$replace_arr;
       return is_array($string) ? array_map('strip_sql', $string) : preg_replace($search_arr, $replace_arr, $string);}function new_htmlspecialchars($string){
        return is_array($string) ? array_map('new_htmlspecialchars', $string) : htmlspecialchars($string,ENT_QUOTES);}function new_addslashes($string){
        if(!is_array($string)) return addslashes($string);
        foreach($string as $key => $val) $string[$key] = new_addslashes($val);
        return $string;}function new_stripslashes($string){
        if(!is_array($string)) return stripslashes($string);
        foreach($string as $key => $val) $string[$key] = new_stripslashes($val);
        return $string;}function strip_textarea($string){
        return nl2br(str_replace(' ', '&nbsp;', htmlspecialchars($string, ENT_QUOTES)));}function strip_js($string, $js = 1){
        $string = str_replace(array("\n","\r","\""),array('','',"\\\""),$string);
        return $js==1 ? "document.write(\"".$string."\");\n" : $string;}//邮件格式验证的函数function check_email($email){    if(!preg_match("/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/",$email))    {       return false;   }   else        return true;}//验证手机号码function check_mobile($mobile){        $pattern = "/^1\d{10}$/";        if (preg_match($pattern,$mobile))       {           Return true;        }       else        {           Return false;       }}//获取GMTimefunction get_gmtime(){  return (time() - date('Z'));}function to_date($utc_time, $format = 'Y-m-d H:i:s') {    if (empty ( $utc_time )) {      return '';    }   $timezone = 8; $time = $utc_time + $timezone * 3600; return date ($format, $time );}function to_timespan($str, $format = 'Y-m-d H:i:s'){  $timezone = 8; $time = intval(strtotime($str));   if($time!=0)       $time = $time - $timezone * 3600;  return $time;}function get_http(){  return (isset($_SERVER['HTTPS']) && (strtolower($_SERVER['HTTPS']) != 'off')) ? 'https://' : 'http://';}function get_domain(){   /* 协议 */    $protocol = get_http();    /* 域名或IP地址 */   if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {       $host = $_SERVER['HTTP_X_FORWARDED_HOST'];   }   elseif (isset($_SERVER['HTTP_HOST'])) {       $host = $_SERVER['HTTP_HOST'];   }   else    {       /* 端口 */        if (isset($_SERVER['SERVER_PORT']))       {           $port = ':' . $_SERVER['SERVER_PORT'];         if ((':80' == $port && 'http://' == $protocol) || (':443' == $port && 'https://' == $protocol))         {               $port = '';          }       }       else        {           $port = '';      }       if (isset($_SERVER['SERVER_NAME']))       {           $host = $_SERVER['SERVER_NAME'] . $port;     }       elseif (isset($_SERVER['SERVER_ADDR']))       {           $host = $_SERVER['SERVER_ADDR'] . $port;     }   }   return $protocol . $host;}function get_host(){  /* 域名或IP地址 */   if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {       $host = $_SERVER['HTTP_X_FORWARDED_HOST'];   }   elseif (isset($_SERVER['HTTP_HOST'])) {       $host = $_SERVER['HTTP_HOST'];   }   else    {       if (isset($_SERVER['SERVER_NAME']))       {           $host = $_SERVER['SERVER_NAME'];     }       elseif (isset($_SERVER['SERVER_ADDR']))       {           $host = $_SERVER['SERVER_ADDR'];     }   }   return $host;}/** 实现AES加密
* $str : 要加密的字符串
* $keys : 加密密钥
* $iv : 加密向量
* $cipher_alg : 加密方式
*/
function aes_ecryptdString($str,$keys="1034567890666450",$iv="1034567890123450",$cipher_alg=MCRYPT_RIJNDAEL_128){
//  $encrypted_string= base64_encode(bin2hex(mcrypt_encrypt($cipher_alg,$keys, $str, MCRYPT_MODE_CBC,$iv)));
    $encrypted_string= bin2hex(mcrypt_encrypt($cipher_alg,$keys, $str, MCRYPT_MODE_CBC,$iv));
    return $encrypted_string;
}/** 实现AES解密
* $str : 要解密的字符串
* $keys : 加密密钥
* $iv : 加密向量
* $cipher_alg : 加密方式
*/
function aes_decryptString($str,$keys="1034567890666450",$iv="1034567890123450",$cipher_alg=MCRYPT_RIJNDAEL_128){
//  $str= base64_decode($str);
    $decrypted_string= mcrypt_decrypt($cipher_alg,$keys,pack("H*",$str),MCRYPT_MODE_CBC,$iv);
    return $decrypted_string;
}/*** 对数组进行转码操作* @param $array* @param $in_charset* @param $out_charset*/
function iconv_array(&$array,$in_charset,$out_charset)
{
    if(UC_CHARSET!='utf-8')
    {
        foreach($array as $k=>$v)
        {
            if(is_array($array[$k]))
            {
                iconv_array($array[$k],$in_charset,$out_charset);
            }
            else
            {
                $array[$k] = iconv($in_charset,$out_charset,$array[$k]);
            }
        }
    }
}/*** utf8字符转Unicode字符* @param string $char 要转换的单字符* @return void*/
function utf8_to_unicode($char)
{
    switch(strlen($char))
    {
        case 1:
            return ord($char);
        case 2:
            $n = (ord($char[0]) & 0x3f) << 6;
            $n += ord($char[1]) & 0x3f;
            return $n;
        case 3:
            $n = (ord($char[0]) & 0x1f) << 12;
            $n += (ord($char[1]) & 0x3f) << 6;
            $n += ord($char[2]) & 0x3f;
            return $n;
        case 4:
            $n = (ord($char[0]) & 0x0f) << 18;
            $n += (ord($char[1]) & 0x3f) << 12;
            $n += (ord($char[2]) & 0x3f) << 6;
            $n += ord($char[3]) & 0x3f;
            return $n;
    }
}/*** utf8字符串分隔为unicode字符串* @param string $str 要转换的字符串* @param string $depart 分隔,默认为空格为单字* @return string*/
function str_to_unicode_word($str,$depart=' ')
{
    $arr = array();
    $str_len = mb_strlen($str,'utf-8');
    for($i = 0;$i < $str_len;$i++)
    {
        $s = mb_substr($str,$i,1,'utf-8');
        if($s != ' ' && $s != ' ')
            {
            $arr[] = 'ux'.utf8_to_unicode($s);
        }
    }
return implode($depart,$arr);
}/*** utf8字符串分隔为unicode字符串* @param string $str 要转换的字符串* @return string*/
function str_to_unicode_string($str)
{
    $string = str_to_unicode_word($str,'');
    return $string;
}//分词
function div_str($str)
{
    require_once APP_ROOT_PATH."core/lib/words.php";
    $words = words::segment($str);
    $words[] = $str;
    return $words;
}/*** @desc  im:十进制数转换成三十六机制数* @param (int)$num 十进制数* return 返回:三十六进制数*/
function get_code_bynum($num) {
    $num = intval($num);
    if ($num <= 0)
        return false;
    $codeArr = array("0","1","2","3","4","5","6","7","8","9",'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z');
    $code = '';
    do {
        $key = ($num - 1) % 36;
        $code = $codeArr[$key] . $code;
        $num = floor(($num - $key) / 36);
    } while ($num > 0);
    return $code;
}/*** @desc  im:三十六进制数转换成十机制数* @param (string)$str 三十六进制数* return 返回:十进制数*/
function get_num_bycode($str){
    $array=array("0","1","2","3","4","5","6","7","8","9","A", "B", "C", "D","E", "F", "G", "H", "I", "J", "K", "L","M", "N", "O","P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y","Z");
    $len=strlen($str);
    for($i=0;$i<$len;$i++){
        $index=array_search($str[$i],$array);
        $sum+=($index+1)*pow(36,$len-$i-1);
    }
    return $sum;
}?>

5.加载公共方法的文件./core/common.php 源码:

<?php
function app_conf($name)
{return  $GLOBALS['db']->getOne("select value from ".DB_PREFIX."conf where name='".$name."'");
}/** @des:im:验证手机号码
* @param:$phone
*/
function check_phone($phone)
{if(!empty($phone) && !preg_match("/^1\d{10}$/",$phone)){return false;}elsereturn true;
}/*** @desc  get_pwd_strength()im:根据密码字符串判断密码结构* @param (string)$mobile* return 返回:$msg*/
function get_pwd_strength($pwd){if (strlen(iconv('UTF-8','GBK',$pwd))>30 || strlen(iconv('UTF-8','GBK',$pwd))<6){return '密码是6-30位的字符串,且必须由字母和数字组成.';}if(preg_match("/^\d+$/",$pwd)){return '密码不能为全数字';//全数字}if(preg_match("/^[a-z]+$/i",$pwd)){return '密码不能为全字母';//全字母}if(!preg_match("/^[A-Za-z0-9]+$/",$pwd)){return '密码只能包含字母和数字';//有数字有字母    ";}return null;
}/*ajax返回*/
function ajax_return($data)
{header("Content-Type:text/html; charset=utf-8");echo(json_encode($data));
//  echo(base64_encode(json_encode($data)));if (APP_LOG) {$GLOBALS['log']->quit($data);}exit;
}/*** 字符串加密函数* @param string $txt* @param string $key* @return string*/
function passport_encrypt($txt, $key = 'IMEMBER_2013') {srand((double)microtime() * 1000000);$encrypt_key = md5(rand(0, 32000));$ctr = 0;$tmp = '';for($i = 0;$i < strlen($txt); $i++) {$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;$tmp .= $encrypt_key[$ctr].($txt[$i] ^ $encrypt_key[$ctr++]);}return base64_encode(passport_key($tmp, $key));
}/*** 字符串解密函数* @param string $txt* @param string $key* @return string*/
function passport_decrypt($txt, $key = 'IMEMBER_2013') {$txt = passport_key(base64_decode($txt), $key);$tmp = '';for($i = 0;$i < strlen($txt); $i++) {if (empty($txt[$i+1])) {return false;}$md5 = $txt[$i];$tmp .= $txt[++$i] ^ $md5;}return $tmp;
}function passport_key($txt, $encrypt_key) {$encrypt_key = md5($encrypt_key);$ctr = 0;$tmp = '';for($i = 0; $i < strlen($txt); $i++) {$ctr = $ctr == strlen($encrypt_key) ? 0 : $ctr;$tmp .= $txt[$i] ^ $encrypt_key[$ctr++];}return $tmp;
}/*** 传入图片的地址,自动修复图片的相对路径(如 ./public/logo.png)到绝对路径(如http://www.imember.cc/public/logo.png)* @param unknown $img_path*/
function imagePathRevise($img_path){//判断$img_path的路径是否以http://开头if (preg_match('/^http:\/\//', $img_path)) {return $img_path;}else{return IMG_PATH.preg_replace('/^\.\//', '', $img_path);}
}//utf8 字符串截取
function msubstr($str, $start=0, $length=15, $charset="utf-8", $suffix=true)
{if(function_exists("mb_substr")){$slice =  mb_substr($str, $start, $length, $charset);if($suffix&$slice!=$str) return $slice."…";return $slice;}elseif(function_exists('iconv_substr')) {return iconv_substr($str,$start,$length,$charset);}$re['utf-8']   = "/[\x01-\x7f]|[\xc2-\xdf][\x80-\xbf]|[\xe0-\xef][\x80-\xbf]{2}|[\xf0-\xff][\x80-\xbf]{3}/";$re['gb2312'] = "/[\x01-\x7f]|[\xb0-\xf7][\xa0-\xfe]/";$re['gbk']    = "/[\x01-\x7f]|[\x81-\xfe][\x40-\xfe]/";$re['big5']   = "/[\x01-\x7f]|[\x81-\xfe]([\x40-\x7e]|\xa1-\xfe])/";preg_match_all($re[$charset], $str, $match);$slice = join("",array_slice($match[0], $start, $length));if($suffix&&$slice!=$str) return $slice."…";return $slice;
}}
?>

6.加载./initializer.php,initializer()用于将所有公用的文件目录在此函数里声明

initializer::initialize();
这就话就是调用initializer类的一个静态函数initialize,因为我们在ini.php,设置了include_path,以及定义了__autoload,所以程序会自动在core/main目录查找initializer.php.
定义了一个静态函数,initialize函数,这个函数就是设置include_path,这样,以后如果包含文件,或者__autoload,就会去这些目录下查找。
<?php
class initializer
{public static function initialize()    {set_include_path(get_include_path().PATH_SEPARATOR . "core/main");set_include_path(get_include_path().PATH_SEPARATOR . "core/main/cache");set_include_path(get_include_path().PATH_SEPARATOR . "core/helpers");set_include_path(get_include_path().PATH_SEPARATOR . "core/libraries");set_include_path(get_include_path().PATH_SEPARATOR . "core/config");set_include_path(get_include_path().PATH_SEPARATOR . "app/controllers");set_include_path(get_include_path().PATH_SEPARATOR."app/models");set_include_path(get_include_path().PATH_SEPARATOR."app/views");}
}
?>

7.加载./loader.php文件,源码:

<?php
class loader
{private static $loaded = array();public static function load($object){$valid = array( "library","view","model","helper","router","config","hook","cache","db");if (!in_array($object,$valid)){
//          throw new Exception("Not a valid object '{$object}' to load");ajax_return(array('recode'=>"0003",'msg'=>"非法操作","data"=>"Not a valid object '{$object}' to load"));}if (empty(self::$loaded[$object])){self::$loaded[$object]= new $object();}return self::$loaded[$object];}
}
?>

8.加载控制层文件./router.php,源码:

<?php
class router
{private $route;private $controller;private $action;private $params;public function __construct(){//base64_decode(str)解码$routeParts=$_GET;
//      $routeParts=base64_decode($_GET);if (!isset($routeParts['c'])){ajax_return(array('recode'=>"0003",'msg'=>"非法操作",'data'=>"Controller is null"));}$this->route = $routeParts['c'];$this->controller=$routeParts['c'];$this->action=isset($routeParts['act'])? $routeParts['act']:"index";array_shift($routeParts);array_shift($routeParts);$this->params=$routeParts;}public function getAction() {if (empty($this->action)) $this->action="index";return $this->action;}public function getController()  {return $this->controller;}public function getParams()  {return $this->params;}
}
?>

9.加载数据库连接文件./core/conn.php,源码:

<?php/** 数据库连接*///第一种方法:直接写入数据库连接参数
//    $dblink=mysql_connect("127.0.0.1:3306","sara","abc123");
//    mysql_select_db("ipolarbear",$dblink);
//    mysql_query("SET NAMES UTF8");
//    if (!$dblink) {
//          mysql_query("SET NAMES UTF8");
//          die (json_encode(array('recode'=>"0009",'msg'=>"连接数据库失败" . mysql_error (),'data'=>'')));
//    }//第二种方法:定义DB类,加载数据库配置,对数据库SQL进行封装//加载数据库配置$dbcfg = require APP_ROOT_PATH."core/config/db_config.php";if(!defined('DB_PREFIX'))//im:数据库表前缀define('DB_PREFIX', $dbcfg['DB_PREFIX']);if(!file_exists(APP_ROOT_PATH.'core/runtime/db_caches/'))mkdir(APP_ROOT_PATH.'core/runtime/db_caches/',0777);$pconnect = false;$GLOBALS['db'] = new mysql_db($dbcfg['DB_HOST'].":".$dbcfg['DB_PORT'], $dbcfg['DB_USER'],$dbcfg['DB_PWD'],$dbcfg['DB_NAME'],'utf8',$pconnect);mysql_query("SET NAMES UTF8");//相当于character_set_client(),character_set_connection(),character_set_results()客户端 连接器 返回值三者同时设置编码方式//检查PHP是否连接上MYSQLif(mysqli_connect_errno()){die (json_encode(array('recode'=>"0009",'msg'=>"连接数据库失败:" . mysql_error (),'data'=>'')));}//end 定义DB?>

10.加载数据库配置文件./core/db_config.php,源码:

<?php
return array(
'DB_HOST'=>'localhost',
'DB_NAME'=>'ip',
'DB_USER'=>'sara',
'DB_PWD'=>'abc123',
'DB_PORT'=>'3306',
'DB_PREFIX'=>'base_',
);
?>

11.加载数据库类文件./core/mysql_db.php,源码:

<?phpclass mysql_db{var $link_id    = NULL;var $settings   = array();var $queryCount = 0;var $queryTime  = '';var $queryLog   = array();var $max_cache_time = 60; // 最大的缓存时间,以秒为单位var $cache_data_dir = 'core/runtime/db_caches/';var $root_path      = '';var $error_message  = array();var $platform       = '';var $version        = '';var $dbhash         = '';var $starttime      = 0;var $timeline       = 0;var $timezone       = 0;var $mysql_config_cache_file_time = 0;var $mysql_disable_cache_tables = array(); // 不允许被缓存的表,遇到将不会进行缓存function __construct($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0){$this->mysql_db($dbhost, $dbuser, $dbpw, $dbname, $charset, $pconnect, $quiet);}function mysql_db($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0){if (defined('APP_ROOT_PATH') && !$this->root_path){$this->root_path = APP_ROOT_PATH;}if ($quiet){$this->connect($dbhost, $dbuser, $dbpw, $dbname, $charset, $pconnect, $quiet);}else{$this->settings = array('dbhost'   => $dbhost,'dbuser'   => $dbuser,'dbpw'     => $dbpw,'dbname'   => $dbname,'charset'  => $charset,'pconnect' => $pconnect);}}function connect($dbhost, $dbuser, $dbpw, $dbname = '', $charset = 'utf8', $pconnect = 0, $quiet = 0){if ($pconnect){if (!($this->link_id = @mysql_pconnect($dbhost, $dbuser, $dbpw))){if (!$quiet){$this->ErrorMsg("Can't pConnect MySQL Server($dbhost)!");}return false;}}else{if (PHP_VERSION >= '4.2'){$this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw, true);}else{$this->link_id = @mysql_connect($dbhost, $dbuser, $dbpw);mt_srand((double)microtime() * 1000000); // 对 PHP 4.2 以下的版本进行随机数函数的初始化工作}if (!$this->link_id){if (!$quiet){$this->ErrorMsg("Can't Connect MySQL Server($dbhost)!");}return false;}}$this->dbhash  = md5($this->root_path . $dbhost . $dbuser . $dbpw . $dbname);$this->version = mysql_get_server_info($this->link_id);/* 如果mysql 版本是 4.1+ 以上,需要对字符集进行初始化 */if ($this->version > '4.1'){if ($charset != 'latin1'){mysql_query("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary", $this->link_id);}if ($this->version > '5.0.1'){mysql_query("SET sql_mode=''", $this->link_id);}}$sqlcache_config_file = $this->root_path . $this->cache_data_dir . 'sqlcache_config_file_' . $this->dbhash . '.php';@include($sqlcache_config_file);$this->starttime = time();if ($this->max_cache_time && $this->starttime > $this->mysql_config_cache_file_time + $this->max_cache_time){if ($dbhost != '.'){$result = mysql_query("SHOW VARIABLES LIKE 'basedir'", $this->link_id);$row    = mysql_fetch_assoc($result);if (!empty($row['Value']{1}) && $row['Value']{1} == ':' && !empty($row['Value']{2}) && $row['Value']{2} == "\\"){$this->platform = 'WINDOWS';}else{$this->platform = 'OTHER';}}else{$this->platform = 'WINDOWS';}if ($this->platform == 'OTHER' &&($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306') ||(PHP_VERSION >= '5.1' && date_default_timezone_get() == 'UTC')){$result = mysql_query("SELECT UNIX_TIMESTAMP() AS timeline, UNIX_TIMESTAMP('" . date('Y-m-d H:i:s', $this->starttime) . "') AS timezone", $this->link_id);$row    = mysql_fetch_assoc($result);if ($dbhost != '.' && strtolower($dbhost) != 'localhost:3306' && $dbhost != '127.0.0.1:3306'){$this->timeline = $this->starttime - $row['timeline'];}if (PHP_VERSION >= '5.1' && date_default_timezone_get() == 'UTC'){$this->timezone = $this->starttime - $row['timezone'];}}$content = '<' . "?php\r\n" .'$this->mysql_config_cache_file_time = ' . $this->starttime . ";\r\n" .'$this->timeline = ' . $this->timeline . ";\r\n" .'$this->timezone = ' . $this->timezone . ";\r\n" .'$this->platform = ' . "'" . $this->platform . "';\r\n?" . '>';@file_put_contents($sqlcache_config_file, $content);}/* 选择数据库 */if ($dbname){if (mysql_select_db($dbname, $this->link_id) === false ){if (!$quiet){$this->ErrorMsg("Can't select MySQL database($dbname)!");}return false;}else{return true;}}else{return true;}}function select_database($dbname){return mysql_select_db($dbname, $this->link_id);}function set_mysql_charset($charset){/* 如果mysql 版本是 4.1+ 以上,需要对字符集进行初始化 */if ($this->version > '4.1'){if (in_array(strtolower($charset), array('gbk', 'big5', 'utf-8', 'utf8'))){$charset = str_replace('-', '', $charset);}if ($charset != 'latin1'){mysql_query("SET character_set_connection=$charset, character_set_results=$charset, character_set_client=binary", $this->link_id);}}}function fetch_array($query, $result_type = MYSQL_ASSOC){return mysql_fetch_array($query, $result_type);}function query($sql, $type = ''){if ($this->link_id === NULL){$this->connect($this->settings['dbhost'], $this->settings['dbuser'], $this->settings['dbpw'], $this->settings['dbname'], $this->settings['charset'], $this->settings['pconnect']);$this->settings = array();}if ($this->queryCount++ <= 99){$this->queryLog[] = $sql;}if ($this->queryTime == ''){if (PHP_VERSION >= '5.0.0'){$this->queryTime = microtime(true);}else{$this->queryTime = microtime();}}/* 当当前的时间大于类初始化时间的时候,自动执行 ping 这个自动重新连接操作 */if (PHP_VERSION >= '4.3' && time() > $this->starttime + 1){mysql_ping($this->link_id);}if (!($query = mysql_query($sql, $this->link_id)) && $type != 'SILENT'){$this->error_message[]['message'] = 'MySQL Query Error';$this->error_message[]['sql'] = $sql;$this->error_message[]['error'] = mysql_error($this->link_id);$this->error_message[]['errno'] = mysql_errno($this->link_id);$this->ErrorMsg();return false;}if (defined('DEBUG_MODE') && (DEBUG_MODE & 8) == 8){$logfilename = $this->root_path . DATA_DIR . '/mysql_query_' . $this->dbhash . '_' . date('Y_m_d') . '.log';$str = $sql . "\n\n";if (PHP_VERSION >= '5.0'){file_put_contents($logfilename, $str, FILE_APPEND);}else{$fp = @fopen($logfilename, 'ab+');if ($fp){fwrite($fp, $str);fclose($fp);}}}//echo $sql."<br/><br/>======================================<br/><br/>";return $query;}function affected_rows(){return mysql_affected_rows($this->link_id);}function error(){return mysql_error($this->link_id);}function errno(){return mysql_errno($this->link_id);}function result($query, $row){return @mysql_result($query, $row);}function num_rows($query){return mysql_num_rows($query);}function num_fields($query){return mysql_num_fields($query);}function free_result($query){return mysql_free_result($query);}function insert_id(){return mysql_insert_id($this->link_id);}function fetchRow($query){return mysql_fetch_assoc($query);}function fetch_fields($query){return mysql_fetch_field($query);}function version(){return $this->version;}function ping(){if (PHP_VERSION >= '4.3'){return mysql_ping($this->link_id);}else{return false;}}function escape_string($unescaped_string){if (PHP_VERSION >= '4.3'){return mysql_real_escape_string($unescaped_string);}else{return mysql_escape_string($unescaped_string);}}function close(){return mysql_close($this->link_id);}function ErrorMsg($message = '', $sql = ''){if ($message){ajax_return(array('recode'=>"0009",'msg'=>"MySQL server error info:".$message,'data'=>''));}else{ajax_return(array('recode'=>"0010",'msg'=>"MySQL server error report:".$this->error_message,'data'=>''));}}/* 仿真 Adodb 函数 */function selectLimit($sql, $num, $start = 0){if ($start == 0){$sql .= ' LIMIT ' . $num;}else{$sql .= ' LIMIT ' . $start . ', ' . $num;}return $this->query($sql);}function getOne($sql, $limited = false){if ($limited == true){$sql = trim($sql . ' LIMIT 1');}$res = $this->query($sql);if ($res !== false){$row = mysql_fetch_row($res);if ($row !== false){return $row[0];}else{return '';}}else{return false;}}function getOneCached($sql, $cached = 'FILEFIRST'){$cachefirst = ($cached == 'FILEFIRST' || ($cached == 'MYSQLFIRST' && $this->platform != 'WINDOWS')) && $this->max_cache_time;if (!$cachefirst){return $this->getOne($sql, true);}else{$result = $this->getSqlCacheData($sql, $cached);if (empty($result['storecache']) == true){return $result['data'];}}$arr = $this->getOne($sql, true);if ($arr !== false && $cachefirst){$this->setSqlCacheData($result, $arr);}return $arr;}function getAll($sql){$res = $this->query($sql);if ($res !== false){$arr = array();while ($row = mysql_fetch_assoc($res)){$arr[] = $row;}return $arr;}else{return false;}}function getAllCached($sql, $cached = 'FILEFIRST'){$cachefirst = ($cached == 'FILEFIRST' || ($cached == 'MYSQLFIRST' && $this->platform != 'WINDOWS')) && $this->max_cache_time;if (!$cachefirst){return $this->getAll($sql);}else{$result = $this->getSqlCacheData($sql, $cached);if (empty($result['storecache']) == true){return $result['data'];}}$arr = $this->getAll($sql);if ($arr !== false && $cachefirst){$this->setSqlCacheData($result, $arr);}return $arr;}function getRow($sql, $limited = false){if ($limited == true){$sql = trim($sql . ' LIMIT 1');}$res = $this->query($sql);if ($res !== false){return mysql_fetch_assoc($res);}else{return false;}}function getRowCached($sql, $cached = 'FILEFIRST'){$cachefirst = ($cached == 'FILEFIRST' || ($cached == 'MYSQLFIRST' && $this->platform != 'WINDOWS')) && $this->max_cache_time;if (!$cachefirst){return $this->getRow($sql, true);}else{$result = $this->getSqlCacheData($sql, $cached);if (empty($result['storecache']) == true){return $result['data'];}}$arr = $this->getRow($sql, true);if ($arr !== false && $cachefirst){$this->setSqlCacheData($result, $arr);}return $arr;}function getCol($sql){$res = $this->query($sql);if ($res !== false){$arr = array();while ($row = mysql_fetch_row($res)){$arr[] = $row[0];}return $arr;}else{return false;}}function getColCached($sql, $cached = 'FILEFIRST'){$cachefirst = ($cached == 'FILEFIRST' || ($cached == 'MYSQLFIRST' && $this->platform != 'WINDOWS')) && $this->max_cache_time;if (!$cachefirst){return $this->getCol($sql);}else{$result = $this->getSqlCacheData($sql, $cached);if (empty($result['storecache']) == true){return $result['data'];}}$arr = $this->getCol($sql);if ($arr !== false && $cachefirst){$this->setSqlCacheData($result, $arr);}return $arr;}function autoExecute($table, $field_values, $mode = 'INSERT', $where = '', $querymode = ''){$field_names = $this->getCol('DESC ' . $table);$sql = '';if ($mode == 'INSERT'){$fields = $values = array();foreach ($field_names AS $value){if (@array_key_exists($value, $field_values) == true){$fields[] = $value;$field_values[$value] = stripslashes($field_values[$value]);$values[] = "'" . addslashes($field_values[$value]) . "'";}}if (!empty($fields)){$sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';}}else{$sets = array();foreach ($field_names AS $value){if (array_key_exists($value, $field_values) == true){$field_values[$value] = stripslashes($field_values[$value]);$sets[] = $value . " = '" . addslashes($field_values[$value]) . "'";}}if (!empty($sets)){$sql = 'UPDATE ' . $table . ' SET ' . implode(', ', $sets) . ' WHERE ' . $where;}}if ($sql){return $this->query($sql, $querymode);}else{return false;}}function autoReplace($table, $field_values, $update_values, $where = '', $querymode = ''){$field_descs = $this->getAll('DESC ' . $table);$primary_keys = array();foreach ($field_descs AS $value){$field_names[] = $value['Field'];if ($value['Key'] == 'PRI'){$primary_keys[] = $value['Field'];}}$fields = $values = array();foreach ($field_names AS $value){if (array_key_exists($value, $field_values) == true){$fields[] = $value;$values[] = "'" . $field_values[$value] . "'";}}$sets = array();foreach ($update_values AS $key => $value){if (array_key_exists($key, $field_values) == true){if (is_int($value) || is_float($value)){$sets[] = $key . ' = ' . $key . ' + ' . $value;}else{$sets[] = $key . " = '" . $value . "'";}}}$sql = '';if (empty($primary_keys)){if (!empty($fields)){$sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';}}else{if ($this->version() >= '4.1'){if (!empty($fields)){$sql = 'INSERT INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';if (!empty($sets)){$sql .=  'ON DUPLICATE KEY UPDATE ' . implode(', ', $sets);}}}else{if (empty($where)){$where = array();foreach ($primary_keys AS $value){if (is_numeric($value)){$where[] = $value . ' = ' . $field_values[$value];}else{$where[] = $value . " = '" . $field_values[$value] . "'";}}$where = implode(' AND ', $where);}if ($where && (!empty($sets) || !empty($fields))){if (intval($this->getOne("SELECT COUNT(*) FROM $table WHERE $where")) > 0){if (!empty($sets)){$sql = 'UPDATE ' . $table . ' SET ' . implode(', ', $sets) . ' WHERE ' . $where;}}else{if (!empty($fields)){$sql = 'REPLACE INTO ' . $table . ' (' . implode(', ', $fields) . ') VALUES (' . implode(', ', $values) . ')';}}}}}if ($sql){return $this->query($sql, $querymode);}else{return false;}}function setMaxCacheTime($second){$this->max_cache_time = $second;}function getMaxCacheTime(){return $this->max_cache_time;}function getSqlCacheData($sql, $cached = ''){$sql = trim($sql);$result = array();$result['filename'] = $this->root_path . $this->cache_data_dir . 'sqlcache_' . abs(crc32($this->dbhash . $sql)) . '_' . md5($this->dbhash . $sql) . '.php';$result['data'] = $GLOBALS['cache']->get($result['filename']);if($result['data']===false){$result['storecache'] = true;}else{$result['storecache'] = false;}return $result;}function setSqlCacheData($result, $data){if ($result['storecache'] === true && $result['filename']){$GLOBALS['cache']->set($result['filename'],$data,$this->max_cache_time);}}/* 获取 SQL 语句中最后更新的表的时间,有多个表的情况下,返回最新的表的时间 */function table_lastupdate($tables){if ($this->link_id === NULL){$this->connect($this->settings['dbhost'], $this->settings['dbuser'], $this->settings['dbpw'], $this->settings['dbname'], $this->settings['charset'], $this->settings['pconnect']);$this->settings = array();}$lastupdatetime = '0000-00-00 00:00:00';$tables = str_replace('`', '', $tables);$this->mysql_disable_cache_tables = str_replace('`', '', $this->mysql_disable_cache_tables);foreach ($tables AS $table){if (in_array($table, $this->mysql_disable_cache_tables) == true){$lastupdatetime = '2037-12-31 23:59:59';break;}if (strstr($table, '.') != NULL){$tmp = explode('.', $table);$sql = 'SHOW TABLE STATUS FROM `' . trim($tmp[0]) . "` LIKE '" . trim($tmp[1]) . "'";}else{$sql = "SHOW TABLE STATUS LIKE '" . trim($table) . "'";}$result = mysql_query($sql, $this->link_id);$row = mysql_fetch_assoc($result);if ($row['Update_time'] > $lastupdatetime){$lastupdatetime = $row['Update_time'];}}$lastupdatetime = strtotime($lastupdatetime) - $this->timezone + $this->timeline;return $lastupdatetime;}function get_table_name($query_item){$query_item = trim($query_item);$table_names = array();/* 判断语句中是不是含有 JOIN */if (stristr($query_item, ' JOIN ') == ''){/* 解析一般的 SELECT FROM 语句 */if (preg_match('/^SELECT.*?FROM\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?(?:(?:\s*AS)?\s*`?\w+`?)?(?:\s*,\s*(?:`?\w+`?\s*\.\s*)?`?\w+`?(?:(?:\s*AS)?\s*`?\w+`?)?)*)/is', $query_item, $table_names)){$table_names = preg_replace('/((?:`?\w+`?\s*\.\s*)?`?\w+`?)[^,]*/', '\1', $table_names[1]);return preg_split('/\s*,\s*/', $table_names);}}else{/* 对含有 JOIN 的语句进行解析 */if (preg_match('/^SELECT.*?FROM\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?)(?:(?:\s*AS)?\s*`?\w+`?)?.*?JOIN.*$/is', $query_item, $table_names)){$other_table_names = array();preg_match_all('/JOIN\s*((?:`?\w+`?\s*\.\s*)?`?\w+`?)\s*/i', $query_item, $other_table_names);return array_merge(array($table_names[1]), $other_table_names[1]);}}return $table_names;}/* 设置不允许进行缓存的表 */function set_disable_cache_tables($tables){if (!is_array($tables)){$tables = explode(',', $tables);}foreach ($tables AS $table){$this->mysql_disable_cache_tables[] = $table;}array_unique($this->mysql_disable_cache_tables);}}?>

至此框架搭建完成,下面来写一个简单的例子

三.介绍简单的实例

controller控制层文件./app/controllers/user.php用户类

<?php
/*** @file: user.php 用户控制层* @version: 1.0* @author: Sara* @create: 2012-12-17 10:15:00* @update: 2012-12-17 10:15:00* @access: http://blog.csdn.net/haiqiao_2010* @copyright: 2012 http://blog.csdn.net/haiqiao_2010 All rights reserved.**/
header('Content-Type: text/html; charset=utf-8');
@require_once './core/config/conn.php';
class user
{
/** method __construct* paramemter string $a* return 提示信息/调用方法*/function __construct(){$action=@trim(@$_REQUEST['act']);if(empty($action)){$action="index";}else{if(!in_array($action,array('index','login','register','userUpdatePwd'))){ajax_return(array('recode'=>"0003",'msg'=>"非法操作",'data'=>$action));}}}/** method index 非法调用* param* return*/public function index(){ajax_return(array('recode'=>"0003",'msg'=>"非法操作",'data'=>@$_REQUEST['act']));}/** method login 用户登陆(支持邮箱+密码或者账号+密码)* param string $user_name,string $user_pwd,string $l_ip,string $city_name,float $l_xpoint,float $l_ypoint* return 返回成功/失败已经登陆信息*/public function login(){$data=json_decode(@$_REQUEST['req']);$user_name_or_email = trim(new_htmlspecialchars(new_addslashes(@$data->user_name)));$user_pwd = trim(new_htmlspecialchars(new_addslashes(@$data->user_pwd)));$log['l_ip'] = trim(new_htmlspecialchars(new_addslashes(@$data->l_ip)));$log['city_name'] = trim(new_htmlspecialchars(new_addslashes(@$data->city_name)));$log['l_xpoint'] = trim(new_htmlspecialchars(new_addslashes(@$data->l_xpoint)));$log['l_ypoint'] = trim(new_htmlspecialchars(new_addslashes(@$data->l_ypoint)));$log['l_type'] = intval(@$data->l_type);//用户登陆类型:默认为0,网站登陆,1为手机端IOS登陆,2为手机端android$log['l_version'] = trim(new_htmlspecialchars(new_addslashes(@$data->l_version)));if(empty($user_name_or_email)|| empty($user_pwd)){$r=array('recode'=>"0002",'msg'=>"参数错误",'data'=>'');}else{$user_data = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user where (user_name='".$user_name_or_email."' or email = '".$user_name_or_email."') and is_delete = 0");if(!$user_data){$r=array('recode'=>"1014",'msg'=>"该用户不存在,请确认操作.",'data'=>'');}else{if($user_data['user_pwd'] != md5($user_pwd.$user_data['code'])&&$user_data['user_pwd']!=$user_pwd){$r=array('recode'=>"0012",'msg'=>"用户密码不对,请确认您的登陆信息.",'data'=>'');}elseif($user_data['is_effect'] != 1){$r=array('recode'=>"0011",'msg'=>"账号未被激活,暂时不能进行如下操作.",'data'=>'');}elseif($user_data['is_locking'] != 0){$r=array('recode'=>"0014",'msg'=>"账号已经被锁定,暂时不能进行如下操作.",'data'=>'');if(app_conf("SHOP_TEL")!='')$r['msg'].="若有疑问,请致电联系客服: <".app_conf("SHOP_TEL").">";}else{//im:查看会员分组是否能够升级$user_current_group = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user_group where id = ".intval($user_data['group_id']));$user_group = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user_group where score <=".intval($user_data['score'])." order by score desc");if($user_current_group['score']<$user_group['score']){$user_data['group_id'] = intval($user_group['id']);$GLOBALS['db']->query("update ".DB_PREFIX."user set group_id = ".$user_data['group_id']." where id = ".$user_data['id']);$pm_title = "您已经成为".$user_group['name']."";$pm_content = "恭喜您,您已经成为".$user_group['name']."。";if($user_group['discount']<1){$pm_content.="您将享有".($user_group['discount']*10)."折的购物优惠";}send_user_msg($pm_title,$pm_content,0,$user_data['id'],get_gmtime(),0,true,true);}//im:查看会员积分是否能够升级$user_current_level = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user_level where id = ".intval($user_data['level_id']));$user_level = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user_level where point <=".intval($user_data['point'])." order by point desc");if($user_current_level['point']<$user_level['point']){$user_data['level_id'] = intval($user_level['id']);$GLOBALS['db']->query("update ".DB_PREFIX."user set level_id = ".$user_data['level_id']." where id = ".$user_data['id']);$pm_title = "您已经成为".$user_level['name']."";$pm_content = "恭喜您,您已经成为".$user_level['name']."。";send_user_msg($pm_title,$pm_content,0,$user_data['id'],get_gmtime(),0,true,true);}if($user_current_level['point']>$user_level['point']){$user_data['level_id'] = intval($user_level['id']);$GLOBALS['db']->query("update ".DB_PREFIX."user set level_id = ".$user_data['level_id']." where id = ".$user_data['id']);$pm_title = "您已经降为".$user_level['name']."";$pm_content = "很报歉,您已经降为".$user_level['name']."。";send_user_msg($pm_title,$pm_content,0,$user_data['id'],get_gmtime(),0,true,true);}$log['l_time']=get_gmtime();$log['user_id']=$user_data['id'];//im:更新最后登陆信息$GLOBALS['db']->query("update ".DB_PREFIX."user set login_ip = '".$log['l_ip']."',login_time= ".$log['l_time'].",group_id=".intval($user_data['group_id'])." where id =".$user_data['id']);//添加登陆日志$GLOBALS['db']->autoExecute("im_user_login_log",$log);//检查是否为最新系统版本$log['l_type'] = intval(@$data->l_type);//用户登陆类型:默认为0,网站登陆,1为手机端IOS登陆,2为手机端androidswitch ($log['l_type'])//im_m_package:p_type:手机系统版本类型,默认为0 ios系统;为1 android系统{case "1":$package=$GLOBALS['db']->getRow("select p_version,p_url,is_must from im_m_package where is_effect=1 and p_type=0");break;case "2":$package=$GLOBALS['db']->getRow("select p_version,p_url,is_must from im_m_package where is_effect=1 and p_type=1");break;default:break;}if (@$package && strnatcmp($log['l_version'],$package['p_version'])<0){
//                      $varreg="/^http:\/\/[A-Za-z0-9]+\.[A-Za-z0-9]+[\/=\?%\-&_~`@[\]\':+!]*([^<>\"\"])*$/";$varreg="/^(http|https|ftp):\/\/([A-Z0-9][A-Z0-9_-]*(?:\.[A-Z0-9][A-Z0-9_-]*)+):?(\d+)?\/?/i";if(!preg_match($varreg,$package['p_url']))//im:判断是否为超链接{$package['p_url']=URL_PATH.str_replace("./","",$package['p_url']);}$r=array('recode'=>"0015",'msg'=>"用户登陆成功.",'data'=>array('user_id'=>$user_data['id'],'user_name'=>$user_data['user_name'],'true_name'=>$user_data['true_name'],'email'=>is_null($user_data['email'])?"":$user_data['email'],'mobile'=>is_null($user_data['mobile'])?"":$user_data['mobile'],'l_time'=>to_date($log['l_time']),'p_version'=>$package['p_version'],'p_url'=>$package['p_url'],'is_must'=>$package['is_must']));}else{$r=array('recode'=>"0015",'msg'=>"用户登陆成功.",'data'=>array('user_id'=>$user_data['id'],'user_name'=>$user_data['user_name'],'true_name'=>$user_data['true_name'],'email'=>is_null($user_data['email'])?"":$user_data['email'],'mobile'=>is_null($user_data['mobile'])?"":$user_data['mobile'],'l_time'=>to_date($log['l_time']),'p_version'=>$log['l_version'],'p_url'=>"",'is_must'=>""));}}}}ajax_return($r);}/** method register 用户注册* param int $type,string $user_name,string $user_pwd,string $email ,string mobile* return 返回成功/失败*/public function register(){//{"type":0,"user_name":"sara123","user_pwd":"123456","email":"sara123@qq.com","mobile":"13245678900","xpoint":"119.306938","ypoint":"26.069746","city_name":"\u5b81\u590f","ip":"192.168.1","l_type":"1","l_version":"1.0","verify_code":"123456","msg_id":"12"}
//      $data=json_encode(array(
//                      "type"=>0,
//                      "user_name"=>"sara123",
//                      "user_pwd"=>"123456",
//                      "email"=>"sara123@qq.com",
//                      "mobile"=>"13245678900",
//                      "xpoint"=>"119.306938",
//                      "ypoint"=>"26.069746",
//                      "city_name"=>"宁夏",
//                      "ip"=>"192.168.1",
//                      "l_type"=>"1",
//                      "l_version"=>"1.0",
//                      "verify_code"=>"123456",
//                      "msg_id"=>12
//                      ));$data=json_decode(@$_REQUEST['req']);$type = intval(@$data->type);//im:注册方式:默认为0:邮箱+账号;1为:手机号+账号$user_data['user_name'] = strtolower(trim(new_htmlspecialchars(new_addslashes(@$data->user_name))));$user_data["user_pwd"] = trim(new_htmlspecialchars(new_addslashes(@$data->user_pwd)));$user_data["email"] = trim(new_htmlspecialchars(new_addslashes(@$data->email)));$user_data["mobile"] = trim(new_htmlspecialchars(new_addslashes(@$data->mobile)));$user_data["xpoint"] = doubleval(@$data->xpoint);$user_data["ypoint"] = doubleval(@$data->ypoint);$city_name = trim(new_htmlspecialchars(new_addslashes(@$data->city_name)));$user_data["login_ip"] = trim(new_htmlspecialchars(new_addslashes(@$data->ip)));$l_type = intval(@$data->l_type);//用户登陆类型:默认为0,网站登陆,1为手机端IOS登陆,2为手机端android$l_version = trim(new_htmlspecialchars(new_addslashes(@$data->l_version)));if($user_data['user_name']==''|| !preg_match("/^[a-z\d]{3,20}$/i", $user_data['user_name'])){ajax_return(array('recode'=>"1001",'msg'=>"用户名不能为空,且为3-20个由字母和数字组成的字符串.".$data->user_name,'data'=>""));}else{if($GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."user where user_name = '".trim($user_data['user_name'])."'")>0){ajax_return(array('recode'=>"1006",'msg'=>"该用户名已经存在,请重新填写",'data'=>''));}else {$msg=get_pwd_strength($user_data['user_pwd']);if(!empty($msg)){ajax_return(array('recode'=>"1003",'msg'=>$msg,'data'=>''));}else{if($type==0){if(!check_email($user_data['email'])){ajax_return(array('recode'=>"1003",'msg'=>"邮箱格式不正确.",'data'=>''));}else{if($GLOBALS['db']->getOne("select count(*) from ".DB_PREFIX."user where email = '".trim($user_data['email'])."'")>0){ajax_return(array('recode'=>"1004",'msg'=>"该邮箱已经被注册过,请填写其他邮箱.",'data'=>''));}}}else{if(!check_mobile($user_data['mobile'])){ajax_return(array('recode'=>"1005",'msg'=>"手机号码格式错误,手机号码为11位.",'data'=>''));}else{$verify_code = trim(new_htmlspecialchars(new_addslashes(@$data->verify_code)));$msg_id = intval(@$data->msg_id);if ($msg_id<=0 || empty($verify_code)){ajax_return(array('recode'=>"0002",'msg'=>"参数错误",'data'=>''));}$verify_result=use_sms_code(0,0,$msg_id,0,$user_data["mobile"],$verify_code);if($verify_result['status']==0){ajax_return(array('recode'=>$verify_result['recode'],'msg'=>$verify_result['msg'],'data'=>''));}}}//验证结束开始插入数据$user_data['create_time'] = get_gmtime();$user_data['update_time'] = get_gmtime();//获取默认会员组, 即升级积分最小的会员组$user_data['group_id'] = $GLOBALS['db']->getOne("select id from ".DB_PREFIX."user_group order by score asc limit 1");//获取用户所在城市id$city = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."region_conf where name='".$city_name."'");if ($city){switch ($city['region_level']) {//im:1:国 2:省 3:市(县) 4:区(镇)case "2":$user_data['province_id']=$city['id'];break;case "3":$user_data['city_id']=$city['id'];$user_data['province_id'] = $city['pid'];break;default:break;}}//账号是否激活
//                      $user_data['is_effect'] = empty($user_data['is_effect'])? app_conf("USER_VERIFY"):$user_data['is_effect'];$user_data['is_effect']=1;//手机端注册,默认账号为激活状态$user_data['code'] = ''; //默认不使用code, 该值用于其他系统导入时的初次认证$user_data['user_pwd'] = md5($user_data['user_pwd'].$user_data['code']);$user_data['register_type'] = 1;//register_type:im:用户注册的方式:默认为0,web端注册,1为手机端注册if($GLOBALS['db']->autoExecute(DB_PREFIX."user",$user_data,"INSERT")){$user_id = $GLOBALS['db']->insert_id();$register_money = app_conf('USER_REGISTER_MONEY');$register_score = app_conf('USER_REGISTER_SCORE');$register_point = app_conf('USER_REGISTER_POINT');if($register_money>0||$register_score>0){$user_get['score'] = $register_score;$user_get['money'] = $register_money;$user_get['point'] = $register_point;@require_once './app/modules/userModule.php';modify_account($user_get,intval($user_id),"在".to_date(get_gmtime())."注册成功");}//im:添加登陆日志$GLOBALS['db']->autoExecute("im_user_login_log",array('user_id'=>$user_id,'l_type'=>1,'l_ip'=>$user_data['login_ip'],'l_time'=>get_gmtime(),"city_name"=>$city_name,"l_xpoint"=>$user_data['xpoint'],"l_ypoint"=>$user_data['ypoint'],"l_type"=>$l_type,"l_version"=>$l_version));ajax_return(array('recode'=>"1009",'msg'=>"用户注册成功",'data'=>array('user_id'=>$user_id,"user_name"=>$user_data['user_name'],"email"=>is_null($user_data['email'])?"":$user_data['email'],"mobile"=>is_null($user_data['mobile'])?"":$user_data['mobile'],"create_time"=>to_date($user_data['create_time']))));}else{ajax_return(array('recode'=>"1008",'msg'=>"用户注册失败",'data'=>''));}}}}}/** method userUpdatePwd 修改密码接口* parameter int $user_id* parameter string $old_pwd* parameter string $new_pwd* return 返回成功/失败*/function userUpdatePwd(){//{"user_id":0,"old_pwd":"111@qq.com","new_pwd":"13245678900"}//       $data=json_encode(array(//                         "user_id"=>0,//                       "old_pwd"=>"sara123@qq.com",//                         "new_pwd"=>"13245678900"//                      ));$data=json_decode(@$_REQUEST['req']);$user_id = intval(@$data->user_id);$user_pwd = trim(new_htmlspecialchars(new_addslashes(@$data->old_pwd)));$new_pwd = trim(new_htmlspecialchars(new_addslashes(@$data->new_pwd)));if ($user_id<=0){$r=array('recode'=>"0002",'msg'=>"参数错误.",'data'=>'');}else{$msg=get_pwd_strength($new_pwd);if(!empty($msg)){$r=array('recode'=>"1002",'msg'=>$msg,'data'=>'');ajax_return($r);}else{$user_data = $GLOBALS['db']->getRow("select * from ".DB_PREFIX."user where id='".$user_id."'");if(!$user_data){$r=array('recode'=>"1014",'msg'=>"该用户不存在,请确认操作.",'data'=>'');}else{if($user_data['user_pwd'] != md5($user_pwd.$user_data['code'])&&$user_data['user_pwd']!=$user_pwd){$r=array('recode'=>"0012",'msg'=>"用户密码不对,请确认您的登陆信息.",'data'=>'');}elseif($user_data['is_effect'] != 1){$r=array('recode'=>"0011",'msg'=>"账号未被激活,暂时不能进行如下操作.",'data'=>'');}else if ($user_data['is_delete']==1){$r=array('recode'=>"1012",'msg'=>"该用户已被删除,请重新注册.",'data'=>'');}else{$user_data['user_pwd'] = $new_pwd;$new_pwd = md5($new_pwd.$user_data['code']);if($GLOBALS['db']->query("update ".DB_PREFIX."user set user_pwd = '".$new_pwd."',password_verify='' where id = ".$user_data['id'] )){$GLOBALS['db']->query("update ".DB_PREFIX."supplier_account set account_password = '".$new_pwd."' where user_id = ".$user_data['id'] );$r=array('recode'=>"0000",'msg'=>"操作成功.",'data'=>'');}else{$r=array('recode'=>"0001",'msg'=>"操作失败.",'data'=>'');}}}}}ajax_return($r);}}
?>

PHP简单MVC架构相关推荐

  1. MVC架构中,用户的请求简单梳理

    MVC架构中,用户的请求分为下面3个步骤: 终端用户发送请求,路由器将请求路由到合适的Controller,Controller是逻辑实体和行为action的集合. Controller将请求映射到特 ...

  2. YXcms(mvc架构php的cms)简单学习与审计

    实践学习php,thinkphp,Redis,vue,uni-app等技术,推荐开源电商系统likeshop,可以借鉴思路,可去版权免费商用,gitee下载地址: https://gitee-gith ...

  3. MyBatis学习:简单认识一下MVC架构模式和三层架构

    1.本篇博客的背景和目的 目前我本人正在学习MyBatis框架,在原先了解并且懵懵懂懂使用的基础上,开始系统正式的学习.本篇博客阐述一下MVC架构模式和三层架构,以及明晰一下我们通常在Web项目中的编 ...

  4. 基于REST的MVC架构设计与实现

    在上一篇随笔已经讲述了REST的WEB serivce架构的相关知识,并且搭建了一个非常简单的实例,在另一篇随笔中也写了ajax用JSON序列化数据的传输,在这篇文章将结合前两篇随笔所讲的知识做一个稍 ...

  5. Javascript MVC架构之旅

    为什么80%的码农都做不了架构师?>>>    日期:2012-9-10  来源:GBin1.com 本文摘自smashingmagazine的Journey Through The ...

  6. data spring 指定时区_Spring 框架基础(05):Mvc架构模式,执行流程详解

    本文源码:GitHub || GitEE 一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面, ...

  7. spring mvc返回页面显示空白_Spring 框架基础(06):Mvc架构模式简介,执行流程详解...

    一.SpringMvc框架简介 1.Mvc设计理念 MVC是一种软件设计典范,用一种业务逻辑.数据.界面显示分离的方法组织代码,将业务逻辑聚集到一个组件里面,在改进和个性化定制界面及用户交互的同时,不 ...

  8. MVC架构在Asp.net中的应用和实现

    MVC架构在Asp.net中的应用和实现 摘要:本文主要论述了MVC架构的原理.优缺点以及MVC所能为Web应用带来的好处.并以"成都市信息化资产管理系统"框架设计为例,详细介绍其 ...

  9. MVC架构模式(2)

    简介: MVC最初是在Smaltalk_80中被用来构建用户界面的.M代表模型Model,V代表视图View,C代表控制器Controller. Model模型层,可以简单理解就是数据层,用于提供数据 ...

最新文章

  1. nginx+uwsgi+django1.6 配置过程
  2. 错误笔记(1)——关于克隆虚拟机引发的后续问题
  3. python中的类和对象
  4. ARP协议,以及ARP欺骗
  5. xtrabackup安装使用
  6. 1650显卡能带动144hz吗_GTX1660显卡能称得起最甜吗?最猛GTX1660显卡性能测评
  7. 数据中心生成器行业调研报告 - 市场现状分析与发展前景预测
  8. BigDecimal的使用方法和注意事项
  9. 如何用计算机串口烧录芯片,如何使用串口烧写xmc1301芯片.pdf
  10. 2022.01.24翻译Lorry
  11. 【渝粤教育】电大中专门店销售与服务技巧 (3)作业 题库
  12. 智能厨房监控系统设计
  13. 为什么你不能体面地做自己
  14. 初识OpenGL (3)片段着色器(Fragment Shader)
  15. 领域模型 PO、VO、DAO、BO、DTO、POJO
  16. 【奥黛丽赫本】女神一样的优雅
  17. 003. 电话号码的字母组合——回溯算法
  18. 被掰弯的线性函数,海王一样的logstic
  19. javascript_javascript吊装
  20. 了解node.js模块化和npm包

热门文章

  1. 国标28181:什么是SDP协议
  2. python枪械_Python的七种武器
  3. java-php-python-ssm蔬菜水果销售系统计算机毕业设计
  4. 【Linux】电子词典
  5. 标准c语言程序的语句都以什么结尾,c程序的执行是从什么开始到什么结束?
  6. Debian9.12镜像下载及网络、软件源配置
  7. 自己交社保的人怎么样才知道自己可以退休了?
  8. 森笔记app软件 开发记录
  9. 软件构造 Lab3 CircularOrbit 实验日记
  10. 数据库备份MySQL