【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 <liu21st@gmail.com> // +---------------------------------------------------------------------- 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 <liu21st@gmail.com> // +---------------------------------------------------------------------- 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{ }
<?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 demo() { $video = model("Video")->where(["id" => 18])->find(); $videos = model("Video")->where("id", ">", 1)->select(); //halt($video->create_time); //halt($video->toArray()); //dump($video);exit; //echo 112; return $this->fetch("", [ "name" => "singwa", "names" => ["name" => "hello , singwa!"], "video" => $video, "videos" => $videos //"id" => input("param.id") ]); } //一对一关联 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()); } }