tp5.0的學習筆記
專案目錄
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();