ThinkPHP入门

ThinkPHP项目的创建

<?php
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中的反射

<?phpclass 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();//modelb)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中

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/493927.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解密:LL与LR解析 2(译,完结)

由于GFW&#xff0c;我无法联系到作者&#xff0c;所以没有授权&#xff0c;瞎翻译的。原文在这里[http://blog.reverberate.org/2013/07/ll-and-lr-parsing-demystified.html]。 这是第2部分和完结。 3. 解析树的形状 到目前为止&#xff0c;我们使用的算术表达式的那棵树&…

即时配送:新零售时代的“物流新战场”

来源&#xff1a;平安证券2018年8月2日&#xff0c;星巴克和阿里巴巴达成战略合作&#xff0c;共同推出外卖业务&#xff0c;为消费者配送旗下饮料和烘焙食品。这意味着&#xff0c;以后可以在饿了么、手机淘宝等APP上点星巴克外卖了。其实&#xff0c;新零售、新业态的快速发展…

ThinkPHP入门(二)

smarty使用 smarty引入流程 1. 控制器IndexAction.class.phpfunction index()$this -> display(); (父类Action的display) 2. 父类ThinkPHP/Lib/Core/Action.class.phpfunction display()$this->view->display 3. ThinkPHP/Lib/Core/View.class.phpfunction displa…

雁栖湖会议研讨:计算机能代替程序员吗?

来源&#xff1a;科学网写不完的代码&#xff0c;熬不完的夜&#xff0c;进度总是赶不上变化。程序开发是一项既费时费力&#xff0c;又容易出错的工作。但当前持续涌现的软件工程大数据以及快速发展的人工智能技术&#xff0c;正使得软件自动化成为可能。通过程序合成、代码补…

在 Mac OS X Lion 下修改 Hosts 的四种方法

一名刚刚使用 Mac OS X Lion 系统的朋友问我怎么该系统下修改 Hosts 文件&#xff0c;说网上搜了很多办法都不管用&#xff0c;只要编辑 Hosts 文件就出现”你不是文件 hosts 的所有者&#xff0c;因此没有权限写到该文件”的提示&#xff0c;要解决这个权限问题又比较麻烦&…

CCAI2018演讲实录 | 蒲慕明:脑科学与类脑机器学习

来源&#xff1a;人工智能前沿讲习班摘要&#xff1a;7月28-29日&#xff0c;由中国人工智能学会和深圳市罗湖区人民政府共同主办&#xff0c;马上科普承办的“2018 中国人工智能大会&#xff08;CCAI 2018&#xff09;”完美收官。大会第二天下午&#xff0c;中科院神经科学所…

Django搭建简易博客

Django简易博客&#xff0c;主要实现了以下功能 连接数据库 创建超级用户与后台管理 利用django-admin-bootstrap美化界面 template,view与动态URL 多说评论功能 Markdown与代码高亮 归档&#xff0c;AboutME和标签分类 搜索与ReadMore RSS与分页 需要添加的安装包 pip i…

HDU 4619 Warm up 2 (多校)

题意&#xff1a;在网格里面给定了 横&#xff0c;竖 两种多米诺骨牌&#xff0c;同向的不可以覆盖&#xff0c;不同向的可以覆盖&#xff0c;问你最多去掉多少个有覆盖的多米诺&#xff0c;使得网格内剩余的多米诺骨牌最多 解题思路&#xff1a; 一.搜索 &#xff08;1&…

工业智联网: 基本概念、关键技术与核心应用

来源&#xff1a;王飞跃科学网博客作者&#xff1a;王飞跃, 张军, 张俊, 王晓摘要&#xff1a;本文首先阐述了工业网联技术的演化过程&#xff0c;重点讨论了工业智联网产生的技术和时代背景.然后探讨了工业智联网的基本概念、内涵与应用领域。本文详细介绍了工业智联网的关键技…

KMP算法学习

kmp算法完成的任务是&#xff1a;给定两个字符串O和f&#xff0c;长度分别为n和m&#xff0c;判断f是否在O中出现&#xff0c;如果出现则返回出现的位置。常规方法是遍历a的每一个位置&#xff0c;然后从该位置开始和b进行匹配&#xff0c;但是这种方法的复杂度是O(nm)。kmp算法…

生命或可在星际间传播

来源&#xff1a;中国科学报去年&#xff0c;当一颗美式足球场大小的雪茄形天体Oumuamua进入太阳系时&#xff0c;它并非仅仅让人们第一次看到了一块星际岩石。根据一项新的研究&#xff0c;这也支持了太空岩石通过在遥远的恒星系统之间运送微生物&#xff0c;从而在星际间传播…

操作系统(二): 进程与线程

操作系统(二): 进程与线程 本章解读 进程管理是操作系统重点中的重点&#xff0c;涵盖了操作系统中大部分的知识和考点。其主要包括四部分&#xff1a;进程与线程&#xff0c;处理器调度&#xff0c;同步与互斥&#xff0c;死锁。所以我准备分四个部分来解释这四个模块。进程与…

Nature最新研究:超9000学者每5天发1篇论文,这些高产作家背后的科研圈

来源&#xff1a;悟空智能科技发论文发论文发论文……你有没有想过&#xff0c;假如你能够一周发一篇论文&#xff0c;这样坚持10年甚至20年&#xff0c;你能成为全球最高产的学者吗&#xff1f;答案可能吓你一跳&#xff1a;不能。不但不能&#xff0c;你甚至连全球前10000名都…

Android之WebView学习

WebView常用方法 WebSettings 在使用WebView前我们都要进行相关的配置&#xff0c;常见的操作如下&#xff1a; WebSettings settings mWebView.getSettings();settings.setJavaScriptEnabled(true); //支持javascriptsettings.setUseWideViewPort(true); //设置webv…

跌宕中,特斯拉拿下上海工厂,给蔚来们留下不到两年窗口期

来源&#xff1a;网易智能昨日&#xff0c;特斯拉上海工厂尘埃落定。特斯拉与上海规划与国土资源管理局签订协议&#xff0c;以9.73亿人民币拿下上海临港约1297.32亩地建造汽车工厂。据悉&#xff0c;这是特斯拉在美国之外设立的首个超级工厂。根据特斯拉的规划&#xff0c;上海…

2019科学突破奖揭晓 庄小威陈志坚许晨阳上榜

来源&#xff1a;科学网10月17日&#xff0c;科学突破奖&#xff08;Breakthrough Prize&#xff09;名单揭晓。总计2200万美元的奖金分别给了婴儿死亡主要遗传因素治疗、超分辨率成像、发现一种新型电子材料以及其他重大突破。华裔科学家庄小威、陈志坚、C. Frank Bennett 、A…

Android之IPC机制

Android IPC简介 任何一个操作系统都需要有相应的IPC机制&#xff0c;Linux上可以通过命名通道、共享内存、信号量等来进行进程间通信。Android系统不仅可以使用了Binder机制来实现IPC&#xff0c;还可以使用Socket实现任意两个终端之间的通信。 IPC基础概念介绍 (1)Seriali…

HTML5与原生APP之争胜负已出?

早在HTML5技术问世之时&#xff0c;有关网络应用与原生应用谁将成为移动终端霸主的问题&#xff0c;就曾引起过广泛的争论。时至今日&#xff0c;不仅关于二者孰强孰弱的争论已然平息&#xff0c;就连备受关注的移动互联网创业公司也大多是做原生APP的&#xff0c;未曾见过HTML…

5G 产业链:基站天线和小基站爆发潜力大

来源&#xff1a;国信证券5G宏基站数的翻倍增长及技术演进带来基站天线成倍增长空间。5G关键性能指标十倍的增长需要基站数翻倍增长以支撑。5G的三个关键的效率需求包括频谱利用效率、能耗效率和成本效率。具体来说&#xff0c;5G在频谱效率、能源效率和成本效率的提升需求在十…

操作系统之死锁

死锁的概念以及产生死锁的原因 一组进程中&#xff0c;每个进程都无限等待被该组进程中另一进程所占有的资源&#xff0c;因而永远无法得到的资源&#xff0c;这种现象称为进程死锁&#xff0c;这一组进程就称为死锁进程,如果死锁发生&#xff0c;会浪费大量系统资源&#xff…