<?php
//============================================================
//----------------------自动加载------------------------------
// 命名空间自动加载
/* 
1.一般写法 */
	new \dir1\dir2\test();
	// 可以自动加载test.class.php文件,这个文件必须使用命名空间

/* 
2.文件在 ThinkPHP/Library 这个目录下的可以自动识别和定位 */
	new Think\Cache\Driver\File();
	new Org\Util\Auth();
	// 在Library目录下新增目录,就会自动注册新的根命名空间

/* 
注册新的命名空间
详见:架构 > 自动加载

类库映射:加快命名空间效率
详见:架构 > 自动加载 */
/* 

3.不符合命名规范和后缀的类库、没有使用命名空间或者命名空间
和路径不一致的类库 */

	// 导入Org类库包 Library/Org/Util/Date.class.php类库
	import("Org.Util.Date");
	// 导入Home模块下面的 Application/Home/Util/UserUtil.class.php类库
	import("Home.Util.UserUtil");
	// 导入当前模块下面的类库 
	import("@.Util.Array");
	// 导入Vendor类库包 Library/Vendor/Zend/Server.class.php
	import('Vendor.Zend.Server');

	// 导入Library/Test/Test.class.php
	import('Test.Test');
	
/* 
4.导入其他不规则的类库,不是以class.php结尾的等用Vendor()方法 */
	// Library\Vendor\Zend\Filter\Dir.php
	Vendor('Zend.Filter.Dir');

//============================================================
//-------------------------自定义常量------------------------
// 在config中定义 必须在return之前定义
// 在入口文件中定义
//------------------------------------------------------------
//----------------------信息提示模板-------------------------
// 默认错误跳转对应的模板文件
'TMPL_ACTION_ERROR'     =>  THINK_PATH.'Tpl/dispatch_jump.tpl', 
// 默认成功跳转对应的模板文件
'TMPL_ACTION_SUCCESS'   =>  THINK_PATH.'Tpl/dispatch_jump.tpl',
//============================================================
//---------------------自动生成模块--------------------------
// 在 index.php 文件中加入

// 自动生成模块
define('BIND_MODULE','h');
// 自动生成控制器
define('BUILD_CONTROLLER_LIST','Index,User,Menu');

// 使用后删除即可
//============================================================
//----------------------pc与手机端模板切换-------------------
/* 在view目录中新建default与mobile文件夹,
将pc端的模板放入default中,手机端的放入mobile中 */

// 前台配置文件中
return array(
	'DEFAULT_THEME'   => 'default',
	// 'THEME_LIST'        => 'default,mobile',//3.2之前好像要加
	'TMPL_DETECT_THEME' => true,
);
// 前台的主控制器中
if (ismobile()) {//这个函数判断是否为手机端
	C('DEFAULT_THEME','mobile');// 设置默认默认主题为 Mobile
}
//========================项目分组设置=======================
//------------------------------------------------------------
// 前台分组叫Home,后台分组叫Admin,目录结构一样

前台:
namespace Home\Controller;
use Think\Controller;

后台:
namespace Admin\Controller;
use Think\Controller;
//========================跨控制器调用=======================
//------------------------------------------------------------
// 如何在前台调用后台Admin\Common\Fun\hello.class.php类:

// 1.hello.class.php的书写规则
namespace Admin\Common\Fun;
class hello{}
// 2.在前台调用后台hello类
$hello = new \Admin\Common\Fun\hello();
$hello->hehe();
// 后台调用前台同理
//------------------------------------------------------------
//-----------------------调用公共方法------------------------
// 调用app\Common\Fun目录下的类
$hello = new \Common\Fun\hello();
$hello->hehe();
// 在 手册>扩展>类库扩展 有说明
//------------------------------------------------------------
//------------------------快捷调用----------------------------
class GoodsController extends Controller{
	function showlist(){
		// 实例化User控制器与调用方法
		$user = A('User');//通过快捷函数实例化控制器对象
		echo $user->number();
	}
}
//------------------------------------------------------------
//----------------------调用公共函数-------------------------
// 在commom/common/function.php中放入函数
// 在前台或者后台可直接调用,如:
hello();
//------------------------------------------------------------
//------------------------------------------------------------
A('User');				//跨控制器
A('Admin/User');		//跨模块
A('shop://Admin/User');	//跨项目

//------------------实例化控制器并调用方法------------------
//------------------------------------------------------------
//User为控制器 number为方法
R('User/number');
R('Admin/User/number');
R('shop://Admin/User/number');

// 同如下方法:

$user = A('User');
echo $user->number();
//=======================Model设置============================
//------------------------------------------------------------
一般情况下在Admin与Home平级的目录下新建一个Model文件夹
在此文件夹里面创建Model类文件

namespace Model;
use Think\Model;

class GoodsModel extends Model{

}
//-------------------在控制器中调用Model类-------------------
//------------------------------------------------------------
class GoodsController extends Controller{
	function showlist(){
		// 调用Model类
		$goods = new \Model\GoodsModel();
		var_dump($goods);
	}
}

/* 在使用外部数据表时表前缀与本地表前缀不同,此时需要使用
到真实的数据表名 */
class QqModel extends Model{

	//定义当前模型操作真实的数据表
	protected $trueTableName = 'tencent_qq';
	
	或者:
	
	//定义表前缀
	protected $tablePrefix = 'tencent_';
}
//======================实例化Model方法======================
//------------------------------------------------------------
// 方法一:
class GoodsController extends Controller{
	$goods = new \Home\Model\GoodsModel();
}

// 方法二:(3.2版本以前的使用方法,同M()方法)
class GoodsController extends Controller{
	//此方法实例化父类Model类,但操作的还是原来Goods的数据表
	$goods = D('Goods');
}

// 方法三:
class GoodsController extends Controller{
	$goods = M('Goods');
}

//============================================================
//------------------------------------------------------------
// 系统函数库 ThinkPHP/Common/functions.php

/* 
R() 调用指定控制器下的指定方法
U() 制作url地址的快捷函数
C() 获得或设置配置变量
L() 获得语言变量信息
E() 给页面输出错误信息
A('模块/控制器') 实例化控制器对象
	A('Home/User') 实例化User控制器对象
*/
//============================================================
//=======================主入口文件配置======================
//创建项目目录(必须)
define('APP_PATH','./app/');
//开启调试模式
define('APP_DEBUG',true);
//引入ThinkPHP(必须)
require('./ThinkPHP/ThinkPHP.php');
//===================访问方法路径书写方法====================
//------------------------------------------------------------
// localhost/Think/index.php/目录名/模块名/方法名
localhost/Think/index.php/home/index/index
//=========================配置文件===========================
//------------------------------------------------------------
//系统默认配置文件(不修改)
ThinkPHP/Conf/convention.php
//开启debug模式时加载的配置文件
ThinkPHP/Conf/debug.php

//关闭或开启右下角小图标
'SHOW_PAGE_TRACE'   => false,
C('SHOW_PAGE_TRACE','');
//=======================配置书写目录========================
//------------------------------------------------------------
app/Common/Conf/config.php  或者 app/Home/Conf/config.php
// 前者作用范围大后者优先级高
// 写入以下内容
	'SHOW_PAGE_TRACE' => true;		//开启右下角的调试信息小图标
	'DB_TYPE'               =>  'mysql',		// 数据库类型
	'DB_HOST'               =>  'localhost',	// 服务器地址
	'DB_NAME'               =>  'userhead',	// 数据库名
	'DB_USER'               =>  'root',		// 用户名
	'DB_PWD'                =>  '',	// 密码
	'DB_PORT'               =>  '',	// 端口
	'DB_PREFIX'             =>  '',	// 数据库表前缀
//------------------------------------------------------------
//----------------------通常写入内容-------------------------
return array(
	//'配置项'=>'配置值'
    //url模式设置
    //'URL_MODEL' =>  0,
    'URL_MODEL'             =>  1,  //1为pathinfo模式
    
    //让页面显示追踪日志信息
    'SHOW_PAGE_TRACE'   => true,  
    
    //url地址大小写不敏感设置
    'URL_CASE_INSENSITIVE'  =>  true,
);
//============================================================
//====================实例化一个数据库连接===================
/* 无论是M()方法还是D()方法都可以自动找表前缀,但之
前必须在配置文件中定义了表前缀,如表“test_user”我们
要在配置文件中先写'DB_PREFIX'=>'test_', 在使用方法时
只需要M('user')或D('user') */

$user = new \Think\Model('head');
$userlist = $user->select();
// dump()用于调试
dump($userlist);


// M()实例化一个基类对象
$user = M('head');
// D()实例化一个对象(先去找自定义Model类,如userModel等类)
$user = D('head');
//========================空操作处理=========================
//------------------------------------------------------------
// 如:页面请求的地址为:xxx/xxx/user/hello,而hello方法不存在

//think内置的方法
public function _empty(){
	echo '404';
}
//利用__call方法(优先级高于_empty)
public function __call($a,$b){
	echo '访问的页面不存在';
}

// 方法二:
// 在对应的模板区建立一个与该空操作同名的模板
// 如:请求的方法为hello 那门对应的模板为hello.html

//-----------------------空控制器处理------------------------
//------------------------------------------------------------
处理空控制器文件 ThinkPHP/Library/Think/App.class.php

如:页面请求的地址为:xxx/xxx/User/hello,而User控制器不存在

// 方法一:
写一个 EmptyController.class.php 为名的控制器,在该控制器下
制作一个_empty() 方法即可

//============================================================
//=======================页面跳转=============================
//跳转方法
$this->redirect('Index/index');
$this->redirect('控制器/方法名');
$this->redirect('Admin-Index/view', array('uid'=>1), 3,'页面跳转中~');
// 跳转到 其他OtherApp项目(非分组)的Admin项目分组User模块view操作 
$this->redirect('OtherApp://Admin-User/view');
$this->redirect('http://www.chuxiangyi.com/');

$User = M('User'); 			//实例化User对象
$data['username'] = $_POST['username'];
$data['password'] = $_POST['password'];
$result = $User->add($data); 
if($result){
	//设置成功后跳转页面的地址,默认的返回页面是$_SERVER['HTTP_REFERER']    
	// $this->success('操作完成','/Article/index',3);
	$this->success('新增成功', 'User/list');
} else {
	//错误页面的默认跳转页面是返回前一页,通常不需要设置    
	// $this->error('操作失败','/Article/error',5);
	$this->error('新增失败');
}
//============================================================
//========================架构-URL模式========================
// rewrite模式
// 1.将以下内容写入.hataccess 文件
<IfModule mod_rewrite.c>
	RewriteEngine on RewriteCond %{REQUEST_FILENAME} !-d 
	RewriteCond %{REQUEST_FILENAME} !-f 
	RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
</IfModule>
// 2.在配置文件中开启 mod_rewrite.so模块
// 3.在配置文件中设置 AllowOverride 为 All(约255行)

//======================U()自动产生URL地址===================
//------------------------------------------------------------
// U(模块/控制器/方法);
// echo U(控制器/方法);
echo U(Index/index);

// PATHINFO模式下的URL
/Think2/index.php/Home/Index/add.html
http://localhost/web/shop/index.php/Home/user/login

// 用C('URL_MODEL')方法输出路径模式
echo C('URL_MODEL');

// 在配置文件中设置 'URL_MODEL' => 2,
// 设置后的模式为 rewrite
/Think2/Home/Index/add.html

// URL生成
U('User/add')			// 生成User控制器的add操作的URL地址
U('Blog/read?id=1')		// 生成Blog控制器的read操作 并且id为1的URL地址
U('Admin/User/select')	// 生成Admin模块的User控制器的select操作的URL地址

// U方法的第二个参数支持数组和字符串两种定义方式,
// 如果只是字符串方式的参数可以在第一个参数中定义
U('Blog/cate',array('cate_id'=>1,'status'=>1))
U('Blog/cate','cate_id=1&status=1')
U('Blog/cate?cate_id=1&status=1')

// 锚点支持
U('Blog/read#comment?id=1')
//============================================================
//=====================自定义函数目录========================
// 自定义函数写在
/app/Common/Common/function.php
//============================================================
//==================在某方法之前与之后执行===================
// public function _before_方法名(){}
public function _before_hello(){
	echo '_before_hello';
}
public function _after_hello(){
	echo '_after_hello';
}
//------------------------------------------------------------
//-----------------------注册自动验证------------------------
// 自定义数据Model模型类实现具体的验证规则

// Step 1

// 模型文件中Model/UserModel.class.php
namespace Home\Model;
use Think\Model;
class UserModel extends Model{

	//一次性获得全部验证错误
	protected $patchValidate    =   true;
    
	//实现表单项目验证
	//通过重写父类属性_validate实现表单验证
	protected $_validate        =   array(

		//验证字段1,验证规则,错误提示,[验证条件,附加规则,验证时间]
		
// 账户 用户名
		//验证用户名,require必须填写项目
		array('username','require','用户名必须填写'),
		array('password','require','密码必须填写'),
		//可以为同一个项目设置多个验证
		array('repassword','require','确认密码必须填写'),
		//与密码的值得是一致的
		array('repassword','password','与密码的信息必须一致',0,'confirm'),
		
// 其他
		//邮箱验证
		array('email','email','邮箱格式不正确'),
		//验证qq
		//都是数字的、长度5-10位、 首位不为0
		//正则验证  /^[1-9]\d{4,9}$/
		array('qq',"/^[1-9]\d{4,9}$/",'qq格式不正确'),
		
		//学历,必须选择一个,值在2,3,4,5范围内即可
		array('xueli',"2,3,4,5",'必须选择一个学历',0,'in'),
		//爱好项目至少选择两项以上
		//爱好的值是一个数组,判断其元素个数即可知道结果
		//callback利用当前model里边的一个指定方法进行验证
		array('hobby','check_hobby','爱好必须两项以上',1,'callback'),
		
		// 手机
		array('phone','require','手机不可为空'),
		array('phone',"/^1[34578]{1}\d{9}$/",'手机格式错误',2),
	
	); 
	//自定义方法验证爱好信息
	//$name参数是当前被验证项目的信息
	//$name = $_POST['user_hobby']
	function check_hobby($name){
		if(count($name)<2){
			return false;
		}else{
			return true;
		}
	}
}

// Step 2

// 控制器文件中Controller/RegisterController.class.php
namespace Home\Controller;
use Think\Controller;
class RegisterController extends Controller{
	public function index(){
		$this->display('Register/index');
	}
	public function register(){
		//实例化上面定义的UserModel类
		// \Home\Model\UserModel() 使用绝对路径
		$user = new \Home\Model\UserModel('user');
		
		if($user->create()){	//create集成表单验证
			echo '验证通过';
			$user->atime = time();
			$user->add();
		}else{
			// 如果错误输出不来用print_r(),getError为父类Model方法
			dump($user->getError());
		}
	}
}
//============================================================
//=======================控制器-伪静态=======================
'URL_HTML_SUFFIX'=>'shtml'

//=========================模板==============================
//======================指定显示模板=========================
$this->display('User/add');	//	View/user/add.html

$this->display('模板文件夹/具体模板');

/* T函数作用:
	生成模板文件名
	返回值是一个完整的模板文件名 */
$this->display(T('Public/menu'));// 返回当前模块/View/Public/menu.html
//-------------------------变量解析---------------------------
//------------------------------------------------------------
{$time|date='Y-m-d',###}		// “|” 前后不可有空格
{:date('Y-m-d',$time)}
//---------------------视图-模板引擎的切换-------------------
//------------------------------------------------------------
'TMPL_ENGINE_TYPE' =>'PHP'
//---------------------模板中使用框架结构--------------------
//------------------------------------------------------------
// 模板中
<frameset cols="200px,*" frameborder="yes">
	<frame src="__CONTROLLER__/left" noresize scrolling="yes" />
	<frame src="__CONTROLLER__/right" name="right" />
</frameset>
// 控制器中
class IndexController extends Controller {
	public function index(){
		$this->display('Index/index');
	}
	public function left(){
		$this->display('index/left');
	}
	public function right(){
		$this->display('index/right');
	}
}
//------------------------模板替换----------------------------
//------------------------------------------------------------
// 不含域名
__ROOT__	指定到站点 		/web/shop 
__APP__		指定到应用 		/web/shop/index.php 
__MODULE__	指定到模型 		/web/shop/index.php/home 
__CONTROLLER__	(__或者__URL__ 兼容考虑)
			指定到控制器	/web/shop/index.php/home/user 
__ACTION__	指定到方法 		/web/shop/index.php/home/user/useradd 
__SELF__	当前的页面URL	/web/shop/index.php/Home/user/userAdd 
__PUBLIC__	指定到公共目录	/web/shop/Public 

// 常量 php中使用
CONTROLLER_NAME	//正在访问的控制器
ACTION_NAME		//正在访问的方法


IS_CGI		是否属于 CGI模式
IS_WIN		是否属于Windows 环境
IS_CLI		是否属于命令行模式
__ROOT__	网站根目录地址
__APP__		当前项目(入口文件)地址
__GROUP__	当前分组的URL地址
__URL__		当前模块的URL地址
__ACTION__	当前操作的URL地址
__SELF__	当前URL地址
__INFO__	当前的PATH_INFO字符串
__EXT__		当前URL地址的扩展名
APP_NAME	当前项目名
GROUP_NAME	当前分组名
MODULE_NAME	当前模块名
ACTION_NAME	当前操作名
APP_DEBUG		是否开启调试模式
MODE_NAME		当前模式名称
APP_PATH		当前项目路径
THINK_PATH		系统框架路径
MEMORY_LIMIT_ON	系统内存统计支持
RUNTIME_FILE		项目编译缓存文件名
THEME_NAME		当前主题名称
THEME_PATH		当前模板主题路径
APP_TMPL_PATH	当前模板URL路径
LANG_SET		当前浏览器语言
MAGIC_QUOTES_GPC	MAGIC_QUOTES_GPC
NOW_TIME		当前请求时间(3.1新增)
IS_GET			当前是否GET请求(3.1新增)
IS_POST			当前是否POST请求(3.1新增)
IS_PUT			当前是否PUT请求(3.1新增)
IS_DELETE		当前是否DELETE请求(3.1新增)
IS_AJAX			当前是否AJAX请求(3.1新增)

//===========================内置标签========================
//----------------------用foreach显示数组--------------------
// 1.在控制器中分配变量
$user = M('user_head');
$list = $user->select();
$this->assign('list',$list);
$this->display('Index/index');

// 2.在模板中显示变量
<foreach name="被分配的变量名" item="书写代号">
	{$key}//这个$key变量可以输出0 1 2 3 4 5
	{$书写代号.id}<br />
	{$书写代号.name}<br />
</foreach>
//----------------------用volist显示数组---------------------
//------------------------------------------------------------
<volist name="被分配的变量名" id="书写代号" 
offset="第几条开始显示" length='显示多少条'>
	{$书写代号.name}
</volist>
//============================================================
//----------------------增删改查通用语句---------------------
$model = M('demo');
$model ->execute();//insert update delete
$model ->query();//select
//========================插入数据============================
//------------------------create()----------------------------

/* create方法并不算是连贯操作,因为其返回值可能是布尔值,
所以必须要进行严格判断 */

// 方法一

// create()创建数据对象,可进行自动验证和过滤操作
// step1
$user = M('demo');
// step2
$data['name'] = 'Stephen';
$data['sex'] = '1';
$data['age'] = '22';
// step3 创建数据对象
$user->create($data);
// 把用户对象写入数据库
$user->add();

// 方法二

$user = M('user');		//创建数据模型
$user->create();		//创建数据,接收post表单提交的数据
$user->atime = time();	//修改属性,向数据里添加内容或修改内容
$user->add();			//将创建好的数据添加到数据库
//------------------------------------------------------------
//------------------------data()------------------------------
// 用data()方法插入数据 data()不会进行自动验证和过滤操作
// step1
$user = M('demo');
// step2
$data['name'] = 'Anna';
$data['sex'] = '0';
$data['age'] = '12';
// step3
$user->data($data)->add();
//------------------------------------------------------------
//--------------------field()限制创建的字段------------------
$data['name'] = 'hello';
$data['sex'] = '1';
$data['age'] = '23';

$user = M('demo');
// 在create之前加入field()方法可限制创建的数据对象
$d = $user->field('name,sex')->create($data);
dump($d);

// 不查询某个字段,如text字段不查询
$user = field('text,content',true)->select();

// 只查询出field括号内的字段
$user->field('id,name,sex')->select();
//------------------------------------------------------------
//------------------------add()数据写入-----------------------
$user = M('demo');

$data['name'] = 'xiaoming';
$data['sex'] = '1';
$data['age'] = '23';
// 使用add()方法将数据写入数据库
// 返回 Id
$insertId = $user->add($data);
//------------------------------------------------------------
//----------------filter(函数)字段内容过滤-------------------
$data['name'] = '<b>thinkphp</b>';
$data['sex'] = '1';

$User = M('demo');
// 写入数据库的时候会把name字段的值转化为thinkphp。
$User->data($data)->filter('strip_tags')->add();
//------------------------------------------------------------
//------------------------addAll()批量添加数据---------------
// 批量添加数据
$dataList[] = array('name'=>'one','sex'=>'1');
$dataList[] = array('name'=>'two','sex'=>'0');
$User->addAll($dataList);

//=======================数据读取=============================
//-----------------------获取字段名---------------------------
$user = M('user');
$user->getDbFields();
//---------------------select()查询出数据集------------------*
//------------------------------------------------------------
// 将所有数据查出,失败返回 false,无结果返回 null
$user = M('demo');
$data = $user->select();
dump($data);

// 加入条件
$user->field('name,sex')->where('id > 2')->order('age')->limit(3)->select();

//查询主键值为30的信息
$user->select('30');
// 查询主键为21,23,27的值
$user->select('21,23,27');
//----------------find()查询出一条数据数据-------------------*
//------------------------------------------------------------
// 查询出一条数据
$user = M('demo');
// 失败返回false
if($data = $user->find()){
	dump($data);
}

// 加入where条件
$user = M('demo');
$data = $user->field('name,sex')->where('id > 2')->find();
dump($data);

// 返回一维数组
$data->find('30');
$manager->where("username = '$username' and password = '$password'")->find();
//---------------getField()获取一列或一个数据----------------
//------------------------------------------------------------
// 获取列数据中的第一条
$user = M('demo');
$data = $user->getField('name');//默认第一个

// 第二个参数位true 则获取整列数据
$user->where("id = 3")->getField('name',true);

// 限制显示条数
$nickname = $User->where('status=1')->getField('nickname',8);
$nickname = $User->where('status=1')->limit(8)->getField('nickname',true);

// 返回二维数组,键名为第一个
$nickname = $User->where('status=1')->getField('id,nickname,sex');

// 使用连接符':' 键名是id值,键值则是account:nickname连接组成的字符串
$result = $User->where('status=1')->getField('id,account,nickname',':');

//=========================数据更新==========================
//-----------------------更新指定记录------------------------*
$user = M('demo');

$data['name'] = 'one';
$data['sex'] = '1';
// 使用save
$user->where('id=5')->save($data);
//------------------------------------------------------------
//-------------------------更新整张表------------------------
$user = M('demo');

$data['name'] = 'one';
$data['sex'] = '1';
// 未加where条件
$user->save($data);
//------------------------------------------------------------
//-----------------------setField()更新某个字段--------------
$user = M('demo');
$user->where('id=5')->setField('name','Stephen');

//更新多个字段
$User = M("User");
$data = array('name'=>'ThinkPHP','email'=>'ThinkPHP@gmail.com');
$User-> where('id=5')->setField($data);
//-------------------------批量更新---------------------------
//------------------------------------------------------------
$id = isset($_GET['select'])? implode(',',$_GET['select']):$_GET['id'];

$article->where("id in ({$id})")->setField('del',1);
$article->where("id in ({$id})")->save(array('del'=>1));
//------------------------------------------------------------
//----------------------setInc()自加自减----------------------
$User = M("User"); // 实例化User对象
$User->where('id=5')->setInc('字段',3);		// 用户的积分加3
$User->where('id=5')->setInc('字段');		// 用户的积分加1
$User->where('id=5')->setDec('字段',5);	// 用户的积分减5
$User->where('id=5')->setDec('字段');		// 用户的积分减1
//=============================删除============================
//-------------------------删除单个数据-----------------------
$user = M('demo');
$user->delete(3);
$user->delete(1,2,3);
$user->where('name=one')->delete();

//==========================模型==============================
//----------------------查询出某个字段-----------------------
$this->getByUsername($username);//getBy后面的Username为数据表的字段名

//==========================where特点=========================
//------------------------------------------------------------
// 用数组作为查询条件
$User = M("User"); 
$map['name'] = 'thinkphp';
$map['sex'] = 'man';
$User->where($map)->select(); 

// 表达式查询
$map['字段1']  = array('表达式','查询条件1');

$map['id']  = array('in','12,13,23');//表达式不分大小写

$Model->where($map)->select();
// 下面是表达式
/* 
表达式 		含义 
EQ 			等于(=) 
NEQ 		不等于(<>) 
GT 			大于(>) 
EGT 		大于等于(>=) 
LT 			小于(<) 
ELT 		小于等于(<=) 
LIKE	 	模糊查询
[NOT] BETWEEN (不在)区间查询 
[NOT] IN	(不在)IN 查询 
EXP 		表达式查询,SQL语法	*/

// where可以多次调用

//===========================专题=============================
//===========================分页=============================

// 方法一

$user = M('demo');
// step1
$page = new \Think\Page($user->count(),2);
// step2
$data = $user->limit($page->firstRow .','.$page->listRows)->select();
// step3
$this->assign('datalist',$data);	//显示数据
$this->assign('page',$page->show());	//显示分页


// 方法二

$user = M('demo'); 
// 进行分页数据查询 注意page方法的参数的前面部分是当前的页数
// 使用 $_GET[p]获取
$list = $user->page($_GET['p'].',2')->select();
$this->assign('datalist',$list);

$Page = new \Think\Page($user->count(),2);

$show = $Page->show();
$this->assign('page',$show);

//============================================================
//---------------------Ajax返回的数据形式--------------------

//返回格式有:JSON、JSONP、XML、EVAL

// 返回JSON格式
$arr = array('name'=>'Stephen','age'=>'23');
$this->ajaxReturn($arr,'JSON');//返回json格式 {"name":"Stephen","age":"23"}

// 返回普通数据
$this->ajaxReturn($arr,'EVAL');

//------------------------------------------------------------
//----------------------Ajax动态请求数据---------------------

// 模板中的书写方式
$(function (){
	// {name:'jack',age:'23'}这样的方式传过去的其实是一个post数组
	$.post('__MODULE__/Sort/check',{name:'jack',age:'23'},function (data){
		alert(data.name);
		alert(data.age);
	},"json");
});

// 框架中的书写方式
public function check($name,$age){
	$json = array('name'=>$name,'age'=>$age);
	$this->ajaxReturn($json,'JSON');
}
//============================================================
//------------------------文件上传----------------------------
// 详见手册专题文件上传
$upload = new \Think\Upload();
$upload->maxSize = 3145728;
$upload->exts = array('jpg', 'gif', 'png', 'jpeg');
$upload->rootPath = './Public';
$upload->savePath = '/uploads/';
$upload->autoSub = true;	//是否开启子目录(日期目录)保存,默认开启

$info = $upload->upload();

if(!$info){
	$this->error($upload->getError());
}else{
	foreach ($info as $key => $value){
		$savePath =  $value['savepath'];
		$saveName = $value['savename'];
	}
	$picPath = $savePath.$saveName;
}
//============================================================
//------------------------图像处理----------------------------
// 详见手册专题图像处理
$image = new \Think\Image(); 
$image->open($upload->rootPath.$picPath);
$image->thumb(400, 400)->save($upload->rootPath.$savePath.'logo_'.$saveName);
//============================================================
//-------------------------验证码-----------------------------
// 模板中写入
<img onClick="this.src=this.src+'?'+Math.random()" src="__MODULE__/login/checkCode"  />

// 被调用的后台验证码方法
public function checkCode(){
	$config = array(
		'fontSize'	=>	30,
		'length'		=>	3,
		'useNoise'	=>	false, // 关闭验证码杂点
	);
	$verify = new \Think\Verify($config);
	$verify->entry();
}

// 检查验证码
$verify = new \Think\Verify();
if(!$verify->check($_POST['checkcode'])){
	$this->error('验证码错误');
}
//============================================================
//------------------------多表查询----------------------------
// 1、原生查询示例:
$Model = new Model();
$sql = 'select a.id,a.title,b.content from think_test1 as a, think_test2 as b where a.id=b.id '.$map.' order by a.id '.$sort.' limit '.$p->firstRow.','.$p->listRows;
$voList = $Model->query($sql);

// 2、join()方法示例:
$user = new Model('user');
$list = $user->join('RIGHT JOIN user_profile ON user_stats.id = user_profile.typeid' );
M("user u")->join("{$per}user_info x ON x.uid = u.id")->where("u.id = $uid")->find();

// 3、table()方法示例:
$list = $user->table('user1 a, user2 b')->where('a.id = b.id')
->field('name,sex')->order('id desc' )->select();
//============================================================
//------------------------模板中使用函数---------------------

{:htmlspecialchars_decode($data['data'])}
//============================================================
//--------------------------路由------------------------------
// 开启路由
'URL_ROUTER_ON'   => true, 
//定义路由规则
'URL_ROUTE_RULES' => array(
	'index'  =>array('index/index','',array('ext'=>'html')),
	
	'p'  =>array('product/index','',array('ext'=>'html')),
	'plist'  =>array('product/plist','',array('ext'=>'html')),
	'slist'  =>array('product/slist','',array('ext'=>'html')),
	
	'details/:id\d'  =>array('product/details','',array('ext'=>'html')),
	
	'/^alist\/(.*\d)_(.*\d)$/'  =>array('article/alist?id=:1&p=:2','',array('ext'=>'html')),
	'alist/:id\d'  =>array('article/alist','',array('ext'=>'html')),
	
	'article/:id\d'  =>array('article/article','',array('ext'=>'html')),
	'category'  =>array('product/category','',array('ext'=>'html')),
),
//============================================================
//---------------------------静态缓存-------------------------

// 静态缓存

// 'HTML_PATH' 缓存目录,这是个常量不是配置项,在入口文件中定义

// 'HTML_CACHE_ON'     =>    true,		// 开启静态缓存
'HTML_CACHE_TIME'   =>    3600,			// 全局静态缓存有效期(秒)
'HTML_FILE_SUFFIX'  =>    '.html',		// 设置静态缓存文件后缀
'HTML_CACHE_RULES'  =>     array(		// 定义静态缓存规则

	// 定义整个文章控制器
	'Article:'		=>		'Article/{:action}_{id}',
	
	// 对商品进行缓存
	'Product:plist'	=>		'Product/plist_{id}_{pid}',
	
	// 对单个操作进行缓存
	'Index:index'	=>		'Index/index',
	'Product:category'=>array('Product/category',0),
	
),
//------------------------------------------------------------
//---------------------数据缓存(通用缓存)--------------------
// 查询缓存,快速缓存
// 数据缓存
// 缓存的文件在 Runtime/Temp中
'DATA_CACHE_TYPE'		=>		'File',
'DATA_CACHE_PREFIX'	=>		'Kangku_',
'DATA_CACHE_TIME'		=>		600,

//------------------------------------------------------------
//-----------------------快速缓存-----------------------------
// 永久缓存

// 缓存数据
F('data',$Data);
// 指定目录 默认DATA_PATH
F('data',$Data,TEMP_PATH);
// 删除缓存
F('data',NULL);
//------------------------------------------------------------
//-----------------------查询缓存-----------------------------
// 查询时缓存
// 只要加上cache(true)后第一次查询后就从缓存数据中取值,不用其他判断

// 1.默认缓存
$Model->cache(true)->where('status=1')->select();
// 2.给缓存取名,可用此名称读值
$Model->cache('cache_name')->select();
// 读值
$value = S('cache_name');

// 3.设置缓存方式与时间
$Model->cache(true,60,'file')->select();
//------------------------------------------------------------
//--------------------SQL解析缓存-----------------------------
//开启缓存
'DB_SQL_BUILD_CACHE' => true,
//缓存方式
'DB_SQL_BUILD_QUEUE' => 'file',
// SQL缓存的队列长度
'DB_SQL_BUILD_LENGTH' => 20,