Thinkphp编程中几种常见的实用技巧讲解

在Thinkphp编程中集成了很多用起来非常方便的方法。对于刚接触的编程人员来说,可谓是只要掌握并灵活运用了,那么就可以达到事半功倍的效果了,下面就来为大家详细的讲解一下。

  1. getField

  getField的方便之处在于可以获取一个值,一个数组,或者一组键值对。

  接下来举三个例子简单说明。

  A. 获取一个值。

  在修改密码的方法中,要验证旧密码是否匹配。现已知用户id为$uid。

  则$old_pass = $Model->where(“uid=’$uid’”)->getField(‘password’);

  即可获取旧密码来进行验证。

  B. 获取一个数组

  如果一级分类下有二级分类,现在给出一级分类,要求搜索到一级分类下的所有产品。

  解决方法就是首先获得所有的二级分类ID,这时候用getField是非常方便的。

  $arr_types = $Model->where(“pid=’$type_id’”)->getField(‘id’,true);

  $map[‘type_id’] = array(‘in’,$arr_types);

  $products = M(‘product’)->where($map)->select();

  这样就获取到了这个一级分类下的所有产品,该方法仅限二级分类,如果有三级分类请用其他方法解决。

  C. 获取一组键值对

  鉴于水平有限,目前主要用于关联查询的信息展示中,可以在一定程度上给数据库减压。

  比如要展示一个用户的购物车,然而从购物车表中仅仅能查到商品的ID,但我想要展示商品的名字。这时候从商品表中获取一组键值对即可解决这个问题。

  $arr_product = $Model->getField(‘id,product_name’,true);

  输出的时候,对应商品的名字为$arr_product[$product_id];

  当然,用join也能解决这个问题。

  2. page

  顾名思义,这是thinkphp封装好的一个分页类,用起来非常方便。不同版本用法不同,详细用法可以查看手册。这里要讲的是一个终极解决方案。无论哪个版本,甚至是原生的php都可以解决分页问题。

  假设要分页的结果是$product_list(数据类型array)。

  当前页码:$page = I(‘page’)?I(‘page’):1;

  每页信息条数:$per_page = 10;

  获得分页结果:$product_list = array_slice($product_list,($page-1)* $per_page, $per_page);

  Array_slice参数:数组名,起始位置(0开始),分割的数量。

  3. setField

  有时候需要改变一组数据中或一类数据中的某个字段,这时候用save方法有点大材小用。

  比如我只需要修改一个状态值,将某个或某类的status值修改为1,表示可用。

  $Model->where($map)->setField(‘status’,1);

  如果同时我想把修改时间也记录下来怎么办。

  $data[‘status’] = 1;

  $data[‘edittime’] = time();

  $Model->where($map)->setField($data);

  setField可以修改一个字段,也可以修改多个字段。

  4. setInc、setdec

  SetInc,常用来统计阅读量点击量。每次请求文章的时候,只需要:

  $Model->where(“id=’$id’”)->setInc(‘readnum’);

  默认增加1,也可以自定义。详细用法可以看手册。

  Setdec用法一样。

  5. 后台有关于添加、编辑一类控制器的技巧

  做后台开发的都知道,添加一条数据需要用两个控制器,一个用来展示页面,另一个用来操作,其实两个控制器可以合二为一的。现在已添加为例:

  常规写法:

  Public function addproduct(){

  $this->display();

  }

  Public function do_addproduct(){

  $Model = M(‘product’);

  $data = array(

  ‘name’ => I(‘name’),

  ‘price’ => I(‘price’),

  ……

  );

  $result = $Model->add($data);

  If($result){

  Success(‘添加成功’,U(‘product_list’));

  }else{

  Error(‘添加失败’);

  }

  }

  合二为一的写法:

  Public function addproduct(){

  If(IS_POST){

  $Model = M(‘product’);

  $data = array(

  ‘name’ => I(‘name’),

  ‘price’ => I(‘price’),

  ……

  );

  $result = $Model->add($data);

  If($result){

  Success(‘添加成功’,U(‘product_list’));

  }else{

  Error(‘添加失败’);

  }

  }else{

  $this->display();

  }

  }

  以上是添加一类的控制器的写法,接下来同样的思路,展示修改控制器的写法。

  Public function editproduct(){

  $id = I(‘id’);

  $Model = M(‘product’);

  If(IS_POST){

  $data = array(

  ‘id’ => $id,

  ‘name’ => I(‘name’),

  ‘price’ => I(‘price’),

  ……

  ‘addtime’=>time()

  );

  $result = $Model->save(‘data’);

  If($result){

  Success(‘修改成功’,U(‘product_list’));

  }else{

  Error(‘添加失败’,U(‘editproduct’,array(‘id’=>$id)));

  }

  }else{

  $this->info = $Model->find($id);

  $this->display();

  }

  }

  最后需要跟各位编程人员讲解一些注意事项:

  a.展示页面的时候,id以input[hidden]形式展示,提交的时候一并提交上去,写起来会轻松很多。

  b.如果在$data数组中有主键存在,直接save方法即可。

  c.为了避免没有任何修改导致返回结果失败的情况,加上时间即可解决。

  合二为一的方法,最大的好处就是在模板中写

  表单的时候,action=”/Admin/Technology/edit/id/507.html”即可,十分方便。好了到这里就为大家讲完了,如果还是存在不理解的地方,那么大家可以咨询来寻求帮助。

  本文由专业的郑州app开发公司燚轩科技整理发布,原创不易,如需转载请注明出处!

原文地址:http://blog.51cto.com/13686158/2160849

时间: 2024-11-05 13:27:03

Thinkphp编程中几种常见的实用技巧讲解的相关文章

javascript编程中一种常见的代码坏味道:Pyramid of doom(金字塔厄运)

Pyramid of doom说的是代码嵌套层次太深,太多的代码缩进,导致代码横向增长大于纵向增长.非常影响代码的可读性,因为我们看不清嵌套关系,很容易弄错变量的作用域,大括号多了或者少了等问题. 代码1:if层次过深 bool conditionA = executeStepA(); if (conditionA){ bool conditionB = executeStepB(); if (conditionB){ bool conditionC = executeStepC(); if (

[整理]android中几种常见的尺寸

获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeig

php中五种常见的设计模式

设计模式 一书将设计模式引入软件社区,该书的作者是 Erich Gamma.Richard Helm.Ralph Johnson 和 John Vlissides Design(俗称 “四人帮”).所介绍的设计模式背后的核心概念非常简单.经过多年的软件开发实践,Gamma 等人发现了某些具有固定设计的模式,就像建筑师设计房子和建筑物一样,可以为浴室的位置或厨房的构造方式开发模板.使用这些模板或者说设计模式 意味着可以更快地设计更好的建筑物.同样的概念也适用于软件. 设计模式不仅代表着更快开发健壮

比较C#中几种常见的复制字节数组方法的效率[转]

[原文链接] 在日常编程过程中,我们可能经常需要Copy各种数组,一般来说有以下几种常见的方法:Array.Copy,IList<T>.Copy,BinaryReader.ReadBytes,Buffer.BlockCopy,以及System.Buffer.memcpyimpl,由于最后一种需要使用指针,所以本文不引入该方法. 本次测试,使用以上前4种方法,各运行1000万次,观察结果. using System; using System.Collections.Generic; using

JS中4种常见的内存泄漏

一.什么是内存泄漏 本质上讲,内存泄漏是当一块内存不再被应用程序使用的时候,由于某种原因,这块内存没有返还给操作系统或空闲内存池的现象. 二.几种常见的内存泄漏 1.意外的全局变量 一个未声明变量的引用会在全局对象中创建一个新的变量.在浏览器的环境下,全局对象就是window,也就是说: function foo(arg) { bar = "this is a hidden global variable"; } 实际上是: function foo(arg) { window.bar

(转)轻松掌握shell编程中数组的常见用法及示例

缘起:在老男孩进行linux培训shell编程教学中,发现不少水平不错的网友及同学对数组仍然很迷糊,下面就给大家分享下数组的用法小例子,希望能给大家一点帮助.其实SHELL的数组很简单,好用.我们学习都应该遵循简单.易用的原则. shell编程中数组的简单用法及示例 新版本的Bash支持一维数组. 数组元素可以使用符号variable[xx]等方式来初始化. 另外, 脚本可以使用declare -a variable语句来指定一个数组等.要引用一个数组元素(也就是取值), 可以使用大括号, 访问

Linux中五种常见的I/O模型

一般来说,程序进行输入操作有两步:等.搬迁 . 在Linux下,共有五种I/O模型,下面就逐一介绍: 1>.阻塞I/O(使用比较广) 应用程序调用一个I/O函数,如果数据木有准备好,就会导致应用程序阻塞,直到数据准备好了,从内核拷贝到用户空间(进程的缓存),I/O函数返回成功. 如一个进程调用recvform,然后系统调用并不返回直到有数据包到达本地系统,然后完成数据拷贝. 2>.非阻塞I/O(极浪费CPU资源,不常使用) 我们把一个套接口设置为非阻塞,就是告诉内核,当请求的I/O操作无法完成

android中几种常见的尺寸

获取屏幕宽高尺寸的三种代码形式 在Android上,目前我知道的获取屏幕尺寸的方法有三种不同的代码形式 方法1.在Activity中最常见的调用方式 WindowManager windowManager = getWindowManager(); Display display = windowManager.getDefaultDisplay(); int screenWidth = display.getWidth(); int screenHeight = display.getHeig

PHP中几种常见的超时处理全面总结-转载

在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景,方便需要的朋友.在PHP开发中工作里非常多使用到超时处理到超时的场合,我说几个场景: 1. 异步获取数据如果某个后端数据源获取不成功则跳过,不影响整个页面展现 2. 为了保证Web服务器不会因为当个页面处理性能差而导致无法访问其他页面,则会对某些页面操作设置 3. 对于某些上传或者不确定处理时间的场合,则需要对整个流程中所有超时设置为无限,否则任何一个环节设置不当,都会导致莫名执行中断 4. 多个后端模块(MySQL.Memca