ThinkPHP中的BUG及技巧与策:
1. 模板中不能使用的标签
{ $content } { $i }
2. If标签
如: <if condition="$name eq 1 ">
试验后总是有想不到的错误, 这样,还不如直接用<?php if(...){ ...?>来得快些呢.
约定:
1.所有类库文件必须使用.class.php作为文件后缀,并且类名和文件名保持一致
2.控制器的类名以Action为后缀
3.模型的类名以Model为后缀,类名第一个字母须大写
4.数据库表名全部采用小写,
如:
数据表名: 前缀_表名
模型类名: 表名Model 注:这里的表名第一个字母要大写
创建对象: D('表名') 注:这里的表名第一个字母要大写
定义控制器类
class IndexAction extends Action{ public function show(){ echo ' 这是新的 show 操作 ' ; } }
然后在浏览器里面输入
http://localhost/myApp/index.php/Index/show/
定义模型类:
class 表名Model extends Model{ [ // 手动定义字段[可选] protected $fields = array ( ' id ' , ' username ' , ' email ' , ' age ' , ' _pk ' => ' id ' , // 主键 ' _autoInc ' => true // 是否自增 ) ] }
记录的修改:
$User = D( " User " ) // 实例化 User 对象 $User -> find( 1 ) // 查找 id 为 1 的记录 $User -> name = ' ThinkPHP ' // 把查找到的记录的名称字段修改为 ThinkPHP $User -> save() // 保存修改的数据
更新特定字段的值
$User -> setField( ' name ' , ' TopThink ' , ' id=1 ' )
同样可以支持对字段的操作
$User -> setField( ' score ' , ' (score+1) ' , ' id=1 ' )
新建记录,方法1:
$User = new UserModel() // 实例化 User 对象 $User -> 字段名 = 字段值 // 给字段赋值 $User -> add() // 添加记录
新建记录,方法2:
$data [ ' 字段名 ' ] = 字段值; // 给字段赋值 $User = D( ' User ' ); // 实例化 User 对象 $User -> add( $data ); // $insertId,Add 方法的返回值就是最新插入的主键值,可以直接获取。
新增多条记录:
$User = new UserModel() $data [ 0 ][ ' name ' ] = ' ThinkPHP ' $data [ 0 ][ ' email ' ] = ' ThinkPHP@gmail.com ' $data [ 1 ][ ' name ' ] = ' 流年 ' $data [ 1 ][ ' email ' ] = ' liu21st@gmail.com ' $User > addAll( $data )
删除记录
$User -> find( 2 ) $User -> delete() // 删除查找到的记录 $User -> delete( ' 5,6 ' ) // 删除主键为 5、6 的数据 $User -> deleteAll() // 删除查询出来的所有数据
记录查询
$User -> getDbFields() // 获取当前数据字段 $User -> findAll(); // 查找所有记录 $User -> findAll( ' 1,3,8 ' ) // 查询主键为1,3,8的记录集 $User -> count () // 获取记录数 $User -> max ( ' score ' ) // 获取用户的最大积分 $User -> min ( ' score ' , ' score>0 ' ) // 获取积分大于 0 的用户的最小积分 $User -> avg( ' 字段名 ' ) // 获取所有记录的字段值的平均值 $User -> sum( ' 字段名 ' ) // 统计字段值 $User -> getN( 2 , ' score>80 ' , ' score desc ' ) // 返回符合条件的第 2 条记录 $User -> getN( 2 , ' score>80 ' , ' score desc ' ) // 还可以获取最后第二条记录 $User -> first( ' score>80 ' , ' score desc ' ) // 如果要查询第一条记录,还可以使用 $User -> last( ' score>80 ' , ' score desc ' ) // 获取最后一条记录 $User -> top( 5 , '' , ' score desc ' ) // 获取积分最高的前 5 条记录 $User -> getBy( ' name ' , ' liu21st ' ) // 跟据字段的字段值来查询记录 $Model = new Model() // 实例化一个 model 对象 没有对应任何数据表 $Model -> query( " select * from think_user where status=1 " ) $objrs = $Model -> query( " select * from think_user where status=1 " ) // 自定义查询 $Model -> execute( " update think_user set name='thinkPHP' where status=1 " ) // 用于更新和写入数据的 sql 操作,返回影响的记录数 $User -> startTrans() // 启动事务 $User -> commit() // 提交事务 $User -> rollback() // 事务回滚
模板:
$this -> assign( ' name ' , $value ); // 在 Action 类里面使用 assign 方法对模板变量赋值,无论何种变量类型都统一使用 assign 赋值 $this -> display() // 输出模版文件
批量赋值
$array [ ' name ' ] = ' thinkphp ' $array [ ' email ' ] = ' liu21st@gmail.com ' $array [ ' phone ' ] = ' 12335678 ' $this -> assign( $array ) $this -> display() // 调用 User 模块的 read 操作模版 $this -> display( ' edit ' ) // 调用 User 模块的 edit 操作模版 $this -> display( ' Member:read ' ) // 调用 Member 模块的 read 操作模版 $this -> display( ' Xp@User:edit ' ) // 调用 Xp 主题的 User 模块的 edit 操作模版 $this -> display( ' ../Member/read.html ' ) // 直接指定模版文件的全名
模板标签:
{ /* 注释内容 */ } 或 { // 注释内容 } //模板注释 { $user [ ' name ' ]} // 输出数组变量 { $user : name} // 输出对象的属性
为了方便模板定义,无论输出的模板变量是数组还是对象,都可以用下列统一方式输出:
{ $user . name}
如果是多维数组或者多层对象属性的输出,请使用下面的定义方式:
{ $user [ ' sub ' ][ ' name ' ]} { $user : sub : name}
使用函数:
格式:{$varname|function1|function2=arg1,arg2,### }
说明:
{ 和 $ 符号之间不能有空格 ,后面参数的空格就没有问题
###表示模板变量本身的参数位置
系统变量
{ $Think . server . script_name } // 取得$_SERVER 变量 { $Think . session . session_id | md5 } // 获取$_SESSION 变量 { $Think . get . pageNumber } // 获取$_GET 变量 { $Think . cookie . name } // 获取$_COOKIE 变量
系统常量
{ $Think . const . __FILE__ } { $Think . const . MODULE_NAME }
特殊变量 ,由 ThinkPHP 系统定义的常量
{ $Think . version } // 版本 { $Think . now } // 现在时间
快捷输出
{ : function (…)} // 执行方法并输出返回值 { ~ function } // 执行方法不输出 {@ var } // 输出 Session 变量 { & var } // 输出配置参数 { % var } // 输出语言变量 { . var } // 输出 GET 变量 { ^ var } // 输出 POST 变量 { * var } // 输出常量
包含外部文件
< include file = " $tplName " /> // 用变量控制要导入的模版 < include file = " ../Public/header.html " /> // 使用一个完整的文件名包含
循环输出
iterate 还有其它的别名,包括 volist,resultset,sublist
模版赋值:
$User = D( ' User ' ) $list = $User -> findAll() $this -> assign( ' list ' , $list )
模版定义:
< iterate name = " list " id = " vo " > { $vo . name} </ iterate >
注意 name 和 id 表示的含义
// 输出 list 的第 5~15 条记录 < iterate name = " list " id = " vo " offset = " 5 " length = ' 10 ' > { $vo . name} </ iterate >
// 输出偶数记录 < iterate name = " list " id = " vo " mod = " 2 " > < eq name = " mod " value = " 1 " > { $vo . name} </ eq > </ iterate >
// 输出 key < iterate name = " list " id = " vo " key = " k " > { $k } . { $vo . name} </ iterate >
// 子循环输出 < volist name = " list " id = " vo " > < sublist name = " vo['sub'] " id = " sub " > { $sub . name} </ sublist > </ volist >
Switch 标签
< switch name = " name " > < case value = " 1 " > value1 </ case > < case value = " 2 " > value2 </ case > < default /> default </ switch >
其中 name 属性可以使用函数以及系统变量,例如:
< switch name = " Think.get.userId|abs " > < case value = " 1 " > admin </ case > < default /> default </ switch >
也可以对 case 的 value 属性使用变量,例如:
< switch name = " userId " > < case value = " $adminId " > admin </ case > < case value = " $memberId " > member </ case > < default /> default </ switch >
比较标签
< eq name = " name " value = " value " > value </ eq > // name 变量的值等于 value 就输出 < neq name = " name " value = " value " > value </ neq > // name 变量的值不等于 value 就输出 < gt name = " name " value = " 5 " > value </ gt > // name 变量的值大于 5 就输出 < egt name = " name " value = " 5 " > value </ egt > // name 变量的值大于等于 5 就输出 < lt name = " name " value = " 5 " > value </ lt > // name 变量的值小于 5 就输出 < elt name = " name " value = " 5 " > value </ elt > // name 变量的值小于等于 5 就输出
//其实上面的所有标签都是 compare 标签的别名
// 其中 type 属性的值就是上面列出的判断标签名称
< compare name = " name " value = " 5 " type = " eq " > value </ compare > // name 变量的值等于 5 就输出
If标签
< if condition = " $name eq 1 " > value1 < elseif condition = " $name eq 2 " /> value2 < else /> value3 </ if >
C操作
操作(动态)配置: 主要用于Action方法里面
获取:
C('配置参数')
设置:
C('配置参数',新值)
A操作
快速创建Action对象:
$action = A( ' User ' );
等效于
$action = new UserAction();
D操作
快速创建模型数据对象:
$model = D( ' User ' );
等效于
$model = new UserModel();
S操作
快速操作缓存方法
获取:
S( ' name ' )
设置:
S( ' name ' , ' value ' );
删除:
S( ' name ' , NULL );
F操作
快速文件数据保存方法
使用方法与S操作一样
L操作
快速操作语言变量
获取:
L('语言变量');
设置:
L('语言变量','值');
如: L('USER_INFO','用户信息'); //设置名称为USER_INFO的语言变量
批量赋值:
$arr [ ' 语言变量1 ' ] = ' 值1 ' ; $arr [ ' 语言变量2 ' ] = ' 值2 ' ; L( $arr );
Create PROCEDURE procedure1 /* name存储过程名 */ (IN parameter1 INTEGER ) /* parameters参数 */ BEGIN /* start of block语句块头 */ DECLARE variable1 CHAR( 10 ); /* variables变量声明 */ IF parameter1 = 17 THEN /* start of IF IF条件开始 */ SET variable1 = ' birds ' ; /* assignment赋值 */ ELSE SET variable1 = ' beasts ' ; /* assignment赋值 */ END IF ; /* end of IF IF结束 */ Insert INTO table1 VALUES (variable1); /* statement SQL语句 */ END /* end of block语句块结束 */
ThinkPHP系统常量
THINK_PATH // ThinkPHP 系统目录 APP_PATH // 当前项目目录 APP_NAME // 当前项目名称 MODULE_NAME // 当前模块名称 ACTION_NAME // 当前操作名称 TMPL_PATH // 项目模版目录 LIB_PATH // 项目类库目录 CACHE_PATH // 项目模版缓存目录 CONFIG_PATH // 项目配置文件目录 LOG_PATH // 项目日志文件目录 LANG_PATH // 项目语言文件目录 TEMP_PATH // 项目临时文件目录 PLUGIN_PATH // 项目插件文件目录 VENDOR_PATH // 第三方类库目录 DATA_PATH // 项目数据文件目录 IS_APACHE // 是否属于 Apache IS_IIS // 是否属于 IIS IS_WIN // 是否属于Windows 环境 IS_LINUX // 是否属于 Linux 环境 IS_FREEBSD // 是否属于 FreeBsd 环境 NOW_TIME // 当前时间戳 MEMORY_LIMIT_ON // 是否有内存使用限制 MEMORY_LIMIT_ON // 是否有内存使用限制 OUTPUT_GZIP_ON // 是否开启输出压缩 MAGIC_QUOTES_GPC // MAGIC_QUOTES_GPC THINK_VERSION // ThinkPHP 版本号 LANG_SET // 浏览器语言 TEMPLATE_NAME // 当前模版名称 TEMPLATE_PATH // 当前模版路径 __ROOT__ // 网站根目录地址 __APP__ // 当前项目(入口文件)地址 __URL__ // 当前模块地址 __ACTION__ // 当前操作地址 __SELF__ // 当前 URL 地址 TMPL_FILE_NAME // 当前操作的默认模版名(含路径) WEB_PUBLIC_URL // 网站公共目录 APP_PUBLIC_URL // 项目公共模版目录
预定义常量
WEB_LOG_ERROR = 0 // 错误日志类型 WEB_LOG_DEBUG = 1 // 调试日志类型 SQL_LOG_DEBUG = 2 // SQL 日志类型 SYSTEM_LOG = 0 // 系统方式记录日志 MAIL_LOG = 1 // 邮件方式记录日志 TCP_LOG = 2 // TCP 方式记录日志 FILE_LOG = 3 // 文件方式记录日志 DATA_TYPE_OBJ = 1 // 对象方式返回 DATA_TYPE_ARRAY = 0 // 数组方式返回 URL_COMMON = 0 // 普通模式 URL URL_PATHINFO = 1 // PATHINFO URL URL_REWRITE = 2 // REWRITE URL HAS_ONE = 1 // HAS_ONE 关联定义 BELONGS_TO = 2 // BELONGS_TO 关联定义 HAS_MANY = 3 // HAS_MANY 关联定义 MANY_TO_MANY = 4 // MANY_TO_MANY 关联定义 EXISTS_TO_VAILIDATE = 0 // 表单存在字段则验证 MUST_TO_VALIDATE = 1 // 必须验证 VALUE_TO_VAILIDATE = 2 // 表单值不为空则验证