资源描述
CI业务流程:
域名/入口(默认为index.php)/控制器/函数/参数1/参数2....
(入口设置:config.php中的$config['index_page'] = 'index.php';)
每个控制器都是一个 类Class, 在每个 Class 里面的 function 都是一个页面, 嗯, 这个概念很重要!访问(加载)页面都得访问对应控制器的对应function
CI中的URI字符串有着和它唯一对应的控制器(controller)类/方法,ci中的uri从控制器名开始
CI的控制器类类名首字母必须大写,继承核心的控制器类CI_Controller,并且这个类的文件名必须和类名相同。
CI中每个页面都要通过控制器来装载 比如:<frame src="<?php echo(index.php/controller/function) ?>" name="framename"/>
用户通过URL访问的就是某个控制器类中的具体成员方法,url方法段后的按次序传入方法中的形式参数
数据通过控制器以一个数组或是对象的形式传入视图 , 这个数组或对象作为视图载入函数的第二个参数
CI中$this->db->query()返回结果集的一个对象集合,每条记录为一个对象。
$this->uri->segment(n,default) 它允许你重新分割一个详细的URI分段。 n 为你想要得到的段数。分割数按照从左至右的顺序编排,默认情况下URI没有分段那么该函数返回 FALSE(布尔值)。如果分段信息丢失,Segment函数还有第二个参数用来设置你的默认值
$this->load->helper("url");
anchor(uri,title,[attributes]); 类似a标签 title相当于a标签的value,attributes用来添加标签属性
base_url($uri) 获取config.php中的$config['base_url']的值.$uri
site_url($uri); 将uri变成完整的url 即$config['base_url'].$config['index_page'].$uri
redirect($uri,$method="location",$http_response_code=302) 重定向,即跳转页面 uri 从控制器类开始
$result=$this->db->query(".....");
$result->result(); 返回的是结果集的对象集合,一条记录为一个对象。
config.php中的$config['global_xss_filtering']=true; 自动防止攻击
this->input->post('name'); 接收提交的数据
上传:
function up()
{
$config['upload_path']="./upload";
$config['allowed_types']="gif|jpg|png";
$config['max_size']="20000";
$this->load->library("upload",$config);
if($this->upload->do_upload('upfile'))
{
$data=array('upload_data'=>$this->upload->data());
var_dump($data);
}
else
{
$error=array('error'=>$this->upload->display_errors());
var_dump($error);
}
}
session:
$this->load->library('session');
$arr=array('uid'=>$uid);
$this->session->set_userdata($arr);
echo '<br />';
echo $this->session->userdata('uid');
$this->session->unset_userdata($arr);
Kndb session的使用
这个类把ci自带的session类功能进行了扩展,将数据存储到数据库,所以要在配置文件config.php中进行配置
$config['sess_cookie_name'] = 'ci_session';
$config['sess_expiration'] = 7200;
$config['sess_expire_on_close'] = FALSE;
$config['sess_encrypt_cookie'] = FALSE;
$config['sess_use_database'] = TRUE;
$config['sess_table_name'] = 'ci_sessions';
$config['sess_match_ip'] = TRUE;
$config['sess_match_useragent'] = TRUE;
$config['sess_time_to_update'] = 300
TP(2.0):
下面是一个标准的入口文件的写法:
<?php
// 定义ThinkPHP框架路径(相对于入口文件)
define('THINK_PATH', '../ThinkPHP');
//定义项目名称和路径
define('APP_NAME', 'Myapp');
define('APP_PATH', './Myapp');
//define('RUNTIME_PATH','./admin/temp/');
//使~runtime.php文件保留空白和注释
//define('STRIP_RUNTIME_SPACE', false);
// 加载框架入口文件
require(THINK_PATH."/ThinkPHP.php");
//实例化一个网站应用实例
App::run();
?>
Thinkphp默认的惯例配置全部在tp系统目录下的Common中的convention.php文件中
Runtime文件夹中的~app.php和~runtime.php是编译缓存文件
编译缓存的基础原理是第一次运行的时候把核心需要加载的文件去掉空白和注释后合并到一个文件中,第二次运行的时候就直接载入编译缓存而无需载入众多的核心文件
~runtime.php包含的是系统默认加载的核心文件由TP系统Common目录下的core.php文件决定
~app.php包含:1、项目配置文件(1、惯例配置-可以理解为默认配置,2、项目配置-可以理解为自定义配置。自定义配置的优先级高);2、项目公用函数文件common.php
如果开发过程中对一些加载文件进行修改后,就得手动将生成的编译缓存删除,不然系统将读取编译缓存,这样就无法显现出修改的效果。这种情况下最好就不要产生编译缓存
不产生编译缓存的方法:在主入口文件中定义define('NO_CACHE_RUNTIME',true) 这样就不会产生~runtime.php文件了
每个控制器都是一个 类Class, 在每个 Class 里面的 function 都是一个页面, 嗯, 这个概念很重要! 访问(加载)页面都得访问对应控制器的对应function
控制器,模型和视图命名规则:
文件名首字母大写接着(控制器为Action,模型为Model,视图为View),文件后缀为.class.php
类名必须与文件名相同,大小写也要一致,然后继承相应的父类,Action、Model、View......
控制器的私有方法不能作为一个页面被用户访问,但能在其他方法中被调用
ThinkPHP支持的URL模式包括普通模式、PATHINFO模式(默认模式)、REWRITE模式和兼容模式(根据环境的支持情况,智能的使用pathinfo或者普通模式)
在项目目录下的Conf目录中的config.php文件中以 'URL_MODEL'=>0,(0普通模式,1为pathinfo,2为rewrite,3为兼容) 进行修改
REWRITE模式:不论是被重写的,还是没被重写的。都能够通过原有路径来进行访问。在项目入口文件同级的目录下面新建一个.htaccess ,rewrite模式会加大你服务的性能消耗
Pathinfo两种模式:
默认情况使用PATHINFO模式,ThinkPHP内置强大的PATHINFO支持,提供灵活和友好URL支持。PATHINFO模式根据不同的设置还包括普通模式和智能模式两种:
普通模式 设置URL_PATHINFO_MODEL参数为1
该模式下面URL参数没有顺序,例如
http://<serverName>/appName/m/module/a/action/id/1
http://<serverName>/appName/a/action/id/1/m/module
以上URL等效
智能模式 设置URL_PATHINFO_MODEL参数为2 (系统默认的模式)
自动识别模块和操作,例如
http://<serverName>/appName/module/action/id/1/ 或者
http://<serverName>/appName/module,action,id,1/
在智能模式下面,第一个参数会被解析成模块名称(或者路由名称,下面会有描述),第二个参数会被解析成操作(在第一个参数不是路由名称的前提下),后面的参数是显式传递的,而且必须成对出现,例如:
http://<serverName>/appName/module/action/year/2008/month/09/day/21/
其中参数之间的分割符号由URL_PATHINFO_DEPR参数设置,默认为”/”,例如我们设置URL_PATHINFO_DEPR为“-”的话,就可以使用下面的URL访问
http://<serverName>/appName/module-action-id-1/
注意不要使用”:” 和”&”符号进行分割,该符号有特殊用途。
略加修改,就可以展示出富有诗意的URL,呵呵~
如果想要简化URL的形式可以通过路由功能(后面会有描述)以及空模块和空操作。
在PATH_INFO模式下面,会把相关参数转换成GET变量,以及并入REQUEST变量,因此不妨碍URL里面的GET和REQUEST变量获取。
'APP_DEBUG'=>TRUE, 模拟linux操作系统来区分大小写(用方法1 display模板,模板文件名和url中的方法名大小写要一致)(文件夹的名称不区分大小写)
载入模板:在项目目录下Tpl文件夹->主题文件夹(默认是default文件夹)->控制器名文件夹->模板(模板名与方法名相同,但是项目里可能没有该控制器,或者该方法,但是模板可以照样display,只是一种命名规则)
$this->display(url[,编码[,mime]]);
1、 $this->display(); 载入当前控制器下当前方法的模板
2、 $this->display(‘方法名’); 模板名与方法名相同,但是项目的当前控制器可以没有这个方法,这个模板照样可以使用
3、 $this->display('[分组名:]控制器名:方法名') 其中分组名是可选的
4、$this->display('主题@控制器名:方法名');
5、$this->display('./public/test.html'); 也可以用相对路径,相对于主入口文件
(模板的js css文件如果用相对文件路径都要相对于主入口文件)\
(用的时候大小写尽量和目录文件一致,这样比较规范)
模板普通标签的修改(在里面用assign进去的变量)
在项目配置文件中定义:
'TMPL_L_DELIM'=>'<{',
'TMPL_R_DELIM'=>'}>',
Thinkphp系统常量:
__ROOT__ 站点根目录地址
__APP__ 当前应用的入口文件地址 (从根目录'/'开始 下同)
__URL__ 当前控制器地址
__ACTION__ 当前方法地址
__SEFL__ 当前URL地址
__CURRENT__ 当前的控制器的模板目录
ACTION_NAME 当前方法名称
APP_PATH 当前应用目录
APP_NAME 当前应用名称
APP_TMPL_PATH 当前应用的模板目录
APP_PUBLIC_PATH 代表项目公共文件目录
CACHE_PATH 项目模版缓存目录
CONFIG_PATH 项目的配置文件放在什么地方
COMMON_PATH 项目的公共文件目录
DATA_PATH 项目数据文件目录 tp会自动缓存与表相关的结构信息
GROUP_NAME
HTML_PATH 项目静态文件目录(静态缓存文件目录)
IS_APACHE
IS_CGI
IS_IIS
IS_WIN 是否是windows操作平台
LANG_SET 当前浏览器语言
LIB_PATH 项目lib目录
LOG_PATH 日志文件目录
LANG_PATH 语言文件目录
MODEL_NAME 当前模块名称
MEMORY_LIMIT_ON 当前内存限制
MAGIC_QUOTES_GPC 是否开启自动转义
TEMP_PATH 项目数据缓存路径设置
TMPL_PATH 项目模板目录
THINK_PATH TP系统目录
THINK_VERSION 版本
TEMPLATE_NAME 当前模板名称
TEMPLATE_PATH 当前模板路径
VENDOR_PATH 扩展类库目录
WEB_PUBLIC_PATH 网站公用目录 (用来存放css js等文件,一般与入口文件同在一个目录)
以上系统常量在开发包 docs/cheatsheet中的.png文件中 有列举
完全开发手册中8.1中也有
模板中的常量:
__URL__ 当前控制器地址(从根目录'/'开始 下同)
__PUBLIC__ 网站公用目录 (用来存放css js等文件,与入口文件同在一个目录)
../Public 项目公共文件目录 Tpl/default中的Public文件夹
__TMPL__ 当前应用的模板目录 .......Tpl/default
__APP__ 应用入口文件地址
__ACTION__ 当前方法地址
__SELF__ 当前整个url地址
在应用的config.php文件中
'TMPL_PARSE_STRING'=> array(
'__PUBLIC__' => '/Common', // 更改默认的__PUBLIC__ 替换规则
'__UPLOAD__' => '/Public/Uploads/', // 增加新的上传路径替换规则
),
可以自己定义和覆盖常量
第7课:(调试信息和trace信息都是加载到模板中去显示的)
Tp调试模式:(调试默认配置文件: tp系统目录下Common中的debug.php文件)
即在项目目录下的Conf目录中的config.php文件中开启'APP_DEBUG'=>TRUE, 调试模式相关设置文件是tp系统目录下Common中的debug.php文件,当然也不开启'APP_DEBUG'(即不载入debug.php文件)直接在config.php文件中写入相关设置(设置项可以从debug.php文件中复制过去)
自定义调试文件(附加在默认上),在Conf目录下增加一个debug.php文件(格式要跟Common中的debug.php文件一样),在文件里添加自己需要的信息
DB_FIELDS_CACHE数据库字段缓存系统默认为开启状态,如果开启的话,会在Runtime\Data文件夹下生成文件缓存,并且修改字段之后,这个缓存无法记录你的操作,需要我们手动删除一次,对表的修改才会被程序读取到。 开启'APP_DEBUG',DB_FIELDS_CACHE数据库字段缓存为关闭状态,
页面Trace信息: (Trace默认配置文件:tp系统目录下Tpl中的PageTrace.tpl.php文件 )
一个用于开发调试的辅助手段。可以实时显示当前页面的操作的请求信息、运行情况、SQL执行、错误提示等,启用调试模式的话,页面Trace功能会默认开启(除非在项目的调试配置文件中关闭),并且系统默认的Trace信息包括:当前页面、请求方法、通信协议、请求时间、用户代理、会话ID、运行情况、SQL记录、错误记录和文件加载情况。
自定义项目trace文件:在项目config.php文件中设置'TMPL_TRACE_FILE'=> ,
如果想在默认的trace信息基础上附加自己的trace信息,可以在项目的Conf目录下增加一个trace.php文件(格式参考该课相关文件)
在方法中也可以附加trace信息,$this->trace('名称',值);
调试时获取一段代码的运行时间:
debug_start('run');
//调试代码
debug_end('run');
memory_get_usage; //获取使用内存大小
halt(''); //中断程序,输出函数传入的内容
模型调试:就是显示数据库操作类中的执行的sql语句
M()方法就是new Model();
Model对象->getLastSql();//获取上一条执行的sql语句
日志记录:sql级别日志必须在开启调试模式下才会记录
系统的日志记录是由核心的Log类完成的
在config.php文件中,'LOG_RECORD'=>TRUE,开启日志记录
'LOG_RECORD_LEVEL'=>array('EMERG','ALERT','ERR'), //添加要记录的级别,在Log类中找
TP手动记录日志:写在控制器方法中,Log有个静态方法Log::write($message,$level,$type,$destination);//$type指记录方式
Log::record(); //记录到内存中
Log::save(); //可以把Log::record()函数放在内存的日志信息保存起来
在开发过程中建议开启APP_DEBUG
注意:<frameset><frame>分帧当中不能够有body,而app_debug出来的信息属于body体里面的内容,所以说,会显示一切空白
第8课:连接数据库
在项目config.php文件中(对整个项目有效)
'DB_TYPE'=>'mysql', // 指定数据库类型
'DB_HOST'=>'LOCALHOST',
'DB_NAME'=>'videodemo,videodemo1,videodemo2', //如果数据库名都相同的话,你可以不用定义多个
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PORT'=>'3306',//mysql默认端口
//'DB_PREFIX'=>'think_',//表前缀 默认为think_
//'DB_SUFFIX' => '', // 数据库表后缀 默认为''
//'DB_RW_SEPARATE'=>true, 默认为false
// 'DB_CHARSET'=>'',//默认为utf8
//'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查 默认为false
//'DB_FIELDS_CACHE' => true, // 启用字段缓存 默认为true
在控制器方法中可以手动连接数据库,(可用于跨库操作)
1、 dsn方式(PDO)
$dsn='mysql://username:password@hostname:port/DBname';
$db=new Db($dsn);
2、 dsn手动new DB
$dsn=array(
'dbms'=>'mysql', //数据库类型
'username'=>'',
'password'=>'',
'hostname'=>'', //主机地址
'hostport'=>'',
'database'=>'',
);
$db=new Db($dsn);
3、 写到模型中(自定义数据库类)
在模型类中 创建一个 protected $connection=array(
'dbms'=>'mysql', //数据库类型
'username'=>'',
'password'=>'',
'hostname'=>'', //主机地址
'hostport'=>'',
'database'=>'',
);或者='mysql://username:password@hostname:port/DBname';
TP主从数据库:高并发 高负载
//他会在写入的过程当中,自动去找一台服务器,读取的时候,也会在这当中自动去找一台数据库服务器
//数据信息同步 不是在框架中实现 数据库本身的同步机制 (数据库集群)
config.php中 'DB_DEPLOY_TYPE'=> 0, // 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
'DB_HOST'=>'localhost,192.168.1.2,192.168.1.9', //多个数据库主机地址
'DB_NAME'=>'videodemo,videodemo1,videodemo2', //如果数据库名都相同的话,你可以不用定义多个
'DB_USER'=>'root',//一样的话不用写多个
'DB_PWD'=>'liwenkaihaha',//一样的话不用写多个
'DB_PORT'=>'3306',//一样的话不用写多个
'DB_PREFIX'=>'think_',//一样的话不用写多个
'DB_RW_SEPARATE'=>true,//读写分离 默认第一台数据库服务器为写服务器,后面的都为读服务器
都是一一对应的关系,最好都定为统一的(当然DB_HOST是没法一样的,因为每个数据库主机地址是不一样的)
还要在数据库服务器当中进行相应的配置
//上网找资料设置数据库集群
C(‘配置项’{,’新值’}); 读取配置文件 在控制器的方法中使用 如C('DB_HOST');只有第一个参数那将读取,存在第二个参数那就是对该配置项重新赋值(新值为第二个参数)
第9课 实例化模型:
首先数据库的表名和字段全部采用小写形式,模型类的命名规则是除去表前缀的数据表名称,并且首字母大写,然后加上模型类的后缀定义
M(‘表名’[,‘模型类名’]) 第二个参数缺省值为Model
1、 $user=new Model('表名'); 使用系统自带的Model类 等同于 $user=M('表名');
2、 $user=M('表名','自定义模型类名'); $user可以调用自定义模型中的方法
等同于 $user=new 自定义模型类名('表名');
3、$user=new UserModel(); 不用传入表名 把表名作为模型名前缀 这里表名是User
等同于$user=D('user'); 这里user为模型名前缀也为表名
D方法可以自动检测模型类,不存在时,它会抛出一个异常。同时对于已实例化过的模型,不会去重复实例化。默认的D方法只能支持调用当前项目(应用)下面的模型,如果要实例化跨应用模型,得用 D('应用名','模型名前缀');或者D('应用名.模型名前缀');
4、 传统方式 $user=new Model(); $user=M(); $user=new 自定义模型(); 不传表名,用传统的sql语句来操作数据库(推荐,方便把表具体的操作写在模型类里面,而且可以减少系统开销),注意用这种方式就得手动添加表前缀和后缀,也就是用完整的表名
第10课 cerate方法与令牌:
private 属性不能够被继承。
使用private继承, 父类的protected和public属性在子类中变为private;
使用protected继承,父类的protected和public属性在子类中变为protected;
使用public继承, 父类的protected和public属性不发生改变;
如下所示:
public: protected: private:
public继承 public protected 不可用
protected继承 protected protected 不可用
private继承 private private 不可用
protected继承和private继承能降低访问权限。
1.在实例化一个类的对象时,先要实例化该类的成员变量,再执行该类的构造函数。
2. 在实例化一个类的成员变量时,先要实例化静态成员变量,再实例化非静态成员变量。
3. 一个类的静态成员变量只实例化一次,即只有一个拷贝,在该类的所有对象中共享。
4. 执行一个类的静态成员函数时,该类的对象并没有生成,因此,只会实例化该类的静态成员变量,而不会实例化非静态成员变量,也不会执行构造函数。
// 模型名称
protected $name = '';
// 数据库名称
protected $dbName = '';
当new一个Model类或者其子类的时候,传进去的表名存放在
// 数据表名(不包含表前缀)
protected $tableName = '';
实际完整的表名会在实例化对象的时的构造函数中处理然后存放在$trueTableName
// 实际数据表名(包含表前缀)
protected $trueTableName ='';
所以当不想用传进来的表名时,可以protected $tableName='',进行修改
注意$trueTableName的值为小写,即完整的表名为小写
protected $dbName=''; 跨库(因为$trueTableName=$dbName.$tableName)
手动设置字段信息
protected $fields=array(
0=>'id',
1=>'username',
'_pk'=>'id',
'_autoinc'=>true
);
上述这些可以在自定义模型类中进行修改,也可以实例化对象后进行修改 $对象名—>成员属性=’’;因为Model类中有__set方法
$this->getPK();获取主键
Create方法与令牌:(作用:获取表单提交的数据压入模型对象中,自动验证和自动填充,令牌防止模拟的来源上级访问网页)
Create方法是模型里的方法
create方法默认用$_POST获取表单数据,如果用get方式传递过来的,可以先手动获取,然后将值最为参数传入create($_GET)
因为public function create($data='',$type='')
if(empty($data)) {
$data = $_POST;
}elseif(is_object($data)){
$data = get_object_vars($data);
}elseif(!is_array($data)){
$this->error = L('_DATA_TYPE_INVALID_');
return false;
}
.........
Create方法成功返回一个包含提交数据和自动填充数据的数组,失败返回false
模型对象的getError()方法可以获取create失败的错误信息
在配置文件中可以设置:
TOKEN_ON = true
是否开启令牌验证
TOKEN_NAME = '__hash__'
令牌验证的表单隐藏字段名称
TOKEN_TYPE = 'md5'
令牌验证哈希规则
如果在开启表单令牌验证的情况下,个别表单不需要使用令牌验证功能,可以在表单页面添加__NOTOKEN__(在定界符中)
一个页面中有多个表单,那么在表单中添加__TOKEN__(在定界符中),那么令牌信息将会出现在__TOKEN__的位置,将其替换掉
如果不想用create方法但是又要使用令牌,tp提供了一个方法,$模型对象->autoCheckToken($_POST); 成功返回true 失败返回false
可以对模型对象的成员属性进行修改,添加 (通过模型基类中魔术方法实现对象对private和protected成员属性的访问) 对create获取的数据进行修改,可以用模型对象成员属性的操作方法进行修改
第11课 curd和关联操作
注意:表单内项的name属性要与数据库中的对应字段名相同
读取数据:
find() 只查询一条记录 返回一个一维数组
select() 查询出所有记录
findAll() 效果个select()一样
如果想使用条件查询,请看手册5.3.10连贯操作 所有的连贯操作都只有一个参数
连贯操作table方法中表前缀不能省略,用完整的表名
getField(‘字段’) 获取该字段的记录 如:$user->where(‘id=4’)->getField(‘us’);
也可以查多个字段
更新数据:(具体看手册5.3.11)
在ThinkPHP中使用save方法更新数据库,并且也支持连贯操作的使用。 返回受影响行数
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@';
$User->where('id=5')->save($data); // 根据条件保存修改的数据
如果没有任何更新条件,数据对象本身也不包含主键字段的话,save方法不会更新任何数据库的记录。
$data['id'] = 5;//id为主键
$data['name'] = 'ThinkPHP';
$data['email'] = 'ThinkPHP@';
$User->save($data); // 根据条件保存修改的数据
如果数组包含主键,系统自动会把主键的值作为更新条件来更新其他字段的值
使用data $User->where('id=5')->data($data)->save(); // 根据条件保存修改的数据
使用create $User->create(); $User->save();
其他更新数据方法:
$User-> where('id=5')->setField(array('name','email'),array('ThinkPHP','ThinkPHP@'));
而对于统计字段(通常指的是数字类型)的更新,系统还提供了setInc和setDec方法:
$User = M("User"); // 实例化User对象
$User->setInc('score','id=5',3); // 用户的积分加3
$User->setInc('score','id=5'); // 用户的积分加1
$User->setDec('score','id=5',5); // 用户的积分减5
$User->setDec('score','id=5'); // 用户的积分减1
添加数据:(具体看手册5.3.11)
使用add方法添加数据到数据库 使用和sava方法一致 也可以不使用系统提供的函数,手动获取数据
add方法的返回值就是最新插入的主键值
删除数据:
使用delete方法删除数据库中的记录 可以使用连贯操作进行删除操作
可以直接向函数传入主键
也可以用使用连贯操作添加限制条件
第12课 增删改查例子:
TP扩展函数详见手册8.3.4
第13课 TP中的查询语言 (stdClass是php的一个基类 为空类)
在手册的5.3.17
普通查询
1、 字符串 如$user->where(‘id>3 and id<8’)->select();
2、 数组 如$user->where(array(‘id’=>1))->select();
3、 对象
如:$condition=new stdClass();//new一个基类对象为空对象
$condition->id=3;//往对象中追加成员属性
$user->where($condition)->select();
查询条件还可以使用查询表达式:表达式不分大小写
EQ =
NEQ !=
GT >
EGT >=
LT <
ELT <=
LIKE 同sql中的like
如果配置了DB_LIKE_FIELDS参数的话,某些字段也会自动进行模糊查询。例如设置了:
'DB_LIKE_FIELDS'=>'title|content'的话,使用
$map['title'] = 'thinkphp';
查询条件就会变成 title like '%thinkphp%'
[NOT] BETWEEN 等价sql里的between
[NOT] IN 等价sql里的in
exp 使用标准sql语句查询
如:$map['id'] = array('neq',100); 表示的查询条件就是 id != 100
详见手册5.3.17.1
区间查询
$map['id'] = array(array('gt',1),array('lt',10)) ;
得到的查询条件是: (`id` > 1) AND (`id` < 10)
$map['id'] = array(array('gt',3),array('lt',10), 'or') ;
得到的查询条件是: (`id` > 3) OR (`id` < 10)
$map['id'] = array(array('neq',6),array('gt',3),'and');
得到的查询条件是:(`id` != 6) AND (`id` > 3)
最后一个可以是AND、 OR或者 XOR运算符,如果不写,默认是AND运算。
区间查询的条件可以支持普通查询的所有表达式
$map['name'] = array(array('like','%a
展开阅读全文