项目目录
tp5
├─application 应用目录
├─extend 扩展类库目录(可定义)
├─public 网站对外访问目录
├─runtime 运行时目录(可定义)
├─vendor 第三方类库目录(Composer)
├─thinkphp 框架核心目录
├─build.php 自动生成定义文件(参考)
├─composer.json Composer定义文件
├─LICENSE.txt 授权说明文件
├─README.md README 文件
├─think 命令行工具入口
TP-四种url访问的方式
url的4种访问方式 (这是重点!!)
1.PATHINFO 模式 --重点 在后面使用非常多,如果想传多个参数可以使用键1/值1/键2/值2方法
代码如下:
http://域名/项目名/入口文件/模块名/方法名/键1/值1/键2/值2
2.普通模式也称为重写模式
代码如下:
http://域名/项目名/入口文件?m=模块名&a=方法名&键1=值1&键2=值2
3.REWRITE重写模式,去掉入口文件便于SEO优化
代码如下:
http://域名/项目名/模块名/方法名/键1/值1/键2/值2
4.兼容模式
代码如下:
http://域名/项目名/入口文件?s=模块名/方法名/键1/值1/键2/值2
如何修改PATHINFO地址中的/改成-在Home/Conf/config.php中
代码如下:
'URL_PATHINFO_DEPR'=>'-',//修改RUL的分隔符,把地址栏的参数部分/换成:http://域名/项目名/入口文件/模块名-方法名-键1-值1-键2-值2
在index.php中开启调用模式,为了在后产模式中不让文件缓存影响开发
代码如下:
define('APP_DEBUG',ture);//如果设置为ture不缓存文件,false则缓存文件
REWRITE模式开启方法
在httpd.conf中查找rewrite_module modules/mod_rewrite.sl 把#去掉重启服务,在入口文件下新建.htaccess.php,重写文件是去掉index.php的意思:
代码如下:
RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
路由处理过程大概如下:
1.遍历路由规则rule,与当前PATHINFO字符串进行匹配,如果合法,则从PATHINFO中取出所需要的字符串。
2.路由中每条规则对应一个router,router中指定对应的模块以及方法,模块和方法可以用第1步中匹配到的字符串进行动态替代。
3.将剩余的参数都解析并写入到$_GET中。
接口调试软件网址
http://www.36nu.com/apiTest
项目目录
目录 说明 常量
tp5 项目根目录 ROOT_PATH
tp5/application 应用目录 APP_PATH
tp5/thinkphp 框架核心目录 THINK_PATH
tp5/extend 应用扩展目录 EXTEND_PATH
tp5/vendor Composer扩展目录 VENDOR_PATH
5.1版本取消了所有的系统常量,改为环境变量获取
获取方式为: think\facade\Env::get('环境变量名')
目录 说明 环境变量
tp5 项目根目录 root_path
tp5/application 应用目录 app_path
tp5/thinkphp 框架核心目录 think_path
tp5/extend 应用扩展目录 extend_path
tp5/vendor Composer扩展目录 vendor_path
核心框架目录的结构如下
├─thinkphp 框架系统目录
│ ├─lang 语言包目录
│ ├─library 框架核心类库目录
│ │ ├─think think 类库包目录
│ │ └─traits 系统 traits 目录
│ ├─tpl 系统模板目录
│ │
│ ├─.htaccess 用于 apache 的重写
│ ├─.travis.yml CI 定义文件
│ ├─base.php 框架基础文件
│ ├─composer.json composer 定义文件
│ ├─console.php 控制台入口文件
│ ├─convention.php 惯例配置文件
│ ├─helper.php 助手函数文件(可选)
│ ├─LICENSE.txt 授权说明文件
│ ├─phpunit.xml 单元测试配置文件
│ ├─README.md README 文件
│ └─start.php 框架引导文件
$this->request->param()
获取请求参数
https://blog.csdn.net/u012600104/article/details/78845325
启动服务
在开始之前,你需要一个Web服务器和**PHP5.4+**运行环境,如果你暂时还没有,我们推荐使用集成开发环境WAMPServer(Windows系统下集成Apache、PHP和MySQL的服务套件)来使用ThinkPHP进行本地开发和测试,最新版本的WAMP在这里下载。
如果你不想安装任何WEB服务器,也可以直接使用PHP自带的WebServer,并且运行router.php来运行测试。
我们进入命令行,进入tp5/public目录后,输入如下命令:
php -S localhost:8888 router.php
伪静态引擎
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine on #开启rewrite引擎
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>
入口文件
├─application 应用目录(可设置)
│ ├─index 模块目录(可更改)
│ │ ├─config.php 模块配置文件
│ │ ├─common.php 模块公共文件
│ │ ├─controller 控制器目录
│ │ ├─model 模型目录
│ │ └─view 视图目录
│ │
│ ├─command.php 命令行工具配置文件
│ ├─common.php 应用公共文件
│ ├─config.php 应用配置文件
│ ├─tags.php 应用行为扩展定义文件
│ ├─database.php 数据库配置文件
│ └─route.php 路由配置文件
生成demo
php think build --module demo
├─demo
│ ├─controller 控制器目录
│ ├─model 模型目录
│ ├─view 视图目录
│ ├─config.php 模块配置文件
│ └─common.php 模块公共文件
控制器名字命名
如果是HelloWorld这种控制名字的话,
在连接访问的时候
需要这样访问
http://ken.tp5.com/index/hello_world/index
返回json格式
$data = ["name"=>"Ken","age"=>20,"sex"=>"man"];
<!-- 返回json,并修改状态码 -->
return json($data,201);
<!-- 返回json数据 -->
return json($data);
<!-- 返回xml -->
return xml($data);
<!--渲染模板 -->
$this->assign("name","莫纳个");
return $this->fetch('index/index2');
模块
模块下面有控制器模块
也有模板模块
正确跳转到正确的页面
$this->success("正确的页面","index");
就会跳转到index页面
错误的跳转页面
function errored(){
$this->error("错误页面","index");
}
资源访问
public
├─index.php 应用入口文件
├─static 静态资源目录
│ ├─css 样式目录
│ ├─js 脚本目录
│ └─img 图像目录
记住,千万不要在public目录之外的任何位置放置资源文件,包括application目录。
http://tp5.com/static/css/style.css
http://tp5.com/static/js/common.js
http://tp5.com/static/img/picture.jpg
引入请求对象
https://blog.csdn.net/weixin_41452768/article/details/79679510
use think\Request;
TP5.1:request请求对象(使用四种方式获取)
在index/controller下创建一个名为requests.php的文件
(注意:不要起名为request,因为它是关键字,不被允许起名)
动态方法和静态方法的区别:
静态方法:public static function test(){}
动态方法:;public function test(){}
可以看出,他们的区别就是一个是静态方法,一个是普通方法。
use think\Request;
class Name
{
$request = Request::instance();
$method = $request->method();//获取上传方式
$request->param();//获取所有参数,最全
$get = $request->get();获取get上传的内容
$post = $request->post();获取post上传的内容
$request->file('file')获取文件
}
---------------------
作者:weixin_41452768
来源:CSDN
原文:https://blog.csdn.net/weixin_41452768/article/details/79679510
版权声明:本文为博主原创文章,转载请附上博文链接!
获取URL信息
$request = Request::instance();
// 获取当前域名
echo 'domain: ' . $request->domain() . '<br/>';
// 获取当前入口文件
echo 'file: ' . $request->baseFile() . '<br/>';
// 获取当前URL地址 不含域名
echo 'url: ' . $request->url() . '<br/>';
// 获取包含域名的完整URL地址
echo 'url with domain: ' . $request->url(true) . '<br/>';
// 获取当前URL地址 不含QUERY_STRING
echo 'url without query: ' . $request->baseUrl() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root:' . $request->root() . '<br/>';
// 获取URL访问的ROOT地址
echo 'root with domain: ' . $request->root(true) . '<br/>';
// 获取URL地址中的PATH_INFO信息
echo 'pathinfo: ' . $request->pathinfo() . '<br/>';
// 获取URL地址中的PATH_INFO信息 不含后缀
echo 'pathinfo: ' . $request->path() . '<br/>';
// 获取URL地址中的后缀信息
echo 'ext: ' . $request->ext() . '<br/>';
请求参数获取
echo '请求方法:' . $request->method() . '<br/>';
echo '资源类型:' . $request->type() . '<br/>';
echo '访问ip地址:' . $request->ip() . '<br/>';
echo '是否AJax请求:' . var_export($request->isAjax(), true) . '<br/>';
echo '请求参数:';
dump($request->param());
echo '请求参数:仅包含name';
dump($request->only(['name']));
echo '请求参数:排除name';
dump($request->except(['name']));
配置sql调试工具箱
https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/qq_40657528/article/details/82596488
https://blog.csdn.net/u012600104/article/details/78833789
微信公众号开发
https://my.oschina.net/lylyg/blog/1486895
https://blog.csdn.net/feverrun/article/details/78857834
https://www.cnblogs.com/zzcit/p/5573708.html
https://www.cnblogs.com/xp796/p/5215500.html
https://www.cnblogs.com/zsczsc/p/6577224.html
微信开发视频教程
https://www.imooc.com/video/9304
msql预处理语句
https://blog.csdn.net/weixin_37839711/article/details/81562550
查询数据
查询一个数据使用:
// table方法必须指定完整的数据表名
Db::table('think_user')->where('id',1)->find();
find 方法查询结果不存在,返回 null
查询数据集使用:
Db::table('think_user')->where('status',1)->select();
select 方法查询结果不存在,返回空数组
如果设置了数据表前缀参数的话,可以使用
Db::name('user')->where('id',1)->find();
Db::name('user')->where('status',1)->select();
如果你的数据表没有使用表前缀功能,那么name和table方法的一样的效果。
在find和select方法之前可以使用所有的链式操作方法。
默认情况下,find和select方法返回的都是数组。
主从查询
如果你使用了分布式数据库,那么默认情况下查询操作都是在从数据库中进行,如果你在一些特殊的情况下需要从主库读取数据,可以使用:
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
Db::name('user')->master()->where('id',1)->find();
V5.0.19+版本开始,支持一旦某个表写入了数据,那么当前请求的后续查询操作都可以自动从主库读取。
你需要在数据库配置文件中增加下面的配置参数:
// 从主库读取数据
'read_master' => true,
如果你只需要对某个表进行操作,可以使用readMaster方法。
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
->readMaster()
->insert($data);
// 后续所有关于该数据表的查询都会走主库
也可以让后续所有数据表的查询都走主库
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')
->readMaster(true)
->insert($data);
// 后续所有数据表的查询都会走主库
助手函数
系统提供了一个db助手函数,可以更方便的查询:
db('user')->where('id',1)->find();
db('user')->where('status',1)->select();
注意:使用db助手函数默认每次都会重新连接数据库,而使用Db::name或者Db::table方法的话都是单例的。db函数如果需要采用相同的链接,可以传入第三个参数,例如:
db('user',[],false)->where('id',1)->find();
db('user',[],false)->where('status',1)->select();
上面的方式会使用同一个数据库连接,第二个参数为数据库的连接参数,留空表示采用数据库配置文件的配置。
版本 调整功能
5.0.9 db助手函数默认不再强制重新连接
使用Query对象或闭包查询
或者使用查询对象进行查询,例如:
$query = new \think\db\Query();
$query->table('think_user')->where('status',1);
Db::find($query);
Db::select($query);
或者直接使用闭包函数查询,例如:
Db::select(function($query){
$query->table('think_user')->where('status',1);
});
值和列查询
查询某个字段的值可以用
// 返回某个字段的值
Db::table('think_user')->where('id',1)->value('name');
value 方法查询结果不存在,返回 null
查询某一列的值可以用
// 返回数组
Db::table('think_user')->where('status',1)->column('name');
// 指定索引
Db::table('think_user')->where('status',1)->column('name','id');
Db::table('think_user')->where('status',1)->column('id,name'); // 同tp3的getField
column 方法查询结果不存在,返回空数组
数据集分批处理
如果你需要处理成千上百条数据库记录,可以考虑使用chunk方法,该方法一次获取结果集的一小块,然后填充每一小块数据到要处理的闭包,该方法在编写处理大量数据库记录的时候非常有用。
比如,我们可以全部用户表数据进行分批处理,每次处理 100 个用户记录:
Db::table('think_user')->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
// 或者交给回调方法myUserIterator处理
Db::table('think_user')->chunk(100, 'myUserIterator');
你可以通过从闭包函数中返回false来中止对数据集的处理:
Db::table('think_user')->chunk(100, function($users) {
// 处理结果集...
return false;
});
也支持在chunk方法之前调用其它的查询方法,例如:
Db::table('think_user')->where('score','>',80)->chunk(100, function($users) {
foreach ($users as $user) {
//
}
});
chunk方法的处理默认是根据主键查询,支持指定字段,例如:
Db::table('think_user')->chunk(100, function($users) {
// 处理结果集...
return false;
},'create_time');
V5.0.11版本开始,chunk方法支持指定处理数据的顺序。
Db::table('think_user')->chunk(100, function($users) {
// 处理结果集...
return false;
},'create_time', 'desc');
JSON类型数据查询(mysql V5.0.1)
// 查询JSON类型字段 (info字段为json类型)
Db::table('think_user')->where('info$.email','[email protected]')->find();
添加一条数据
使用 Db 类的 insert 方法向数据库提交数据
$data = ['foo' => 'bar', 'bar' => 'foo'];
Db::table('think_user')->insert($data);
如果你在database.php配置文件中配置了数据库前缀(prefix),那么可以直接使用 Db 类的 name 方法提交数据
Db::name('user')->insert($data);
insert 方法添加数据成功返回添加成功的条数,insert 正常情况返回 1
添加数据后如果需要返回新增数据的自增主键,可以使用getLastInsID方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();
或者直接使用insertGetId方法新增数据并返回主键值:
Db::name('user')->insertGetId($data);
insertGetId 方法添加数据成功返回添加数据的自增主键
添加多条数据
$data = [
['foo' => 'bar', 'bar' => 'foo'],
['foo' => 'bar1', 'bar' => 'foo1'],
['foo' => 'bar2', 'bar' => 'foo2']
];
Db::name('user')->insertAll($data);
助手函数
// 添加单条数据
db('user')->insert($data);
// 添加多条数据
db('user')->insertAll($list);
快捷更新
V5.0.5+以上版本封装的快捷更新方法data,可以配合insert使用。
下面举个例子说明用法:
Db::table('data')
->data(['name'=>'tp','score'=>1000])
->insert();