ThinkPHP使用数据库

准备工作

1.在web目录下随便建一个目录example,新建入口文件index.php。
index.php

<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2014 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用入口文件

// 检测PHP环境
if(version_compare(PHP_VERSION,'5.3.0','<'))  die('require PHP > 5.3.0 !');

// 开启调试模式 建议开发阶段开启 部署阶段注释或者设为false
define('APP_DEBUG',True);

// 定义应用目录
define('APP_PATH','./Application/');

define('BUILD_DIR_SECURE',false);

// 引入ThinkPHP入口文件      根据你ThinkPHP目录的位置所定
require './ThinkPHP/ThinkPHP.php';

// 亲^_^ 后面不需要任何代码了 就是如此简单
?>

访问 website/example 完成初始化。
初始化后会发现除了新建的index.php外多了一个
Application目录。
编辑Application/Common/Conf/config.php
,代码如下:

<?php
return array(
	//'配置项'=>'配置值'
    'DB_TYPE' => 'mysql', //数据库类型
    'DB_HOST' => 'localhost', //HOST
    'DB_PORT' => 3306,        //端口
    'DB_USER' => 'root',	  //用户名
    'DB_PWD'  => 'DRsXT5ZJ6Oi55LPQ', //密码
    'DB_NAME' => 'thinkphp_inaction', //数据库名
    'DB_PREFIX'=> 'c5_'				//表名前缀
);
?>

2.在本地数据库中创建一个 thinkphp库。
执行下面的SQL命令:

CREATE TABLE `c5_user` (
	`id` int(11) NOT NULL AUTO_INCREMENT,
	`username` varchar(40) NOT NULL,
	`password` char(32) NOT NULL.
	PRIMARY KEY`id`),
	KEY `username` (`username`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf-8;

3.(可选)创建模型类。使用Think/Model 基本就可以满足大部分的使用要求。
Application/Home/Model/UserModel.class.php

<?php

namespace Home\Model;
use Think\Model;

class UserModel extends Model
{
    private $denyUsername = array(
        'admin',
        'adminstrator'
    );
    public $_validate = array(
        array('username','require','用户名不能为空'),
        array('password','require','密码不能为空',1,'',1),
        array('username','','用户名已存在',0,'unique',1),
        array('password','6,20','密码长度必须在6-20',0,'length'),
        array('password','/^\w{6,20}$/','密码格式错误'),
        array('password','repassword','确认密码错误',0,'confirm',1),
        array('username','checkUsername','用户名非法',0,'callback')
    );

    public function checkUsername($username)
    {
        foreach ($this->denyUsername as $u)
        {
            if(strpos($username, $u) !== false)
            {
                return false;
            }
        }
        return true;
    }

    public  function read()
    {
        $user = new Model('User');
        $data = $user->query('SELECT * FROM c5_user');
        print_r($data);
    }
}
?>

模型命名规则:去除表前缀的数据表名称,使用首字母大写的驼峰命名法,然后加上Model,例如(假设表前缀为think_) :
数据表名称为”think_user“ ,去除表前缀后为"user",首字母大写并且驼峰命名法后为”User" ,加上Model后“UserModel” , 所以”think_user“ 对应的模型名称为“UserModel”/

实例化

new实例化

模型类本质也是PHP的类,所以可以直接new实例化。
以"think_user"为例,可以使用以下代码实例化:

$user = new Model('User');

Model类的构造方法有三个参数:去除表前缀的数据表名称,表前缀,连接配置。
就是之前配置的config.php返回的内容。

#connection = array(
	//'配置项'=>'配置值'
    'DB_TYPE' => 'mysql', //数据库类型
    'DB_HOST' => 'localhost', //HOST
    'DB_PORT' => 3306,        //端口
    'DB_USER' => 'root',	  //用户名
    'DB_PWD'  => 'DRsXT5ZJ6Oi55LPQ', //密码
    'DB_NAME' => 'thinkphp_inaction', //数据库名
    'DB_PREFIX'=> 'c5_'				//表名前缀
);

M函数实例化

M函数是ThinkPHP内置的快捷函数,该方法接受的参数与Model类的构造方法相同,返回值为实例化后的模型对象。

D函数实例化

D函数是ThinkPHP内置的快捷函数,与M函数最大的区别在于D函数可以自动检测模型类,如果存在指定模型类,则实例化该模型类,否则实例化”Think\Model“类,而M函数只会实例化”Think\Model"类。

空模型实例化

如果只需要执行SQL,不需要其他操作的化,可以实例化一个空模型类,例如:

$m = new Model();
$data = $m->query('SELECT *FROM c5_user');
print_r($data);

连贯操作

连贯操作可以有效地提高代码质量以及开发效率。比如要查询User模型中status为1的前10条记录,并且按照时间倒序排序,只需要如下代码即可。

$user = Model('User');
$list = $user->where('status=1')->order('create_time desc')->limit(10)->select();

该代码的where、order、limit就是连贯操作方法,查看这些方法的源代码发现,它们在方法的最后都返回了当前模型,所以这是连贯操作的核心,由于select最终返回的是数据集,所以不是连贯操作方法。
连贯操作方法没有先后顺序的。
在这里插入图片描述

where

1.字符串条件

$user = M('User');
$data = $user->where('admin=1 and status=1')->select();

如果需要使用变量时,请使用如下代码进行查询,可有效防止SQL注入攻击;

$user->where("admin=%d AND status=%d AND username='%s'",$admin,$status,$username)->select();

2.数组条件
普通查询:

$condition = array(
	'username' => 'admin',
	'status' =>  1
);
$user = M('User');
$user->where($condition)->select();

模糊搜索查询:

$condition['username'] = array('like','%'.$username.'%');
$user = M('User');
$user->where($condition)->select();

table

用于多表操作以及切换操作的数据库

$m = M();
$m->table('think_user')->where('admin=1 and status=1')->select();

alias

用于设置当前数据表的别名,便于使用其他的连贯操作,例如join方法等。
有如下代码:

$model = M('user');
$model->alias('a')->join('__DEPT__ b ON b.user_id= a.id')->select();

以上代码最终生成的SQL如下:

SELECT * FROM think_user a INNER JOIN think_dept b ON b.user_id=a.id;

data

data方法用来设置当前模型需要操作的数据。
有如下的代码:

$model = M('user');
$data = array(
	'username' => 'zhangsan',
	'password' => '111111'
);
$model->create($data); //未经过$model->create处理过的数据,ThinkPHP不能直接使用
$model->add($data);

使用data:

$data = array(
	'username' => 'zhangsan',
	'password' => '111111'
);
M('User')->data($data)->add();

field

field用来选择需要返回的字段,减少数据库和网络开销。

$model = M('User');
$model->field('id,title,content')->select();

以上代码生成的SQL语句如下:

SELECT id,title,content FROM think_user;

1.字段排除
如果需要获取排除数据表中的content字段以外的所有字段,可以使用field方法的排除功能,代码如下:

$model = M('User');
$model->field('content',true)->select();

系统在生成SQL时就不会选择content字段。
如果需要排除多个字段,field也可以实现,代码如下:

$model = M('User');
$model->field('title,content',true)->select();

2.安全写入
field在写入的时候也起到安全过滤的作用,比如编辑用户时我只允许更改nickname和password两个字段,不管前端提交了什么字段,都只有这两个字段会被ThinkPHP写入数据库,
代码如下:

$data = $_POST['user'];
$model = M('User');
$model->field('nickname,password')->save($data);

save方法返回该方法影响的数据条数,如果一条没有影响,返回0;如果SQL语句执行失败,则返回false。所以在判断save方法的执行结果时,请使用“===”判断,不要使用“!”判断。

order

order方法用来对结果集进行排序。
比如需要查询分数最高的5个用户,并且按照分数高低排序,则可以使用以下代码:

$model = M('User');
$model->order('score desc')->limit(5)->select();

以上代码最终会生成的SQL如下:

SELECT * FROM think_user ORDER BY score desc LIMIT 5;

order也支持对多个字段排序,代码如下

$model = M('User');
$model->order('score desc,status desc')->limit(5)->select();

以上代码最终生成的SQL如下:

SELECT * FROM think_user ORDER BY score desc, status desc LIMIT 5;

可以使用数组方法调用oreder

order(array('score' => 'desc' , 'status' => 'desc'))

limit

limit方法用来限制返回的结果集数量,在分页查询时用的很多。
1.限制结果集数量

$model = M('User');
$model->limit(10)->select(); 

SQL:

SELECT * FROM think_user LIMIT 10;

limit方法也可以用于写入操作,加上需要更新分数大于90分的最多3个用户等级为A,代码如下:

$model = M('User’);
$model->where('score>100')->limit(3)->save(array('level'=>'A'));

2.分页查询
limit最常用的场合就是分页查询了,代码如下:

$model = M('User');
$model->limit('0,10')->select();

page

page方法是ThinkPHP特地为分页操作声明的一个方法。
limit可以用来分页,但是如果需要精确的查询指定页数的数据,则需要先计算偏移量再来查询数据库。而使用page方法就方便了很多,代码如下:

$model = M('User');
$model->page(1,10)->select();
$model->page(2,10)->select();

group

group方法用来对结果集进行分组,通常集合SQL统计函数进行操作。
比如需要获得每个用户发表的文章总数就可以使用group,代码如下:

$model = M('Article');
$model->select('COUNT(*) AS c')->group('user_id')->select();

having

having方法用于筛选经过group分组之后且满足条件的数据集。
比如需要获得发表文章数量大于3的用户列表,代码如下:

$model = M('Article');
$model->select('COUNT(*) AS c')->group('user_id')->having('c>3')->select();

join

join用来进行连表查询。
join有以下类型:
INNER JOIN:左表和有表都存在匹配行则返回该行,否则返回空。
LEFT JOIN:左表有匹配行则返回该行,右表的所有字段也返回,但是如果右表值为空的话,右表所有字段值为空。
RIGHT JOIN:右表有匹配行则返回该行,左表的所有字段也返回,但是如果左表值为空的话,左表所有字段值为空。
FULL JOIN:只要有一个表中存在匹配,则返回该行。
比如需要查询id为1的文章以及作者,代码如下:

$model = M('Article');
$model->join('INNER JOIN think_article ON think_article.user_id=think_user.user_id')->where('think_article.id=1')->select();

union

union用于合并两个或以上SELECT语句的结果集。
数量很大的时候往往会采取分表策略,入think_user_1、think_user_2等。
假设需要从think_user_1和think_user_2中取得name字段,代码如下:

$model = M('User_1');
$model->field('name')
->union('SELECT name FROM think_user_2')
->select();

distinct

distinct方法用于返回唯一不同的值。
假设name有重名的时候只返回不重名的记录,代码如下:

$model = M('User');
$model->distinct(true)->field('name')->select();

lock

lock方法用于数据库锁,在进行事务处理的时候会用到。
假设一个商城系统有一个goog表,该表有一个remain(库存)字段,需要在抢购时实时更新,此时就需要用到锁来保证互斥操作。

$model = M('Good');
$data = $model->lock(true)->where('id=1')->find();

cache

cache用来从缓存中读取数据,使用cache方法后,在缓存有效期内不会从数据库查询,而是直接返回缓存中的数据。缓存的详细设置,在以后的章节会提到。
假设需要查询id为5的用户数据,且缓存,代码如下:

$model = M('User');
$model->where('id=5')->cache(true)->find();

以上代码执行流程如下:
(1)ThinkPHP从缓存查询有无数据,如果有,直接返回该数据,否则继续执行
(2)根据条件查询数据库
(3)将第2步的结果写入缓存并返回

默认情况下,缓存有效期和缓存类型是由DATA_CACHE_TIME 和 DATA_CACHE_TYPE 配置参数决定的,但cache方法可以单独指定,代码如下:

$model = M('User');
$model->cache(true,60,'xcache')->find();

以上代码表示对结果集使用xcache缓存,有效期为60s。

fetchSql

fetchSql方法直接返回生成的SQL而不是数据,也不执行数据库查询。
由如下代码:

$sql = M('User')->fetchSql(true)->find();

strict

strict用于设置数据写入和查询是否严格检查,设置存在字段。默认情况下不合法数据字段自动删除,如果设置了严格检查,则会抛出异常。代码如下:

$model = M('User');
$model->strict(true)->add($data);

如果$data中键名在数据库中没有对应的字段,ThinkPHP会抛出异常。

index

index方法用于设置查询的强制索引,代码如下:

$model = M('User');
$model->index('username')->select();

username 为索引名称,不是字段名。

CURD操作

CURD:

  • C: create,插入数据
  • U:update,更新数据
  • R:read,读取数据
  • D:delete,删除数据

创建数据

ThinkPHP可以快速地创建数据对象,最典型的场景是自动根据表单POST数据创建数据对象。
代码如下:

$user = M('User');
$user->create();

create方法也支持从数组创建数据对象,代码如下:

$data = array(
	'username' => 'zhangsan',
	'password' => '111111'
);
$model = M('User');
$model->create($data);

create方法的第二个参数用来指明当前操作类型为插入或者更新操作。默认情况下,如果提交的数据对象中有主键,ThinkPHP则认为当前操作为更新操作。
操作类型有T混看PHP的Model常量来指定。

  • Model::MODEL_INSERT为1,插入操作
  • Model::MODEL_UPDATE为2,更新操作
    注意:create操作产生的数据并没有真正写入数据库,而是在调用add或者save方法之后才会操作数据库。

插入数据

ThinkPHP插入数据使用add方法,代码如下:

$data = array(
	'username' => 'zhangsan',
	'password' => '111111'
	);
M('User')->create($data)->add();

读取数据

1.读取字段值
使用getField方法,假设需要获得id为3
的用户积分,代码如下:

$model = M('User');
$score = $model->where('id=3')->getField('score');

如果需要返回整列数据,而不是第一列的数据,代码如下:

$model = M('User');
$scores = $model->where('score>100')->getField('id',true);

返回的结果类似于array(1,2,3,5,6)。

2.读取单条数据
使用find方法,如果传入参数,ThinkPHP会根据主键匹配传入的值。
假设需要查询id为1的用户数据,代码如下:
方式1:

$model = M('User');
$model->find(1);

方式2:

$model = M('User');
$model->where('id = 1')->find();

3.读取数据集
使用select方法,用来返回匹配的数据行。
假设需要查询积分大于100的所有用户,代码如下:

$model = M('User');
$model->where('score>100')->select();

更新数据

1.更新记录
使用save方法

$data = array(
'nickname'=>'hehe'
);
$model = M('User');
$model->create($data);
$model->where('id=1')->save($data);

2.更新字段
使用setField方法,参数为(字段名,字段值)。
假设需要更新id为1的用户score为100,代码如下:

$model = M('User');
$model->where('id=1')->setField('score',100);

id为1的用户积分减100:

$model = M('User');
$model->where('id=1')->setDec('score',100);

id为1的文章点击数加1:

$model = M('User');
$model->where('id=1')->setInc('views',1);

删除数据

使用delete方法
假设需要删除id为1的文章(id为主键):

$model = M('Article');
$model->delete(1);
$model = M('Article');
$model->where('id=1')->delete();

delete方法返回值同save方法。
delete方法支持order和limit操作。
假设需要删除score排名前5的用户数据:

$model = M('User');
$model->order('score desc')=>limit(5)->delete();
+------------------------------------------------------------------- | 感谢您使用ThinkPHP开发框架 ^_^ +------------------------------------------------------------------- | 大道至简 开发由我 WE CAN DO IT,JUST THINK +------------------------------------------------------------------- | 版本信息:ThinkPHP 3.1 Release 2012/9/5 +------------------------------------------------------------------- | Copyright(c) 2006-2012 http://thinkphp.cn All rights reserved. +------------------------------------------------------------------- [ 简介 ] ThinkPHP 是一个免费开源的,快速、简单的面向对象的 轻量级PHP开发框架, 遵循Apache2开源协议发布,是为了敏捷WEB应用开发和简化企业应用开发而 诞生的。ThinkPHP从诞生以来一直秉承简洁实用的设计原则,在保持出色的性 能和至简的代码的同时,也注重易用性。并且拥有众多的原创功能和特性,在 社区团队的积极参与下,在易用性、扩展性和性能方面不断优化和改进,众多 的典型案例确保可以稳定用于商业以及门户级的开发。 经过6年的不断积累和重构,3.0版本在框架底层的定制和扩展方面趋于完善, 使得应用的开发范围和需求适应度更加扩大,能够满足不同程度的开发人员的 需求。而且引入了全新的CBD(核心+行为+驱动)架构模式,旨在打造DIY框架 和AOP编程体验,让ThinkPHP能够在不同方面都能快速满足项目和应用的需求, 并且正式引入SAE、REST和Mongo支持。 使用ThinkPHP,你可以更方便和快捷的开发和部署应用。当然不仅仅是企业级 应用,任何PHP应用开发都可以从ThinkPHP的简单和快速的特性中受益。 ThinkPHP本身具有很多的原创特性,并且倡导大道至简,开发由我的开发理念, 用最少的代码完成更多的功能,宗旨就是让WEB应用开发更简单、更快速。 为此ThinkPHP会不断吸收和融入更好的技术以保证其新鲜和活力,提供WEB应 用开发的最佳实践!经过6年来的不断重构和改进,ThinkPHP达到了一个新的 阶段,能够满足企业开发中复杂的项目需求,足以达到企业级和门户级的开 发标准。 [ 协议 ] ThinkPHP遵循Apache2开源许可协议发布,意味着你可以免费使用ThinkPHP, 甚至允许把你的ThinkPHP应用采用商业闭源发布。 具体参考LICENSE.txt内容 [ 特性 ] CBD架构:ThinkPHP3.0版本引入了全新的CBD(核心+行为+驱动)架构模式, 打造框架底层DIY定制和类AOP编程体验。利用这一新的特性,开发人员可以 方便地通过模式扩展为自己量身定制一套属于自己或者企业的开发框架。 编译机制:独创的项目编译机制,有效减少OOP开发中文件加载的性能开销。 改进后的项目编译机制,可以支持编译文件直接作为入口载入,并且支持常量 外部载入,利于产品发布。 类库导入:采用基于类库包和命名空间的方式导入类库,让类库导入看起来更 加简单清晰,而且还支持自动加载和别名导入。为了方便项目的跨平台移植, 系统还可以严格检查加载文件的大小写。 URL和路由:系统支持普通模式、PATHINFO模式、REWRITE模式和兼容模式的 URL方式,支持不同的服务器和运行模式的部署,配合URL路由功能,让你随心 所欲的构建需要的URL地址和进行SEO优化工作。支持灵活的规则路由和正则路 由,以及路由重定向支持,带给开发人员更方便灵活的URL优化体验。 调试模式:框架提供的调试模式可以方便用于开发过程的不同阶段,包括开发、 测试和演示等任何需要的情况,不同的应用模式可以配置独立的项目配置文件。 只是小小的性能牺牲就能满足调试开发过程中的日志和分析需要,并确保将来的 部署顺利,一旦切换到部署模式则可以迅速提升性能。 ORM :简洁轻巧的ORM实现,配合简单的CURD以及AR模式,让开发效率无处不在。 数据库:支持包括Mysql、Sqlite、Pgsql、Oracle、SqlServer、Mongo等数据库, 并且内置分布式数据库和读写分离功能支持。系统支持多数据库连接和动态切换 机制,犹如企业开发的一把利刃,跨数据库应用和分布式支持从此无忧。 查询语言:内建丰富的查询机制,包括组合查询、快捷查询、复合查询、区间 查询、统计查询、定位查询、多表查询、子查询、动态查询和原生查询,让你的 数据查询简洁高效。 动态模型:无需创建任何对应的模型类,轻松完成CURD操作,支持多种模型之间 的动态切换,让你领略数据操作的无比畅快和最佳体验。 扩展模型:提供了丰富的扩展模型,包括:支持序列化字段、文本字段、只读字 段、延迟写入、乐观锁、数据分表等高级特性的高级模型;可以轻松动态地创建 数据库视图的视图模型;支持关联操作的关联模型;支持Mongo数据库的Mongo模 型等等,都可以方便的使用。 模块分组:不用担心大项目的分工协调和部署问题,分组帮你解决跨项目的难题, 还可以支持对分组的二级域名部署支持。 模板引擎:系统内建了一款卓越的基于XML的编译型模板引擎,支持两种类型的 模板标签,融合了Smarty和JSP标签库的思想,并内置布局模板功能和标签库扩展 支持。通过驱动还可以支持Smarty、EaseTemplate、TemplateLite、Smart等其他第 三方模板引擎。 AJAX支持:内置和客户端无关的AJAX数据返回方法,支持JSON、XML和EVAL类型 返回客户端,而且可以扩展返回数据格式,系统不绑定任何AJAX类库,可随意使 用自己熟悉的AJAX类库进行操作。 SAE支持:提供了新浪SAE平台的强力支持,具备“横跨性”和“平滑性”,支持本地化 开发和调试以及部署切换,让你轻松过渡到SAE开发,打造全新的SAE开发体验。 RESTFul支持:REST模式提供了RESTFul支持,为你打造全新的URL设计和访问体验, 同时为接口应用提供了支持。 多语言支持:系统支持语言包功能,项目和分组都可以有单独的语言包,并且可以 自动检测浏览器语言自动载入对应的语言包。 模式扩展:除了标准模式外,还提供了AMF、PHPRpc、Lite、Thin和Cli模式扩展支 持,针对不同级别的应用开发提供最佳核心框架,还可以自定义模式扩展。 自动验证和完成:自动完成表单数据的验证和过滤,新版新增了IP验证和有效期验 证等更多的验证方式,配合自动完成可以生成安全的数据对象。 字段类型检测:系统会自动缓存字段信息和字段类型,支持非法字段过滤和字段类 型强制转换,确保数据写入和查询更安全。 缓存机制:系统支持包括文件方式、APC、Db、Memcache、Shmop、Sqlite、Redis、 Eaccelerator和Xcache在内的动态数据缓存类型,以及可定制的静态缓存规则,并 提供了快捷方法进行存取操作。 扩展机制:系统支持包括模式扩展、行为扩展、类库扩展、驱动扩展、模型扩展、 控制器扩展、Widget扩展在内的强大灵活的扩展机制,让你不再受限于核心的不足 和无所适从,随心DIY自己的框架和扩展应用,满足企业开发中更加复杂的项目需求。 [ 要求 ] ThinkPHP3.1需要PHP5.2.0以上版本支持,可以运行在任何系统环境下面。 [ 安装 ] ThinkPHP无需安装,下载ThinkPHP核心包或者完整版之后,把解压后的目录拷贝到 你的WEB服务器或者WEB目录即可。 [ 鸣谢 ] 特别要鸣谢ThinkPHP团队和所有关注和支持ThinkPHP的用户。 [ 支持 ] 更多内容和支持请访问ThinkPHP官方网站http://thinkphp.cn/ 和论坛 http://bbs.thinkphp.cn。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值