热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

ThinkPHP入门

ThinkPHP项目的创建

ThinkPHP项目的创建


include "../../ThinkPHP/ThinkPHP.php";

在index.php中导入ThinkPHP.php即可,会自动创建目录。

tp创建流程分析

1. 入口文件index.php2. ThinkPHP/ThinkPHP.phprequire THINK_PATH.'Common/runtime.php';3. ThinkPHP/Common/runtime.php声明许多常量信息加载系统核心类文件if(is_file($file)) require_cache($file);自动创建应用目录build_app_dir();Think::Start();
4. ThinkPHP/lib/Core/Think.class.phpstatic function start(){}Think::buildApp(); // 预编译项目引入相关配置文件App::run();
5. ThinkPHP/lib/Core/App.class.phpstatic public function run(){}App::init();Dispatch分析路由分析路由(控制器MODULE_NAME 方法ACTION_NAME) index.php?c=控制器&a=方法App::exec();通过反射ReflectionMethod使得控制器对象调用对应的方法

PHP中的反射

class Person{public $name = "xiaoming";function say(){echo "I am ".$this->name;}function run($addr,$age){echo "I am ".$this->name;echo ",I at ".$addr;echo ", my age is ".$age;echo ",running";}
}
$per = new Person;
//$per -> say();//利用反射实现对象调用方法
//$md = new ReflectionMethod(类名,方法名);
//反射方法对象
//反射好处:可以获得 方法的属性(是否公开的、私有的、受保护的等等)
//$md = new ReflectionMethod("Person","say");
//让指定的对象调用这个方法
//$md -> invoke($per);//通过反射执行带参数的方法
$mda = new ReflectionMethod("Person","run");
$mda -> invokeArgs($per,array('beijing',23));

空操作和空模块

tp框架把MVC中的控制器称作是模块(module) index.php?m=控制器&a=操作
http://网址/index.php/User/login 正常请求
http://网址/index.php/User/beijing “空操作”请求
http://网址/index.php/American/login “空模块”


  1. 什么是空操作:
    用户访问一个控制器中不存在的方法,就是空操作。
    实例化对象,这个对象去调用类里边不存在的方法
    在OOP中有魔术方法,__call(),自动调用方法,
    对象调用类中不存在方法要统一走这个方法

2.空操作处理:
a)在对应的控制器里边定义方法_empty()
b)给应用添加一个函数名字是:__hack_action() 推荐使用
应用函数库文件:shop/Common/common.php

3.空模块(空控制器)
tom=newAmerican();tom是不存在的对象

处理方式:
①定义函数__hack_module() 推荐使用
②给系统定义空模块:EmptyAction.class.php


跨模块调用

一个控制器可以实例化另一个控制器,并调用其相关方法

/系统有自动加载机制,会完成控制器类的引入// ThinkPHP/Lib/Core/Think.class.php//$user = new UserAction();//echo $user -> number();//系统给我们提供快捷函数,实现控制器的实例化//A('控制器标志')//A('[项目://][分组/]控制器');//A() ThinkPHP/Common/common.php$user = A('home/User');echo $user -> number();$indx = A("book://Index");echo $indx -> apple();//R("[项目://][分组/]模块/操作方法") 跨模块调用函数//实例化控制器并直接调用相关方法//R()方法有封装A()方法,之后利用对象调用相关操作echo R("home/User/number");echo R("book://Index/apple",array('hello','world'));

ThinkPHP数据库操作

在config.php中配置

//数据库配置'DB_TYPE' => 'mysql', // 数据库类型'DB_HOST' => 'localhost', // 服务器地址'DB_NAME' => 'shop', // 数据库名'DB_USER' => 'root', // 用户名'DB_PWD' => '111111', // 密码'DB_PORT' => '', // 端口'DB_PREFIX' => 'sw_', // 数据库表前缀'DB_FIELDTYPE_CHECK' => false, // 是否进行字段类型检查////处于性能考虑,把数据表字段放入缓存里边,//这样下次访问就避免执行sql语句重复执行重新获取//开发调试模式APP_DEBUG=true,下边缓存无效//生产模式APP_DEBUG=false,缓存有效'DB_FIELDS_CACHE' => true, // 启用字段缓存//修改模板引擎为smarty'TMPL_ENGINE_TYPE' => 'Smarty', // 默认模板引擎 //在页面底部显示日志信息'SHOW_PAGE_TRACE' => true, // 显示页面Trace信息

实例化数据模型model的三种方法
1.goodsmodel=newGoodsModel();2.goods_model = D(“Goods”); 快捷函数
a)obj=D();//model,b)obj就可以执行原生的sql语句
3.model=M();modela)model = M(‘User’); 创建基类model对象,但是操作的数据表sw_user


查询数据信息

① Model.class.php类本身就存在该方法,例如(where() field() limit() select())
② __call()自动调用方法集成了一些方法,例如(table() order() group())
这些方法可以进行连贯操作info=obj -> where()->order()->limit()->select()

$goods_model = D('Goods');
$info=$goods_model->select();//通过select()方法查询数据
//返回二维数组
//select(记录主键值)
//select("13,26,33");
$info = $goods_model -> select(); 全部记录信息
$info = $goods_model -> select(19); //根据主键值查询指定记录
$info = $goods_model -> select("13,26,33"); //根据主键值查询若干条记录//find()方法返回一个一维数组数据
//每次只返回一条记录信息
$info = $goods_model -> find(19);
$info = $goods_model -> find("29,32,45,19");
show_bug($info);//限制字段查询field("字段,字段...");
$info = $goods_model -> select(); //全部字段、全部记录信息
$info = $goods_model->field("goods_name,goods_number,goods_create_time")->select();//显示查询条数limit([偏移量,]长度)
$info = $goods_model -> limit(5)->select();
$info = $goods_model -> limit(5,5)->select();//排序查询order("price asc/desc")
$info = $goods_model -> order('goods_price desc')->select();
$info = $goods_model -> order('goods_price desc')->limit(5)->select();
//model对象调用本身不存在的方法order()
//实际会执行魔术方法__call()自动调用//下边的连贯操作,多个条件彼此没有顺序要求,最后都被传递给options属性
//options属性最后会把sql语句根据条件给拼装好
$info = $goods_model ->limit(5)->field('goods_name,goods_price')-> order('goods_price desc')->select();//设置where条件 where()
$info = $goods_model->where('goods_price > 5000')->select();
$info = $goods_model ->table('sw_goods')->select();
$info = $goods_model -> group("goods_category_id")->select();

1.select() 返回二维数组
2.find() 返回一维数组
3.getByXXX(); 根据指定字段进行数据查询
返回一维数组
getByGoods_price(12000);
getByGoods_name(); 魔术__call();
4.having() 设置查询条件
与where比较类似
select * from sw_goods where goods_price>100;
select * from sw_goods having goods_price >100;

function showlist(){$goods_model = D("Goods");//查询名字为"三星BC01"商品信息//$info = $goods_model -> getByGoods_name('三星BC01');//$info = $goods_model -> getByGoods_price('5999');//show_bug($info);//$info = $goods_model -> having("goods_name like '诺%'")->select();//执行原生sql语句$sql = "select * from sw_goods a join sw_category b on a.goods_category_id=b.cat_id";$info = $goods_model->query($sql);$this -> assign('info', $info);$this -> display();}

model聚合函数使用
count() sum() max() avg() min()

执行原生sql语句
model>query()()model -> execute() 增加、修改、删除
insert update delete
成功执行返回受影响的记录数目


添加数据add

两种方式实现数据添加:数组方式、AR方式
AR规则:
1.数据库中的每个数据表都对应一个类,model
2.数据表中的每条记录都是类的一个对象
3.记录信息的每个字段都是对象的属性
在tp框架中AR模型是假的

数据查询有options属性汇集各种连贯查询条件
数据添加有data属性实现各种信息的收集

//添加商品function add1(){$goods_model = D("Goods");//实现数据添加//数组下标 与 数据库表 字段 一致/*$d = array('goods_name'=>'htc230','goods_price'=>'3999','goods_number'=>45,'goods_weight'=>103);$rst = $goods_model -> add($d);*///AR方式实现数据添加//对象调用不存在的属性需要调用魔术方法__set();/*$goods_model -> goods_name = "iphone6";$goods_model -> goods_price = "5700";$goods_model -> goods_number = 31;$goods_model -> goods_weight = 110;* *///以上4个信息最后被$this->data收集$rst = $goods_model -> add();show_bug($rst); //被添加记录本身的id值$this -> display();}

通过表单form实现数据添加

function add(){$goods_model = D("Goods");//判断是否提交表单if(!empty($_POST)){//数据添加//foreach($_POST as $k => $v){// $goods_model -> $k = $v;//}$goods_model -> create(); //tp框架本身收集表单数据方法$rst = $goods_model -> add();if($rst){$this -> success('添加成功',__URL__."/showlist");}} else {$this -> display();}}

修改数据

查询:select() 添加:add()
修改关键字:save() 返回受影响的记录数目

添加数据:数组 和 AR
修改数据:数组 和 AR
注意:实现数据修改必须符合两个条件(主键id 或 where条件)

//修改商品function upd1(){$goods_model = D("Goods");//修改数据$d = array('goods_name'=>'小米手机','goods_price'=>3200);$rst = $goods_model->where('goods_id>50') -> save($d);//在实际生产中,是不允许一次性修改全部记录信息show_bug($rst);// $goods_model -> goods_name = "xxx";
// $goods_model -> goods_price = "xxx";
// $goods_model -> save();$this -> display();}

具体案例实现update
以前:http://网址/index.php?m=控制器&a=操作&goods_id=100&goods_price=2300
现在:http://网址/index.php/控制器/操作/参数1/值/参数2/值/参数3/值。。。。。。

function upd(参数1,参数2,参数3){//$_GET[‘参数1’];//$_GET[‘参数2’];参数1,参数2,参数3具体使用
}

//以下方法被访问必须传递参数//http://网址/index.php/控制器/方法/goods_id/102/goods_price/305//url地址参数名字要求与方法参数一致function upd($goods_id,$goods_price=506){//把被修改的商品信息查询出来,传递给模板显示$goods_model = D("Goods");if(!empty($_POST)){//接收修改的表单数据$goods_model -> create(); //收集表单信息$rst = $goods_model -> save();if($rst){//$this -> success(提示信息,跳转地址);$this -> success('修改成功',__URL__."/showlist");}} else {$info = $goods_model -> getByGoods_id($goods_id);$this -> assign('info',$info);$this -> display();}}

tp框架中表单域验证

表单验证:
通过tp框架进行表单验证
先决条件:收集表单数据必须通过create()收集
create()方法内部有集成表单验证规则

具体使用

//注册操作function register(){$user_model = D("User");if(!empty($_POST)){show_bug($_POST);$z = $user_model -> create(); //收集数据if($z){//把爱好的数组变为字符串$user_model -> user_hobby = implode(',',$_POST['user_hobby']);$rst = $user_model -> add();if($rst){echo "ok";} else {echo "failure";}} else {//表单域验证有错误show_bug($user_model -> getError());}}else {}$this -> display();}

在create()时会发生验证,验证的代码写在model中

class UserModel extends Model{//批量错误信息显示// 是否批处理验证protected $patchValidate &#61; true;//进行表单域验证//protected $_validate &#61; array(); // 自动验证定义protected $_validate &#61; array(//array(验证字段,验证规则,错误提示,[验证条件,附加规则,验证时间])array(&#39;username&#39;,&#39;require&#39;,&#39;用户名必须填写&#39;),//密码必须填写array(&#39;password&#39;,&#39;require&#39;,&#39;密码必须填写&#39;),//确认密码必须填写/与密码保存一致array(&#39;password2&#39;,&#39;require&#39;,&#39;确认密码必须填写&#39;),array(&#39;password2&#39;,&#39;password&#39;,&#39;两次密码必须一致&#39;,0,&#39;confirm&#39;),//验证邮箱array(&#39;user_email&#39;,&#39;email&#39;,&#39;邮箱格式必须正确&#39;,2),//验证qq号码//全部数字、长度5-12位、第一位非0array(&#39;user_qq&#39;,&#39;/^[1-9]\d{4,11}$/&#39;,&#39;qq格式必须正确&#39;),//手机号码验证&#xff0c;正则验证//学历必须选择一项//value值必须在一个范围内 2,3,4,5&#xff0c;array(&#39;user_xueli&#39;,array(2,3,4,5),&#39;学历必须选择一项&#39;,0,&#39;in&#39;),//爱好&#xff0c;必须选择两个或以上项目//计算$_POST[&#39;user_hobby&#39;]这个数组里边元素的个数array(&#39;user_hobby&#39;,&#39;check_hobby&#39;,&#39;爱好必须选择两项以上&#39;,1,&#39;callback&#39;),);//验证爱好的方法function check_hobby($hobby){//获取$_POST[&#39;user_hobby&#39;]具体信息值//这个check_hobby被调用的时候已经把$_POST[&#39;user_hobby&#39;]//当成是参数给check_hobby了//show_bug($hobby);if(count($hobby) <2){return false;} else {return true;}}//自定义个性方法进行用户名和密码校验function checkNamePassword(){//sljdlsjdlk}
}

第四个参数&#xff0c;验证条件
验证条件&#xff1a;&#xff08;可选&#xff09;包含下面几种情况&#xff1a;
Model::EXISTS_VALIDATE 或者0 存在字段就验证&#xff08;默认&#xff09;
Model::MUST_VALIDATE 或者1 必须验证
Model::VALUE_VALIDATE或者2 值不为空的时候验证


推荐阅读
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
  • 在编写业务代码时,常常会遇到复杂的业务逻辑导致代码冗长混乱的情况。为了解决这个问题,可以利用中间件模式来简化代码逻辑。中间件模式可以帮助我们更好地设计架构和代码,提高代码质量。本文介绍了中间件模式的基本概念和用法。 ... [详细]
  • 在springmvc框架中,前台ajax调用方法,对图片批量下载,如何弹出提示保存位置选框?Controller方法 ... [详细]
  • 本文讨论了如何在codeigniter中识别来自angularjs的请求,并提供了两种方法的代码示例。作者尝试了$this->input->is_ajax_request()和自定义函数is_ajax(),但都没有成功。最后,作者展示了一个ajax请求的示例代码。 ... [详细]
  • VueCLI多页分目录打包的步骤记录
    本文介绍了使用VueCLI进行多页分目录打包的步骤,包括页面目录结构、安装依赖、获取Vue CLI需要的多页对象等内容。同时还提供了自定义不同模块页面标题的方法。 ... [详细]
  • 本文介绍了在CentOS 6.4系统中更新源地址的方法,包括备份现有源文件、下载163源、修改文件名、更新列表和系统,并提供了相应的命令。 ... [详细]
  • 本文介绍了Oracle存储过程的基本语法和写法示例,同时还介绍了已命名的系统异常的产生原因。 ... [详细]
  • MVC设计模式的介绍和演化过程
    本文介绍了MVC设计模式的基本概念和原理,以及在实际项目中的演化过程。通过分离视图、模型和控制器,实现了代码的解耦和重用,提高了项目的可维护性和可扩展性。详细讲解了分离视图、分离模型和分离控制器的具体步骤和规则,以及它们在项目中的应用。同时,还介绍了基础模型的封装和控制器的命名规则。该文章适合对MVC设计模式感兴趣的读者阅读和学习。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 从零基础到精通的前台学习路线
    随着互联网的发展,前台开发工程师成为市场上非常抢手的人才。本文介绍了从零基础到精通前台开发的学习路线,包括学习HTML、CSS、JavaScript等基础知识和常用工具的使用。通过循序渐进的学习,可以掌握前台开发的基本技能,并有能力找到一份月薪8000以上的工作。 ... [详细]
  • Android日历提醒软件开源项目分享及使用教程
    本文介绍了一款名为Android日历提醒软件的开源项目,作者分享了该项目的代码和使用教程,并提供了GitHub项目地址。文章详细介绍了该软件的主界面风格、日程信息的分类查看功能,以及添加日程提醒和查看详情的界面。同时,作者还提醒了读者在使用过程中可能遇到的Android6.0权限问题,并提供了解决方法。 ... [详细]
  • DSP中cmd文件的命令文件组成及其作用
    本文介绍了DSP中cmd文件的命令文件的组成和作用,包括链接器配置文件的存放链接器配置信息、命令文件的组成、MEMORY和SECTIONS两个伪指令的使用、CMD分配ROM和RAM空间的目的以及MEMORY指定芯片的ROM和RAM大小和划分区间的方法。同时强调了根据不同芯片进行修改的必要性,以适应不同芯片的存储用户程序的需求。 ... [详细]
  • express工程中的json调用方法
    本文介绍了在express工程中如何调用json数据,包括建立app.js文件、创建数据接口以及获取全部数据和typeid为1的数据的方法。 ... [详细]
  • 本文讨论了在使用PHP cURL发送POST请求时,请求体在node.js中没有定义的问题。作者尝试了多种解决方案,但仍然无法解决该问题。同时提供了当前PHP代码示例。 ... [详细]
author-avatar
啊4呀么啊4呀
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有