thinkphp开发技巧经验分享

一,常用的系统变量

(1)系统变量:在模板中输出系统变量:包括server、env、session、post、get、request、cookie     

{$Think.server.script_name} // 输出$_SERVER变量

{$Think.session.session_id|md5} // 输出$_SESSION变量 

{$Think.get.pageNumber} // 输出$_GET变量 

{$Think.cookie.name}  // 输出$_COOKIE变量

以上方式还可以写成:

{$_SERVER.script_name} // 输出$_SERVER变量
 
{$_SESSION.session_id|md5} // 输出$_SESSION变量 

{$_GET.pageNumber} // 输出$_GET变量 

{$_COOKIE.name}  // 输出$_COOKIE变量

系统常量 :使用$Think.const 输出

注意:server、cookie、config不区分大小写,但是变量区分大小写。例如:

{$Think.server.script_name}和{$Think.SERVER.script_name}等效

SESSION 、COOKIE还支持二维数组的输出

例如:

{$Think.CONFIG.user.user_name}

{$Think.session.user.user_name}

系统不支持三维以上的数组输出。
 
 
(2)语言变量:输出项目的当前语言定义值

{$Think.lang.page_error}

{$Think.const.MODULE_NAME}

或者直接使用

{$Think.MODULE_NAME}
 
(3)特殊变量 :由ThinkPHP系统内部定义的常量

{$Think.version}  //版本

{$Think.now} //现在时间  

{$Think.template|basename} //模板页面  

{$Think.LDELIM} //模板标签起始符号  

{$Think.RDELIM} //模板标签结束符号
 
(4)配置参数 :输出项目的配置参数值

{$Think.config.db_charset}

输出的值和 C('db_charset') 的结果是一样的。

(5)thinkphp 的系统常量(注意以下常量也可以直接在 action 控制器中直接使用)

__ROOT__ // 网站根目录地址

__APP__ // 当前项目(入口文件)地址

__URL__ // 当前模块地址

__ACTION__ // 当前操作地址

__SELF__ // 当前 URL 地址

__PUBLIC__ // 网站公共目录

二,查询技巧

一、带where条件的普通查询
  
1、字符串形式

 代码如下 复制代码

$user=M('user');
$list=$user->where('id>5 and id<9')->select();
$list=$user->where($data)->select();

2、数组形式

 代码如下 复制代码

$user=M('user');
$list=$user->where(array('username'=>'www.111cn.Net'))->select();
$list=$user->where($data)->select();

3、对象形式

 代码如下 复制代码

$user=M('user');
$a=new stdClass();
$a->username='www.111cn.Net';
$list=$user->where($a)->select();  

4、查询表达式

EQ              等于
NEQ             不等于
GT              大于
EGT             大于等于
LT              小于
ELT             小于等于
LIKE            等价与sql中的like
[NOT] BETWEEN   查询区间
[NOT] IN        查询集合
EXP             指使用标准SQL语句,实现更加复杂的情况

语法格式:$data['字段名']=array('是表达式','查询条件');

例如

$data['username']='www.111cn.Net';

实际上是指

 代码如下 复制代码

$data['username']=array('eq','www.111cn.Net');

$data['username']=array('like','peng%');
$list=$user->where($data)->select();

$data['username']=array(array('like','p%'),array('like','h%'),'or');
$list=$user->where($data)->select();

二、区间查询

 代码如下 复制代码

$user=M('user');
$data['id']=array(array('gt',20),array('lt',23),'and');
$list=$user->where($data)->select();

三、组合查询

 代码如下 复制代码

$user=M('user');
$data['username']='pengyanjie';
$data['password']=array('eq','pengyanjie');
$data['id']=array('lt',30);
$data['_logic']='or';
$list=$user->where($data)->select();
dump($list);

四、复合查询

 代码如下 复制代码

$user=M('user');
$data['username']=array('eq','pengyanjie');
$data['password']=array('like','p%');
$data['_logic']='or';
$where['_complex']=$where;
$where['id']=array('lt',30);
$list=$user->where($data)->select();

相当于

(id<30) and ((username=pengyanjie) or (password like p%))

五、统计查询

 代码如下 复制代码

echo $user->count();
echo '<br>';
echo $user->max('id');
echo '<br>';
echo $user->where('id<30')->min('id');
echo '<br>';
echo $user->avg('id');
echo '<br>';
echo $user->sum('id');

六、定位查询

 代码如下 复制代码

$user=new AdvModel('user');//实例化高级模型AdvModel
//$user=M('user','CommonModel');//或者将AdvModel用CommonModel来继承
$list=$user->order('id desc')->getN(2);//返回结果中的第三条
$list=$user->order('id desc')->last();//返回最后一条
$list=$user->order('id desc')->first();//返回第一条

七、SQL查询

excute()主要用于更新和写入

 代码如下 复制代码

$Model=new Model()  //  实例化一个 model 对象,没有对应任何数据表
$Model->execute("update think_user set name='thinkPHP' where status=1");

query()主要用于查询   

 代码如下 复制代码

$user=M();
$list=$user->query('select * from aoli_user order by id desc');
dump($list);          

八、动态查询

 代码如下 复制代码

$user=M('user');
$list=$user->getByusername('pengyanjie');
$list=$user->getByusername('pengyanjie');

$user=new AdvModel('user');
$list=$user->top5();//前5条

三,内置模板引擎的使用方法总结

(1)下面是控制器 IndexAction 类的源码

 代码如下 复制代码

<?php
class IndexAction extends Action{
    public function index() {
        $_SESSION['name']    =    'ThnkPHP Session';
        $vo    =    array('id'=>1,'name'=>'ThinkPHP','email'=>'liu21st@gmail.com');
        $this->assign('vo',$vo);
        $obj    =    (object)$vo;
        $this->assign('obj',$obj);
        $this->assign('array',array(5,260,13,7,40,50,2,1));
        $this->assign('num1',6);
        $this->assign('num2',2);
        $this->assign('num',6);
        $this->display();
    }
}
?>

(2)以下演示的是上面控制器赋值到模板中的一些变量,常量以及数组的一些基础性用法

普遍变量输出

 代码如下 复制代码

num1:{$num1}

对象输出

 代码如下 复制代码

id:{$obj:id}

name:{$obj:name}

数组输出

 代码如下 复制代码

id:{$vo['id']}

name:{$vo['name']}

自动判断数组和对象输出

 代码如下 复制代码

id:{$vo.id}

name:{$vo.name}

系统常量输出(系统常量可以不用在控制器中使用 assign 赋值)

 代码如下 复制代码

{$Think.now|date='Y-m-d H:i:s',###}

{$Think.server.PHP_SELF}

{$Think.session.name}

对变量使用函数(这里可以是内置函数或者自定义函数)

{$vo.name|strtolower|ucwords}

Foreach 输出

<foreach name="vo" key="key" item="item">
{$key}:{$item}
</foreach>

下面这个例子使用了循环标签、Switch标签、比较标签

 代码如下 复制代码

<volist name="array" id="val" key="i">
[{$i}]
<eq name="odd" value="1">偶数行</eq>
<eq name="odd" value="0">奇数行</eq>
<gt name="val" value="5">{$val}大于5</gt>
<if condition=" $val gt 15">
{$val}大于15
<elseif condition="$val lt 10" />
{$val}小于10
</if>
<switch name="val">
<case value="1">数据{$val}</case>
<case value="2">数据{$val}</case>
<case value="3">数据{$val}</case>
<default />其他数据是 {$val}
</switch>
</volist>

输出结果类似为:

[1] 奇数行 5小于10 长度为1
[2] 偶数行 260大于5 260大于15 长度为3
[3] 奇数行 13大于5 长度为2
[4] 偶数行 7大于5 7小于10 长度为1
[5] 奇数行 40大于5 40大于15 长度为2
[6] 偶数行 50大于5 50大于15 长度为2
[7] 奇数行 2小于10 长度为1
[8] 偶数行 1小于10 长度为1

ThinkPHP内置的模板引擎比较标签

<gt name="num1" value="3">大于3</gt>
<lt name="num2" value="3">小于3</lt>

输出结果类似为:

大于3
小于3
条件判断

 代码如下 复制代码

<if condition=" $num gt 5">
{$num}大于5
<elseif condition="$num gt 3" />
{$num}大于3<else />
其他{$num}
</if>

输出结果类似为:

6大于5

四、thinkphp开发技巧总结

使用thinkphp做开发的过程中的一些技巧总结,以后发现了还会继续补充,也欢迎更多的朋友在下面留言补充。

(1)不要在模板中直接使用{$_GET.id}或者{$Think.get.id},因为{$_GET.id} {$Think.get.id} 这两种方式都没有任何过滤,容易被XSS。建议使用I方法,即:{:I('get.id')}

(2)在thinkphp中如果需要获取数据库中某个表的字段该怎么办呢?示例如下:

 $user=M('user'); 

2 $fields=$user->getDbFields();
结果将返回一个由表字段组成的一个一维数组。

(3)数据修改的过程中如果我们只需要修改某个字段的值,就可以使用setField方法,而不需要每次都调用save方法,例如:

 $user=M('user'); 

2 $user->where('id=2')->setField('username','www.111cn.Net');
(4)涉及到比较的情况下不一定非得使用if condition这种形式的,还可以按如下的形式来写:

 <eq name="web" value="phpernote">value</eq> // name 变量的值等于 phpernote 就输出 

2 <neq name="web" value="phpernote">value</neq> // name 变量的值不等于 phpernote 就输出 

3 <gt name="age" value="5">value</gt> // name 变量的值大于 5 就输出 

4 <egt name="age" value="5">value</egt> // name 变量的值大于等于 5 就输出 

5 <lt name="age" value="5">value</lt> // name 变量的值小于 5 就输出 

6 <elt name="age" value="5">value</elt> // name 变量的值小于等于 5 就输出
(5)在thinkphp的删除操作中可以不使用where直接使用delete来执行删除,例如:

 $User->delete('2,5');//删除主键为2和5的数据
(6)关于thinkphp的几个快速操作的函数的用法说明。

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操作一样。

(7)Model命名时,默认要和数据库里的表名一致,如PhpernoteUserModel.class.php对应数据库的名称应该是 '前缀_phpernote_user',在程序代码中的调用应该是:D('PhpernoteUser');

(8)开发的过程中如不需要进行缓存,可以在入口文件中进行如下定义:

 define('NO_CACHE_RUNTIME',true);
(9)在开发的过程中如果需要知道一些额外的信息,可在配置文件中进行相应的定义,下面给出几个比较常见的信息定义方式:

 'SHOW_RUN_TIME'=>true,//运行时间显示 

2 'SHOW_ADV_TIME'=>true,//显示详细的运行时间 

3 'SHOW_DB_TIMES'=>true,//显示数据库的操作次数 

4 'SHOW_CACHE_TIMES'=>true,//显示缓存操作次数 

5 'SHOW_USE_MEM'=>true,//显示内存开销
(10)自定义Model类并在实例化模型(模型就是数据库操作类)时使用,举例如下:

a、在工程目录下的Lib目录下的Model目录下建立一个IndexModel.class.php,然后里面写一个方法play,此方法内容体为循环输出1至10。

b、那么在Action中的方法里,还可以这么写:

 $index=M('index','IndexModel');//这里可以加上自定义的模型类一起实例化 

2 $index->play();
那么会输出1至10。

(11)使用thinkphp的过程中如果需要更改默认的模板后缀名,可以在配置文件中做如下定义:

 'TMPL_TEMPLATE_SUFFIX' => '.dwt'//这里就将模板后缀名改为了dwt

thinkphp自动验证与自动填充无效总结

(1)create() 方法有问题

ThinkPHP 自动验证与自动填充是在创建数据对象 create() 时实现的,因此自动验证与自动填充无效很大程度上与 create() 有关。

create 方法语法如下:

create(mixed data, string type)

data 表示接受的数据,type 表示本次的具体操作(写入还是更新数据)。两个参数都可省略,data 参数省略的情况下默认为接受 $_POST 数据,而 type 默认情况下由系统自动识别。

但系统自动识别 type 是有缺陷的,当传入的字段有主键字段时,系统就识别为更新操作,否则就是写入操作。所以当主键字段非自动增长而是需要 SQL 写入时,那么自动验证和自动填充都可能无效。

例如添加数据记录时,如果表单中有主键字段或者系统中产生了主键字段(如录入设备编号),那么 ThinkPHP 就认为本次操作为更新操作,对于例如下面设定的自动验证和填充都会略过:

 代码如下 复制代码

protected $_validate = array(

// 新增时验证标题唯一

array('title','','标题已经存在!',0,'unique',1),

};

// 自动填充

protected $_auto = array(

// 新增时填充时间戳

array('pubtime','time',1,'function'),

);

尽管在操作中,执行了 add() 操作将数据写入了数据表,但这时会发现自动验证与自动填充无效。

出现这种情况时,只需将操作类型显式的传入 create() 方法即可,即 create($_POST,1),告诉系统本次操作为写入数据。另外如果传入的数据不是 $_POST ,也要将数据当作参数传入,如 create($_GET)。

(2)数据字段未对应

由于粗心,未对应好表单字段与数据表字段。

(3)数据表字段做了更改

在开发过程中,更改了表字段名称,而缓存未及时更新,导致系统判断为无效字段而被 unset 掉。所以在更改了表字段名称之后,及时将 Runtime/Data 下的数据表缓存清除。

(4)Model 命名错误

Model 命名错误,未严格按照规范命名,如头字母未大写或粗心导致字母顺序不对,多或少字母等。这等错误往往会直接导致模型失效,大小写这边特别需要注意。

(5)数据表无自增的id

就是数据表中没有自增的id时,验证时就会找不到需要验证的数据,所以会失败。

以上就是ThinkPHP自动验证与自动填充无效可能出现的几种原因,当出现问题时要一条一条的进行排除,相信自己一定可以找到错误的,当然还有一些未知的错误,如果您发现了另外的一种原因,请在下方留言指正。

 

时间: 2024-12-21 12:05:12

thinkphp开发技巧经验分享的相关文章

photoshop八个抢救废片的好用技巧经验分享

给各位photoshop软件的使用者们来详细的解析分享一下八个抢救废片的好用技巧经验. 分享一览: 分享八个修复废片的简单技巧,分别是二次构图.直接填色.混乱色温.黑白反差.直方图.拒绝肉片.过度锐化.局部锐化. 每次拍完照片在电脑上检查时,发现不少照片都有问题,比如构图不好,欠曝或者过曝.画面模糊等.对这些照片删掉又觉可惜,但又没有时间进行精细调整,怎么办?下面老狼给大家介绍几个简单粗暴方法,在应对大量照片时,很管用.   一.二次构图,裁出好照片 许多人拍照,按快门的速度快于大脑的思考速度.

photoshop淘宝化妆品类修图及技巧经验分享

给各位photoshop软件的使用者们来详细的解析分享一下淘宝化妆品类修图及技巧经验. 分享一览: 各步骤分解:   开始之前介绍下三种基础的布光方法,其实就是跟产品拍摄布光一样的. 基本上修图都是根据这三种方法来的,不同的只是多加了几道光来增加层次. 或者还有更深的布光我也不了解,修图其实就是还原产品拍摄,或者是拍摄做不到的再来后期修出来. 如总结的不到位欢迎补全. 单侧光:现在大部分产品都是这样的.   对称光:   中亮光:适合透明瓶体,如卸妆油.精油等.   有些产品是不需要加反光的,反

Illustrator矢量设计软件使用技巧经验分享

给各位Illustrator软件的使用者们来详细的解析分享一下矢量设计软件的使用技巧经验. 技巧分享: Illustrator做的字体怎么变弯曲与路径 工具栏上的文本工具是一个工具组,左键单击文本工具不放可以弹出他的组工具,里面有路径文本工具. 使用方法:先利用钢笔工具或者其他图形工具,像你给出来的图就用圆形工具画出圆,然后用路径文本工具,当鼠标移到圆边上的时候有有反应,点击就可以输入文字了,其他路径方法相同! 另外在菜单栏的文本菜单里有路径文本,当成功创建路径文本后,子菜单生效,里面有路径文本

Illustrator路径实用设计技巧经验分享

给各位 Illustrator软件的使用者们来详细的解析分享一下路径实用的设计技巧经验. 分享一览:       好了,以上的信息就是小编给各位Illustrator的这一款软件的使用者们带来的详细的路径实用的设计技巧经验解析分享的全部内容了,各位看到这里的使用者们,小编相信大家现在是很清楚了吧,希望小编上面的教程能给大家带去有用的帮助.

论坛日常管理技巧经验分享 写给广大版主

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断 淘宝客 云主机 技术大厅 今天给了一篇[论坛运营的思路及建议-写给新街口站长的信].之后特意去网上搜了一下关于论坛日常管理技巧的文章却少的可怜.版主其实在论坛里扮演着至关重要的角色,如果说论坛是一个国家,论坛的站长就是皇帝,而版主就是大臣,他们分管着整个国家各项事务的处理.一个优秀的版主可以很好的带动论坛的互动性,一个亲和的版主可以提高论坛的粘稠度.一个严格的版主可以

HTML5 Canvas的性能提高技巧经验分享

使用缓存技术实现预绘制,减少重复绘制Canvs内容 很多时候我们在Canvas上绘制与更新,总是会保留一些不变的内容,对于这些内容 应该预先绘制缓存,而不是每次刷新. 直接绘制代码如下:   复制代码 代码如下: context.font="24px Arial"; context.fillStyle="blue"; context.fillText("Please press <Esc> to exit game",5,50); r

ASP动态网页制作技术经验分享_应用技巧

学好一门编程语言有两个条件是必不可少的,一是理论与实践结合.在实际例程去验证书本上的理论能加深你对理论的理解:二是学会总结,把学习.运用中的心得体会记下来,当成一种经验或者教训加以提炼并在日后的应用中加以改进,一定能提高你对这门编程语言的认识.以下是笔者在学习与运用ASP编程中的两点经验,希望能对大家有所帮助. ASP页面内VBScript和JScript的交互 ASP具备管理不同语言脚本程序的能力,能够自动调用合适的脚本引擎以解释脚本代码和执行内置函数.ASP开发环境提供了两种脚本引擎,即VB

30个经典的jQuery代码开发技巧_jquery

本文实例总结了30个经典的jQuery代码开发技巧.分享给大家供大家参考.具体如下: 1. 创建一个嵌套的过滤器 复制代码 代码如下: .filter(":not(:has(.selected))") //去掉所有不包含class为.selected的元素 2. 重用你的元素查询 复制代码 代码如下: var allItems = $("div.item"); var keepList = $("div#container1 div.item")

网页前端设计实例:常用技巧和经验分享

网页制作Webjx文章简介:前端开发的一些小技巧与经验分享. 自己前端开发中常用到的一些技巧及问题解决方法,会常更新,希望对前端路上的朋友有帮助. 1.文章标题列表中日期居右显示的方法(提供了两种方法,使用时视情况而定):方法一:本版2楼思路(感谢~),耗资源比较少,多两句代码. <p>@Mr.Think这是文章标题<span>2010-10-10</span></p> CSS定义: p{position:relative} p span{position: