thinkphp5基础
【thinkphp5框架的目录结构,以及使用框架model 、controler、view的使用,以及错误调试和日志记录】
ThinkPHP5 在php5.5版本以上”No input file specified“问题解决:
public/.htaccess文件中的
RewriteRule ^(.*)$ index.php/$1 [QSA,PT,L]
在默认情况下会导致No input file specified.
修改成
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
问题解决
配置文件的使用
application/index.controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
class Demo extends Base{
// 配置文件的使用
public function config() {
// 默认一页显示15条
$config = Config::get("paginate");
dump($config);//15
$config = config("paginate.type");
dump(config("?paginate"));//boolean true
$config = config("paginate.type");
dump(config("?paginate111"));//boolean false
dump(Config::has("paginate"));//boolean true
dump(config("cyy"));
// array (size=1)
// cyy‘ => int 1
dump(config("redis.host"));//string ‘127.0.0.1‘
}
}application/extra/redis.php
<?php
// 配置文件的使用
return [
"host" => "127.0.0.1",
];application/index/config/php
<?php
// 配置文件的使用
return [
"cyy" => [
‘cyy‘ => 1,
]
];路由的使用
自定义路由
application/index/controller/Video.php
<?php
namespace app\index\controller;
class Video extends Controller {
// 自定义路由
public function getVideo() {
$id = input("param.id");
// http://phptest.com/index/video/getVideo?id=2
// => 域名/video/2
dump($id);
}
}application/route.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <>
// +----------------------------------------------------------------------
use think\Route;
// 自定义路由 域名/video/2
// Route::rule("video/:id", "index/Video/getVideo");
//Route::get("video/:id", "index/Video/getVideo");// 定义Get请求路由
//Route::post("video/:id", "index/Video/getVideo");// 定义Post请求路由
// 组合写法
Route::get([
‘video/:id‘ => ["index/Video/getVideo", [], [‘id‘ => ‘\d+‘]],
]);控制器的使用
application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
class Demo extends Base{
/**
* 初始化
* @auth cyy
* @return [type] [description]
*/
public function _initialize() {
dump("这是initialize");
}
public function test() {
// 数组转json格式返回
return json(["as" => 1, "cyy" => "test"]);
}
public function hello() {
var_dump(input("param."));
return "index-index-hello";
}
// 控制器-跳转
public function abc() {
$id = input("param.id", 0, "intval");
if($id == 1) {
$this->success("操作成功", "admin/index/index");
}elseif($id == 2) {
$this->error("操作失败");
}
}
// 控制器-重定向
public function ef() {
$this->redirect("hello", ["id" => 1, "ms" => 123]);
//redirect("https://baidu.com");
}
// 控制器-请求
public function requestData() {
$request = Request::instance();
//访问http://phptest.com/index/demo/requestData?ids=2
dump(request()->isPost());//boolean false
dump(input("?get.ids"));//boolean true
dump(request()->has("ids", "get"));//boolean true
}
}application/index/controller/Base.php
<?php
namespace app\index\controller;
use think\Controller;
class Base extends Controller {
/**
* 空操作
* @auth singwa
* @param [type] $name [description]
* @return [type] [description]
*/
// 控制器-空操作
public function _empty($name) {
// todo
return $name;
}
}数据库配置与model层数据操作
application/database.php
<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006~2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: liu21st <>
// +----------------------------------------------------------------------
return [
// 数据库类型
‘type‘ => ‘mysql‘,
// 服务器地址
‘hostname‘ => ‘localhost‘,
// 数据库名
‘database‘ => ‘test‘,
// 用户名
‘username‘ => ‘root‘,
// 密码
‘password‘ => ‘123456‘,
// 端口
‘hostport‘ => ‘3306‘,
// 连接dsn
‘dsn‘ => ‘‘,
// 数据库连接参数
‘params‘ => [],
// 数据库编码默认采用utf8
‘charset‘ => ‘utf8‘,
// 数据库表前缀
‘prefix‘ => ‘test_‘,
// 数据库调试模式
‘debug‘ => true,
// 数据库部署方式:0 集中式(单一服务器),1 分布式(主从服务器)
‘deploy‘ => 0,
// 数据库读写是否分离 主从式有效
‘rw_separate‘ => false,
// 读写分离后 主服务器数量
‘master_num‘ => 1,
// 指定从服务器序号
‘slave_no‘ => ‘‘,
// 是否严格检查字段是否存在
‘fields_strict‘ => true,
// 数据集返回类型
‘resultset_type‘ => ‘array‘,
// 自动写入时间戳字段
‘auto_timestamp‘ => false,
// 时间字段取出后的默认时间格式
‘datetime_format‘ => false,
// 是否需要进行SQL性能分析
‘sql_explain‘ => false,
];模型
application/common/model/Base.php
<?php
namespace app\common\model;
use think\Model;
class Base extends Model{
protected $autoWriteTimestamp = true;
//protected $createTime = ‘create_a_time‘;
/**
* 新增逻辑
* @auth singwa
* @param array $data [description]
* @return int
*/
public function add($data = []) {
if(empty($data) || !is_array($data)) {
return false;
}
$this->allowField(true)->save($data);
return $this->id;
}
}application/common/model/Video.php
<?php
namespace app\common\model;
class Video extends Base{
/**
* 定义一个关联 1-1
* @auth singwa
* @return [type] [description]
*/
public function videoFile() {
return $this->hasOne("VideoFile"); // video_id
}
}application/common/model/VideoFile.php
<?php
namespace app\common\model;
class VideoFile extends Base{
}application/index/controller/Video.php
<?php
namespace app\index\controller;
use think\Db;
use app\common\model\Video as VideoModel;
class Video extends Base {
// 数据库query查询
public function mysql() {
$video = Db::query("select * from test_video where id=2");
dump($video);
}
// 模型的使用
public function model() {
// 获取id为2的数据
$video = VideoModel::get(2);
//dump($video);
$video = new VideoModel();
$video->title = "cyy-test";
$video->description = "cyy-test-description1";
//dump($video->save());//int 1 插入数据保存成功
$data = [
"title" => "cyy-test3",
];
//dump($video->save($data));//dump($video->save());//int 1 插入数据保存成功
}
// 增
public function add() {
$video = model("Video");
$data = [
"title" => "cyy-test6",
"mpt" => 1,
];
$id = $video->add($data);
dump($id);//string ‘6‘ (length=1)
}
// 查
public function select() {
$conditon = [
"status" => 1,
];
//$videos = model("Video")->where($conditon)->select();
$videos = model("Video")
->where($conditon)
->limit(1)
->order("id", "desc")
->select();
dump($videos);
}
// 改
public function update() {
$updataData = [
"title" => "cyy你好鸭"
];
$whereCondition = [
"id" => 1,
];
//$res = model("Video")->allowField(true)->save($updataData, $whereCondition);
//echo model("Video")->getLastSql(); //作用非常重要
//dump($res);
model("Video")->where($whereCondition)
->update($updataData);
echo model("Video")->getLastSql();//UPDATE `test_video` SET `title`=‘cyy你好鸭‘ WHERE `id` = 1
}
// 删
public function delete() {
// 这种场景是 真正的删除
/*$res = model("Video")->where("id", ">", 18)->delete();
echo model("Video")->getLastSql();
dump($res);*/
// 在实际工作当中 我们的删除一般不直接删除, 所以一般假删除
// 修改status => -1
model("Video")->where(["id" => 6])
->update(["status" => -1]);
echo model("Video")->getLastSql();//UPDATE `test_video` SET `status`=-1 WHERE `id` = 6
}
//一对一关联
public function correlation() {
$video = model("Video")->find(1);
//halt($video->videoFile->file);
//dump(VideoModel::hasWhere("videoFile", ["video_id" => 1])->find());//string ‘file1‘ (length=5)
// 1vs1 插入
model("Video")->title = "1VS1-add-test";
model("Video")->image = "1vs1.gif";
model("VideoFile")->file = "1vs1.flv";
model("VideoFile")->status = 1;
model("Video")->VideoFile = model("VideoFile");
//dump(model("Video")->together("VideoFile")->save());
// 1vs1 更新操作
$video = model("Video")->find(1);
$video->title = "1vs1-update-test";
$video->videoFile->file = "1vs1-update.mp4";
//dump($video->together("videoFile")->save());
// 1 vs N 查询
//dump(model("Video")->videoFile()->where("video_id", 1)->select());
//dump(VideoModel::hasWhere(‘videoFile‘, ["video_id" => 1])->select());
}
}视图层
application/index/controller/Video.php
<?php
namespace app\index\controller;
use think\Db;
use app\common\model\Video as VideoModel;
class Video extends Base {
public function demo() {
$video = model("Video")->where(["id" => 1])->find();
$videos = model("Video")->where("id", ">", 1)->select();
// halt($video->update_time);//halt=dump+exit
// halt($video->update_time);
// halt($video->toArray());
return $this->fetch("", [
"name" => "cyy",
"names" => ["name" => "hello , cyy!"],
"video" => $video,
"videos" => $videos,
"id" => input("param.id")
]);
}
}application/index/view/video/demo.html
<html>
<body>
{$name}<br />
{$names[‘name‘]}<br />
{$names.name}<br />
{$video->title}<br />
{$video.title}<br />
{$video:title}<br />
{eq name="name", value="cyy1"}
cyy您好1111<br />
{else /}
不是cyy<br />
{/eq}
{$Request.get.id}<br />
{$video->create_time|date="Y-m-d H", ###}<br/>
{$video->status|status}<br/>
{volist name="videos" id="vo"}
{$vo.id} -------- {$vo.title} <br / >
{/volist}
</body>
</html>日志定位
application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
use think\Log;// 日志定位
class Demo extends Base{
public function logtest() {
Log::write("testlog".json_encode(input("param.")));
return 1;
}
}runtime/log下的当天文件夹里的.log文件
[ 2020-01-17T13:02:47+08:00 ] 127.0.0.1 127.0.0.1 GET /index/demo/logtest?mst=1&mp=45
[ log ] phptest.com/index/demo/logtest?mst=1&mp=45 [运行时间:0.022899s][吞吐率:43.67req/s] [内存消耗:1,372.95kb] [文件加载:33]
[ log ] testlog{"mst":"1","mp":"45"}
[ 2020-01-17T13:02:47+08:00 ] 127.0.0.1 127.0.0.1 GET /index/demo/logtest?mst=1&mp=45
[ log ] phptest.com/index/demo/logtest?mst=1&mp=45 [运行时间:0.233506s][吞吐率:4.28req/s] [内存消耗:1,571.42kb] [文件加载:40]
[ info ] [ LANG ] D:\phpstudy_pro\WWW\phptest\thinkphp\lang\zh-cn.php
[ info ] [ ROUTE ] array (
‘type‘ => ‘module‘,
‘module‘ =>
array (
0 => ‘index‘,
1 => ‘demo‘,
2 => ‘logtest‘,
),
)
[ info ] [ HEADER ] array (
‘cookie‘ => ‘thinkphp_show_page_trace=0|0; pgv_pvi=98915328; pgv_si=s6064574464; thinkphp_show_page_trace=0|0‘,
‘accept-language‘ => ‘zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7‘,
‘accept-encoding‘ => ‘gzip, deflate‘,
‘accept‘ => ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3‘,
‘user-agent‘ => ‘Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.75 Safari/537.36‘,
‘upgrade-insecure-requests‘ => ‘1‘,
‘cache-control‘ => ‘no-cache‘,
‘pragma‘ => ‘no-cache‘,
‘connection‘ => ‘close‘,
‘host‘ => ‘phptest.com‘,
)
[ info ] [ PARAM ] array (
‘mst‘ => ‘1‘,
‘mp‘ => ‘45‘,
)
[ info ] [ RUN ] app\index\controller\Demo->logtest[ D:\phpstudy_pro\WWW\phptest\application\index\controller\Demo.php ]
[ info ] [ LOG ] INIT Filetrace调试
application/config.php
// 应用调试模式
‘app_debug‘ => true,
// 应用Trace
‘app_trace‘ => true,application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
use think\Log;// 日志定位
class Demo extends Base{
public function logtest() {
$mrs = model("Video")->where(["id" => 2])->find();
echo model("Video")->getLastSql();
return 1;
}
}
变量调试
application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
use think\Log;// 日志定位
class Demo extends Base{
public function logtest() {
// prinr_r();
// var_dump();
// 类似断点调试
dump(input("param."));
halt(input("param.")); // dump() exit;
return 1;
}
}性能调试
application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
use think\Log;// 日志定位
use think\Debug;//性能调试
class Demo extends Base{
public function logtest() {
debug("start1");//--开始标记
$mrs = model("Video")->where(["id" => 2])->find();
//echo model("Video")->getLastSql();
debug("end1");//--结束标记
dump(debug("start1", "end1", 4));//string ‘0.0241‘
dump(debug("start1", "end1", "m"));//string ‘1.2 MB‘
//第三个参数如果是数字代表记录时间;如果是‘m‘代表记录内存使用
return 1;
}
}sql调试
application/index/controller/Demo.php
<?php
namespace app\index\controller;
use think\Config;
use think\Request;
use think\Log;// 日志定位
use think\Debug;//性能调试
class Demo extends Base{
public function logtest() {
$mrs = model("Video")->where(["id" => 2])->find();
echo model("Video")->getLastSql();
return 1;
}
}