ThinkPHP使用方法与心得

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(‘[email protected]‘);*/

        //连贯操作
        /*$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 ‘0‘,
`order` INT NOT NULL DEFAULT ‘0‘,
`access` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT ‘0‘,
`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 ‘0‘,
`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 ‘0‘,
`access` TINYINT( 3 ) UNSIGNED NOT NULL DEFAULT ‘0‘,
`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);
    }
}
时间: 2024-10-21 14:57:30

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

thinkphp U方法生成链接没有host

今天将自己代码传到线上服务器,页面上用到很多thinkphp U() 方法生成的链接.本地测试没啥问题,到线上发现链接生成的不对,每个都没有了host 每个链接多个index,然后查看tp的U方法: $url    =   __APP__.'/'.($module?$module.MODULE_PATHINFO_DEPR:'').implode($depr,array_reverse($var)); 是因为__APP__这里的原因,然后找到__APP__赋值的地方: define('__APP_

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

对于数字字段的加减,可以直接使用 setInc() 与 setDec() 方法 ThinkPHP 内置了对统计数据(数字字段)的更新方法: setInc():将数字字段值增加 setDec():将数字字段值减少 setInc() ThinkPHP setInc() 方法将数字字段值增加. 例子: <?php public function update() { header("Content-Type:text/html; charset=utf-8"); $result = M

ThinkPHP CURD方法中field方法详解

导读:ThinkPHP CURD方法的field方法属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询在查询操作中field方法是使用最频繁的.$Model->field('id,title,content')->select(); 这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值.执行的SQL相当于:SELECT id,title,content FROM table 当然,除了select方法之外

ThinkPHP快捷方法汇总(随时添加)

读取配置 C('参数名称') 例如,读取当前的URL模式配置参数: $model = C('URL_MODEL'); // 由于配置参数不区分大小写,因此下面的写法是等效的 // $model = C('url_model'); C方法也可以用于读取二维配置: //获取用户配置中的用户类型设置 C('USER_CONFIG.USER_TYPE'); 因为配置参数是全局有效的,因此C方法可以在任何地方读取任何配置,即使某个设置参数已经生效过期了. 动态配置 设置格式:C('参数名称','新的参数值

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

find() ThinkPHP find() 方法是和 select() 用法类似的一个方法,不同之处 find() 查询出来的始终只有一条数据,即系统自动加上了 LIMIT 1 限制. 当确认查询的数据记录只能是一条记录时,建议使用 find() 方法查询,如用户登录账号检测: public function chekUser(){ header("Content-Type:text/html; charset=utf-8"); $Dao = M("User");

ThinkPHP 空方法 显示

TP如果  一个控制器 没有一个方法 ,只要有一个模版,URL会对应显示模版名称. 例子 http://localhost/yiyunmap/map/test map控制器 并没有 test方法 但是 模版文件有 test.html URL对应就可以显示 该URL ThinkPHP 空方法 显示

ThinkPHP CURD方法盘点:field方法

ThinkPHP的CURD操作中有很多非常实用的方法,从这篇开始,我们会为大家一一介绍. 首先为大家介绍下field方法的用法.field属于模型的连贯操作方法之一,主要目的是标识要返回或者操作的字段,可以用于查询和写入操作. 1.用于查询 在查询操作中field方法是使用最频繁的. $Model->field('id,title,content')->select(); 这里使用field方法指定了查询的结果集中包含id,title,content三个字段的值.执行的SQL相当于: SELE

ThinkPHP 模型方法 getField() 和 select() 使用技巧

getField() 使用技巧 getField() 方法是 ThinkPHP 中用来获取字段值的方法,区别于 select() 和 find() 方法,通常仅用于获取个别字段的值.但是事实上并没有那么简单,该方法的用法总结如下: 获取某个字段值 这个是 getField() 方法最基本的用法,用于获取符合条件的某个字段值. // 实例化User对象 $User = M("User"); // 获取ID为3的用户的昵称 $nickname = $User->where('id=3

ThinkPHP vendor 方法导入第三方类库

第三方类库 第三方类库指除了 ThinkPHP 框架.应用项目类库之外的其他类库,一般由第三方系统或产品提供,如 Smarty.Zend 等系统的类库等. 前面使用自动加载或 import 方法导入的类库,ThinkPHP 约定是以 .class.php 为后缀的,非这类的后缀,需要通过 import 的参数来控制. 但对第三类库,由于不会有此约定,其后缀只能认为是 php .为了方便的引入其他框架和系统的类库,ThinkPHP 特意提供了导入第三方类库的功能.第三方类库统一放置在 ThinkP