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();
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值