API 인터페이스 개발을 위해 간단한 프레임워크를 구축해야 하기 때문에, 간단한 mvc 프레임워크가 당연히 선호된다. 가장 원시적이고 간결한 mvc 프레임워크. 이하에 설명한다.
1. 프로젝트 디렉터리 구조:
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");//서버 IP
define('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(' ', ' ', 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;
}
}
//GMTime 가져오기
function 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 문자열이 유니코드 문자열로 구분됨
* @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 문자열이 유니코드 문자열로 구분됨
* @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:십진수를 36기제수로 변환하다
* @param (int)$num 십진수
*return 되돌리기: 36진수
*/
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:36진수는 10기제수로 변환된다
* @param (string)$str 36진수
*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;
}
else
return 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에 i를 설정하기 때문입니다.nclude_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가 MYSQL에 연결되어 있는지 확인합니다
if(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,소스:
<?php
class 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();
/* 조인이 들어있는지 아닌지 판단하기 */
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);
}
}
?>
이것으로 뼈대를 완성하고, 아래에 간단한 예를 하나 쓰겠습니다.
3.간단한 실례를 소개하다
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 모바일 안드로이드
$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 모바일 안드로이드
switch ($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 모바일 안드로이드
$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, 웹 등록, 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",
//
'개발 꿀팁 > PHP' 카테고리의 다른 글
10개의 실용적인 PHP 정규 표현식 (0) | 2022.08.01 |
---|---|
php 영문 문자열 길이 계산 (0) | 2022.08.01 |
php 그래픽(주로 php의 GD 라이브러리를 사용함) copy 그대로 사용 (0) | 2022.07.30 |
[PHP 프로젝트 배포 3] Apache 환경 구성 (0) | 2022.07.30 |
[PHP 프로젝트 배치1] PHP 환경 구성 (0) | 2022.07.30 |