ThinkPHP相信PHP程序员对它并不陌生,通过自己的学习在此发表个人看法,也为以后自己查找ThinkPHP方面的知识更加方便。

一、mvc及数据库CURD操作流程:

1、新建数据库:数据库名称:17joysdb 数据库用户名:root 数据库密码:空

2、创建数据库表:joys_user,mysql代码如下:

CREATE TABLE `joys_user`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`username` VARCHAR( 150 ) NOT NULL,
`password` VARCHAR( 100 ) NOT NULL,
`name` VARCHAR ( 255 ) NOT NULL,
`email` VARCHAR ( 100 ) NOT NULL,
`reg_date` DATETIME NOT NULL,
`last_login_date` DATETIME NOT NULL,
`active` TINYINT( 1 ) NOT NULL,
`params` TEXT NOT NULL,
INDEX ( `name` ),
UNIQUE ( `username` ),
UNIQUE ( `email` )
) ENGINE = MYISAM;

3、配置ThinkPHP、数据库的配置:

  (1)把ThinkPHP框架拷贝到根目录下;

  (2)根目录创建Admin文件夹;

  (3)新建admin.php(注意字符集),代码如下;

//定义项目名称
define('APP_NAME','Admin');
//定义项目路径
define('APP_PATH','Admin');
//定义ThinkPHP框架路径
define('THINK_PATH','./ThinkPHP');
//加载ThinkPHP框架核心文件
require THINK_PATH.'/ThinkPHP.php';
//实例化项目应用,运行项目
App::run();

  (4)运行http://127.0.0.1/admin.php

  (5)根目录新建config.inc.php公共配置文件(代码如下):

return array(
//'配置项'=>'配置值'
'DB_TYPE'=>'mysql',
'DB_HOST'=>'localhost',
'DB_NAME'=>'17joysdb',
'DB_USER'=>'root',
'DB_PWD'=>'',
'DB_PREFIX'=>'joys_',
'DB_CHARSET'=>'utf8',
);

  (6)/Admin/Conf目录下配置config.php(合并公共配置文件和单独配置),代码如下:

$config = require './config.inc.php';
$array = array(
//'配置项'=>'配置值'
'PAGESIZE'=>10,
'APP_DEBUG'=>true,
'MODULES'=>array(
'Menu'=>'菜单模块',
'LatestNews'=>'最新文章模块',
),
);
return array_merge($config,$array);

4、创建MVC编程模式流程:

  (1)/Admin/Lib/Model目录下新建UserModel.class.php(代码如下):

class UserModel extends Model{
//表单的数据验证
protected $_validate = array(
//array(验证的字段,验证的规则,错误提示,验证条件,附加规则,验证时间)
/*
* 验证规则详解:
* 1、验证的字段:数据库字段或者映射字段
* 2、验证规则:
* require(验证是否为空)、email、url、currency、number、zip、integer、double、english
* 3、错误提示:用于提示错误
* 4、验证条件(可选):
* Model::EXISTS_TO_VAILIDATE 或者0 存在字段就验证 (默认)
* Model::MUST_TO_VALIDATE 或者1 必须验证
* Model::VALUE_TO_VAILIDATE或者2 值不为空的时候验证
* 5、附加规则:
* regex 正则验证,说明前面的那个验证规则是一个正则表达式;
* function 使用函数验证,说明前面的那个验证是个函数名;
* callback 使用方法验证,说明验证规则是一个Model类的方法;
* confirm 验证表单中的两个字段是否相等,验证规则是一个字段名;
* equal 验证是否等于某个值,这个值是有前面的验证规则定义的;
* in 验证是否在某个范围之内,前面定义的是一个数组;
* unique 验证是否唯一,系统会根据字段目前的值查询数据库来判断时候存在相同的值;
* 6、验证时间:
* Model::MODEL_INSERT(1):插入式验证;
* Model::MODEL_UPDATE(2):更新是验证
* Model::MODEL_BOTH(3):所有时间都验证
*/
array('uname','require','用户账号必须填写',1,'regex',3),
array('uname','','用户账号已经存在',1,'unique',1),
array('pwd','require','密码必须填写!'),
array('email','email','邮箱格式错误'),
array('active',array(0,1),'数据错误',0,'in'),
array('password','checkPwd','密码长度不够6位',1,'function'),
//array('pwd','checkPwd','密码长度不够6位',1,'callback'), );
function checkPwd(){
$password = $_POST['pwd'];
if(strlen($password)>=6){
return true;
}else{
return false;
}
}
//表单与字段的映射
protected $_map = array(
'uname'=>'username',
'pwd'=>'password',
);
//数据的自动完成
protected $_auto = array(
//array(填充的字段,填充的内容,填充的条件,附加规则)
array('reg_date','getDate',1,'callback'),
array('password','md5',1,'function'),
);
function getDate(){
return date('Y-m-d H:i:s');
}
}

  (2)在/Admin/Lib/Action目录下建立UserModel.class.php相对应的控制器UserAction.class.php(代码如下):

class UserAction extends CommonAction{
function index(){
//创建模型
$user = new UserModel(); //接收查询的表单数据
$keywords = $_POST['keywords'];
$type = $_POST['type'];
//判断表单是否提交数据
if(!empty($keywords) && !empty($type)){
//$where = $type." like '%".$keywords."%'";
//$where = $type." =".$keywords; //查询类型为id
//$where[$type] = $keywords;
//表达式查询 eq = ; gt > ; lt < ; neq != ; egt >= ; elt <= ; like ; (not)between; (not)in;
//$where[$type] = array('like',"%".$keywords."%");//like
$where['id'] = array(array(gt,1),array(lt,10),'and');//and 或者 or }else{ }
//$list = $user->where($where)->select();
//$data = $user->where($where)->find();//只取一条数据
//$data = $user->getField('id,username,name,active');
//$where['id'] = array(array(gt,1),array(lt,10),'and');
//组合查询
//$where['id'] = array('gt',1);
//$where['name'] = array('like','%a%');
//复合查询
/*$where['username'] = array('like','%ad%');
$where['id'] = array('gt',1);
$where['_logic'] = 'or';
$map['_complex'] = $where;
$map['active'] = 1;
//(active = 1 and (username like '%ad%' or id>1))*/
//定位查询
//$data = $user->where('id>0')->order('id desc')->getN(2);//查询前三条数据 -2 最后两条 ->first()第一条 ->last() 最后一条 top5() 前5条
//sql 直接查询
//$data = $user->query('select * from joys_user');//query:查询操作
//$data = $user->execute('update...delete...insert');//execute:增、删、改操作
//动态查询
//$data = $user->getByname('ad');//getByname中的name是数据库中的字段,动态查询只能查询一条记录
//$data = $user->count();//统计查询
//$data = $user->max('id');//获取id的最大值
//$data = $user->avg('id');//获取id的平均值
//$data = $user->sum('id');//获取id的和
//$data = $user->where($map)->select();
$list = $user->select();
$this->assign('ulist',$list); //常用的数据库操作(最常用)
/*$user->select();
$user->find();
$user->getField(); $user->where('id=1')->select();
$where['id'] = 1;
$where['username'] = array('like','%ad%');
$user->where($where)->select(); $user->count('id');$user->max('id');
$user->query('select * from XXX');
$user->execute('insert update delete');
$user->getByemail('506698615@qq.com');*/ //连贯操作
/*$user->data(aray())->add();
$user->field('id,username as uname')->select();
$user->order('id desc')->select();
$user->order('id')->limit(5)->select();
$user->page(1,10)->select(); $user->group('active')->select();
$user->group('active')->having('active=1')->select(); $user->join('A on user.id=A.id')->select();
$user->join('inner join A on user.id=A.id')->select();
$user->join('right join A on user.id=A.id')->select();
$user->lock(true)->select();*/ $this->display();
}
/*
* 创建用户
*/
function add(){
$this->display();
}
/*
* 插入数据
*/
function insert(){
//创建用户模型
$user = new UserModel();//D('User')
if($data = $user->create()){
//表单验证成功,要进行数据插入操作
if(false!==$user->add()){
//获取最新数据的编号(自动增长列)
$userid = $user->getLastInsID();
echo '创建成功,用户编号是'.$userid;
}else{
echo '创建失败'.$user->getDbError();
}
}else{
//验证失败
echo $user->getError();
}
}
/*
* 编辑用户
*/
function edit(){
$id = $_GET['id'];
if(!empty($id)){
$user = new UserModel();
$data = $user->getByid($id);
$this->assign('data',$data);
}else{
echo '请选择编辑用户';
return false;
}
$this->display();
}
/*
* 删除操作
*/
function delete(){
$deleteid = $_POST['deleteid'];
//POST中删除数据的编号
//array(1) array(1,2) array(1,2,3)
$deleteid = array(1,2);
$id = implode(',',$deleteid);//$id = "1,2"
$where = 'id in('.$id.')';
$user = new UserModel();
if(false!==$user->where($where)->delete()){
echo '删除成功';
}else{
echo '删除失败';
}
}
/*
* 更新数据
*/
function update(){
$user = new UserModel();
if($data = $user->create()){
if(!empty($data['id'])){
if(false!==$user->save()){
echo '更新成功!';
}else{
echo '更新失败'.$user->getDbError();
}
}else{
echo '没有更新用户的编号';
}
}else{
//验证失败
echo $user->getError();
}
}
}

  (3)/Admin/Tpl/default/User目录下建立与控制器方法名相对应的模板文件:

  add.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>创建用户</title>
</head> <body>
<form action="__URL__/insert" method="post">
用户名:<input type="text" name="uname" /><br>
密码:<input type="password" name="pwd" /><br>
昵称:<input type="text" name="name" /><br>
邮箱:<input type="text" name="email" /><br>
激活:是<input type="radio" name="active" value="1" checked />
否<input type="radio" name="active" value="0" />0<br>
<input type="submit" value="保存" />
</form>
</body>
</html>

  index.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>用户列表</title>
</head> <body>
<form class="__URL__/index" method="post">
关键词:<input type="text" name="keywords" />
类型:
<select name="type">
<option value="username">用户名</option>
<option value="name">昵称</option>
<option value="id">ID</option>
</select>
<input type="submit" value="查询" />
</form>
<table border="1" bordercolor="black" width="100%">
<tr><th>用户名</th><th>昵称</th><th>是否激活</th><th>ID</th></tr>
<volist name="ulist" id="user">
<tr>
<td><a href="__URL__/edit/id/{$user['id']}">{$user['username']}</a></td>
<td>{$user['name']}</td>
<td>{$user['active']}</td>
<td>{$user['id']}</td>
</tr>
</volist>
</table>
</body>
</html>  

  edit.html

<!doctype html>
<html>
<head>
<meta charset="utf-8">
<title>编辑用户</title>
</head> <body>
<form action="__URL__/update" method="post">
用户名:<input type="text" name="uname" value="{$data['username']}" /><br>
密码:<input type="password" name="pwd" /><br>
昵称:<input type="text" name="name" value="{$data['name']}" /><br>
邮箱:<input type="text" name="email" value="{$data['email']}" /><br>
激活:是<input type="radio" name="active" value="1" checked />
否<input type="radio" name="active" value="0" />0<br>
<input type="hidden" name="id" value="{$data['id']}" />
<input type="submit" value="保存" />
</form>
</body>
</html>

  (4)访问URL:http://127.0.0.1/admin.php/User/index(add)

二、多表查询的“视图”与“关联”:

  (1)新建3个表:单元表(joys_section)、分类表(joys_category)、文章表(joys_article),sql代码如下:

  joys_section

CREATE TABLE `joys_section` (
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR( 255 ) NOT NULL,
`alias` VARCHAR( 255 ) NOT NULL,
`description` TEXT NOT NULL,
`published` TINYINT( 1 ) NOT NULL DEFAULT '',
`order` INT NOT NULL DEFAULT '',
`access` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '',
`params` TEXT NOT NULL
) ENGINE = MYISAM ;

  joys_category

CREATE TABLE `joys_category`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR( 255 ) NOT NULL,
`alias` VARCHAR( 255 ) NOT NULL,
`description` TEXT NOT NULL,
`published` TINYINT( 1 ) NOT NULL,
`order` INT NOT NULL,
`access` TINYINT( 3 ) UNSIGNED NOT NULL,
`sectionid` INT UNSIGNED NOT NULL,
`params` TEXT NOT NULL
) ENGINE = MYISAM ;

  joys_article

CREATE TABLE `joys_article`(
`id` INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
`title` VARCHAR( 255 ) NOT NULL,
`alias` VARCHAR( 255 ) NOT NULL,
`title_alias` VARCHAR( 255 ) NOT NULL,
`introtext` MEDIUMTEXT NOT NULL,
`published` TINYINT( 1 ) NOT NULL DEFAULT '',
`sectionid` INT UNSIGNED NOT NULL,
`catid` INT UNSIGNED NOT NULL,
`created` DATE NOT NULL,
`created_by` INT UNSIGNED NOT NULL,
`modified` DATETIME NOT NULL,
`modified_by` INT UNSIGNED NOT NULL,
`publish_up` DATETIME NOT NULL,
`publish_down` DATETIME NOT NULL,
`order` INT NOT NULL DEFAULT '',
`access` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT '',
`metakey` TEXT NOT NULL,
`metadesc` TEXT NOT NULL,
`hits` INT UNSIGNED NOT NULL,
`metadata` TEXT NOT NULL,
`params` TEXT NOT NULL,
INDEX ( `sectionid` ),
INDEX ( `catid` ),
INDEX ( `created_by` )
) ENGINE = MYISAM ;

  (2)视图查询:视图只能查询,不能做增、删、改操作,但是视图的效率要不关联好。

  模型CategoryViewModel.class.php

class CategoryViewModel extends ViewModel{
public $viewFields = array(
'Category'=>array(
'id'=>'cid',
'title'=>'ctitle',
'alias'=>'calias',
'published'=>'cpublished',
'order'=>'corder',
'access'=>'caccess',
'sectionid',
),
'Section'=>array(
'title'=>'sec_name',
'_on'=>'Category.sectionid = Section.id',
),
'Article'=>array(
'title'=>'art_title',
'_on'=>'Category.id = Article.catid',
),
);
}

  控制器CategoryAction.class.php

class CategoryAction extends Action{
function index(){
//视图
$cat = new CategoryViewModel();
$list = $cat->select();
dump($list);
}
}

  (3)关联

  模型SectionModel.class.php

class SectionModel extends RelationModel{
/*
* 定义关联关系
*/
public $_link = array(
'Category'=>array(
'mapping_type'=>HAS_MANY,//一个单元有多个分类
'class_name'=>'Category',
'foreign_key'=>'sectionid',
'mapping_name'=>'categorys',
'mapping_order'=>'sectionid desc',
),
'Article'=>array(
'mapping_type'=>HAS_MANY,
'class_name'=>'Article',
'foreign_key'=>'sectionid',
'mapping_name'=>'articles',
),
);
}

  控制器SectionAction.class.php

class SectionAction extends CommonAction{
function index(){
$sec = new SectionModel();
$list = $sec->relation(true)->find(1);//select():查询出所有与section表关联的数据;relation:开启关联机制
//dump($list);
//创建数据
$data['title'] = '自定义单元1';
$data['categorys'] = array(
array('title'=>'自定义分类1','alias'=>'test1',),
array('title'=>'自定义分类2',)
);
//$sec->relation(true)->add($data);
//更新数据
//$sec->relation(true)->where('id=1')->save($data);
//删除数据
$sec->relation(true)->delete(4);
}
}

ThinkPHP使用方法与心得的更多相关文章

  1. [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得

    [讨论] 这几天来封装Win7用户配置文件丢失的解决方法个人心得 prerouting 发表于 2010-5-9 16:50:46 https://www.itsk.com/thread-36634- ...

  2. thinkphp save()方法没有数据,保存失败解决办法

    thinkphp save()方法没有数据保存返回0,保存失败返回false   可以对返回值判断一下就好 $ret = $model->save($data); //var_dump($ret ...

  3. (转)ThinkPHP find方法 查询一条数据记录

    find() ThinkPHP find() 方法是和 select() 用法类似的一个方法,不同之处 find() 查询出来的始终只有一条数据,即系统自动加上了 LIMIT 1 限制. 当确认查询的 ...

  4. ThinkPHP 模型方法 setInc() 和 setDec() 使用详解

    对于数字字段的加减,可以直接使用 setInc() 与 setDec() 方法 ThinkPHP 内置了对统计数据(数字字段)的更新方法: setInc():将数字字段值增加 setDec():将数字 ...

  5. ThinkPHP CURD方法中field方法详解

    导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$M ...

  6. ThinkPHP vendor 方法导入第三方类库

    ThinkPHP 3.2 vendor()方法的深入研究及Phpqrcode的正确扩展 ThinkPHP vendor 方法导入第三方类库 第三方类库 第三方类库指除了 ThinkPHP 框架.应用项 ...

  7. ThinkPHP CURD方法盘点:field方法

    ThinkPHP的CURD操作中有很多非常实用的方法,从这篇开始,我们会为大家一一介绍. 首先为大家介绍下field方法的用法.field属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段 ...

  8. Thinkphp各种方法知识图谱

    A方法:用于实例化控制器 ThinkPHP函数详解:A方法 B方法:执行某个行为 I方法(其命名来自于英文Input):获取输入参数 支持过滤和默认值 ThinkPHP函数详解:I方法 D方法:D函数 ...

  9. ThinkPHP魔术方法

    我们在使用thinkphp开发系统的时候,有时候会用到getById('1')这个方法快速的获取一条信息的内容,比用where(" id =1 ")->find();好用多了 ...

随机推荐

  1. 理解webpack中的devTool的配置项

    2.1. eval  eval 会将每一个module模块,执行eval,执行后不会生成sourcemap文件,仅仅是在每一个模块后,增加sourceURL来关联模块处理前后对应的关系.在webpac ...

  2. Codeforces Gym 100733I The Cool Monkeys 拆点+最大流

    原题链接:http://codeforces.com/gym/100733/problem/I 题意 有两颗树(只是树,不是数据结构),每棵树上有不同高度的树枝,然后有m只猴子在某棵树的前m高的树枝上 ...

  3. 【ZJOI2016】大♂森林

    题目描述 小Y家里有一个大森林,里面有 $n$ 棵树,编号从 $1$ 到 $n$ .一开始这些树都只是树苗,只有一个节点,标号为 $1$ .这些树都有一个特殊的节点,我们称之为生长节点,这些节点有生长 ...

  4. 预防SQL注入笔记

    SQL注入如何预防? 本文参考自owasp,重点是提供清晰,简单,可操作的指导,以防止应用程序中的SQL注入漏洞.不幸的是,SQL注入攻击很常见,这是由于两个因素: SQL注入漏洞的显着流行 目标的吸 ...

  5. xcopy中文文件名,中文件目录乱码问题

    1.保存成bat脚本文件 2.且该bat文件不能使用utf-8格式,使用ANSI即正常

  6. jquery图片左右来回循环飘动

    $(function () { function left_right() { $("#sc1452").animate({'left':'-=100'},5000).delay( ...

  7. android 根据图片名字获取图片id

    public int getResource(String imageName){ Context ctx=getBaseContext(); int resId = getResources().g ...

  8. 转:WebRTC技术及应用2 – NAT穿越技术的使用

    评:webrtc自带的打洞,穿透协议. 转: http://www.unclekevin.org/?p=924 959 views WebRTC技术及应用2 – NAT穿越技术的使用 发表回复 (题图 ...

  9. git 怎样删除远程仓库的最近一次错误提交?

    假设你有3个commit如下: commit 3 commit 2 commit 1 其中最后一次提交commit 3是错误的,那么可以执行: git reset --hard HEAD~1 你会发现 ...

  10. web微信开发

    群里接收消息时,使用广播,但需要刷新页面才能接收到广播内容. - 轮询: 定时每秒刷新一次,当群不活跃时,群里的每个客户端都在刷新,对服务端压力太大. - 长轮询:客户端连服务端,服务端一直不断开,也 ...