【注意】最后更新于 October 25, 2022,文中内容可能已过时,请谨慎使用。
thinkphp 常用
配置 nginx 路由重定向
nginx 配置中
1
2
3
4
5
6
|
location / {
index index.php index.html error/index.html;
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=$1 last;
break;
}
|
配置nginx+thinkphp 二级目录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
location / {
try_files $uri $uri/ /index.php?$query_string;
index index.html index.htm index.php;
if (!-e $request_filename) {
rewrite ^/index.php(.*)$ /index.php?s=$1 last;
rewrite ^/fjnu/public/(.*)$ /fjnu/public/index.php?s=$1 last;
rewrite ^/jou/public/(.*)$ /fjnu/public/index.php?s=$1 last;
rewrite ^/zheda/public/(.*)$ /fjnu/public/index.php?s=$1 last;
rewrite ^(.*)$ /index.php?s=$1 last;
rewrite ^/fjnu/(.*)$ /fjnu/public/index.php?s=/$1 last;
rewrite ^/jou/(.*)$ /fjnu/public/index.php?s=/$1 last;
rewrite ^/zheda/(.*)$ /fjnu/public/index.php?s=/$1 last;
break;
}
}
|
多项目 apache .htaccess 配置
1
2
3
4
5
6
7
8
9
|
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{ENV:REDIRECT_STATUS} ^$
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>
|
apache 项目路由重写
1
2
3
4
5
6
7
8
|
<IfModule mod_rewrite.c>
Options +FollowSymlinks -Multiviews
RewriteEngine On
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
</IfModule>
|
获取最后一条SQL
model->getLastSql();
db()->getLastSql();
获取所有请求参数 input('get.') input('post.')
数组合并 array_merge
多维数组中获取子数组 array_column
模型条件
- 多字段 OR 。
1
2
3
|
user_id = '1' or apply_user_id = '1'
where(['user_id|apply_user_id' => '1'])
sql where ( user_id = '1' or apply_user_id = '1')
|
- 多字段 AND 。
1
2
|
user_id = '1' and title = 'aa'。& 和 | 不能同时使用
where(['user_id&title' => ['1','aa']])
|
- exp
表达式,使用函数时使用
1
|
update('create_time',['exp','sysdate']) // update create_time = sysdate
|
模型关联
模型关联预加载
1
|
$inhouse = ChemInHouseLedgersModel::get($condition,'ChemUseLedgers');
|
模型关联模型转数组
1
|
collection($inhouse->toArray())->toArray()
|
预加载模型加where条件
1
2
3
|
$inhouse = ChemInHouseLedgersModel::get($condition,['ChemUseLedgers' => function($query){
$query->where('USE_LEDGERS_NO','10983');
}]);
|
关联预加载多个表
1
|
$inhouse = ChemInHouseLedgersModel::get($condition,['ChemUseLedgers','Chem']);
|
获取多个 hasMany,单个 hasOne
foreach 插入时,可以先生成所有的数据,insertAll 一次插入。
token
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
<input type="hidden" name="__token__" value="{$Request.token}" />
验证
protected $rule = [
'name' => 'require|max:25|token',
'email' => 'email',
];
获取请求的微秒:`$_SERVER['REQUEST_TIME_FLOAT'];`
设置为 token的值并 hash,存到 session
每次请求都先删除旧的,生成一个新的
request()->token() // 生成一个 token
ajax 验证csrf
function getToken(){
var token = '';
$.ajax({
url: UrlArgent.CreateUrl('api/Csrf/getToken'),
type: 'get',
async:false,
success: function (res){
token = res.data.token;
}
})
return token;
}
每次请求前先生成 token 再发送过去验证
|
Oracle clob获取类型错误
由于没有处理,返回的是一个 resource。还需要进行 stream_get_contents
进行处理。直接修改驱动文件
vendor/topthink/think-oracle/src/Connection.php
加入下面两个方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
/**
* 获得数据集数组
* @access protected
* @param bool $pdo 是否返回PDOStatement
* @param bool $procedure 是否存储过程
* @return PDOStatement|array
*/
protected function getResult($pdo = false, $procedure = false)
{
if ($pdo) {
// 返回PDOStatement对象处理
return $this->PDOStatement;
}
if ($procedure) {
// 存储过程返回结果
return $this->procedure();
}
$result=[];
while ($row = $this->PDOStatement->fetch($this->fetchType)){
self::res2str($row);
$result[]= $row;
}
$this->numRows = count($result);
return $result;
}
private static function res2str(&$res){
if(is_array($res)){
foreach ($res as $key=>&$value) {
self::res2str($value);
}
}else if(is_resource($res)){
$res=stream_get_contents($res);
}
}
|
更新和插入 clob 类型数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
$chunkArr = $this->mbStrSplit($tmpArr,2000); # 先将字符串分割成数组,再使用 || 进行拼接,因为 Oracle 对一次处理字符串的长度有限制,分成多个字符串进行拼接。
$detail = implode('\'||\'',$chunkArr);
$no = $NoticeService->getNextVal('c2_base_web_notice');
$sql = <<<SQL
declare
cntent clob := '{$detail}';
begin
INSERT INTO c2_base_web_notice (NOTICE_NO, TITLE, NOTICE_DETAIL, NOTICE_TIME, TOP_MARK) values('{$no}', '{$data['TITLE']}', to_clob(cntent), to_date('{$data['NOTICE_TIME']}','YYYY-MM-DD HH24:MI:SS'), '{$data['TOP_MARK']}');
end;
SQL;
$result = Db::execute($sql);
# update
$sql = <<<SQL
declare
cntent clob := '{$detail}';
begin
UPDATE c2_base_web_notice SET TITLE='{$data['TITLE']}',TOP_MARK='{$data['TOP_MARK']}',NOTICE_DETAIL=cntent,notice_time=to_date('{$data['NOTICE_TIME']}','YYYY-MM-DD HH24:MI:SS') WHERE ( NOTICE_NO='{$NoticeInfo['NOTICE_NO']}');
end;
SQL;
|
自定义模板路径常量 PUBLIC,原理字符串替换
1
2
3
4
5
6
7
|
修改配置文件
// 视图输出字符串内容替换
'view_replace_str' => [
'__PUBLIC__'=> $_SERVER['REQUEST_SCHEME'] .'://' . $_SERVER['HTTP_HOST']. str_replace('/index.php' ,'' ,$_SERVER['SCRIPT_NAME'])
],
模板中直接使用
<a class="btn btn-sm btn-warning " href="__PUBLIC__/download/lab_import.xlsx"><i class="fa fa-upload"></i> 下载导入模板</a>
|
apache 配置路由重写
1
2
3
|
RewriteCond %{REQUEST_FILENAME} !-d
RewriteCond %{REQUEST_FILENAME} !-f
RewriteRule ^(.*)$ index.php [L,E=PATH_INFO:$1]
|
tcpdf 打印 png 图片太慢
每张图片要打印十秒
解决:设置 resize = true 并且 dpi = 100
1
|
$pdf->Image($user_info['SIGN_PIC'], $i, $j, 50, 50,'','','',true,'100');
|
模型查询方法
- get 底层调用 find
- update 底层调用 model−>isUpdate(true)−>save(model->isUpdate(true)->save(model−>isUpdate(true)−>save(data,$where); 返回 int false ,使用empty可以判断
- all 底层调用 select
tp 路由生成,模板及控制器
url 助手函数
参数:
- 路由路径
- 参数变量
- 后缀
- 域名
模板中使用 {:url("")}
生成URL 地址
如果在配置文件中配置了 url 的后缀为 html ,那么再生成 url 时,使用第三个参数 false ,可以去除配置的 html 后缀
1
|
var url = "{:url('/download/','',false)}";
|
控制器中可以使用 url
助手函数生成url 地址.
1
|
$url = url('/download/','',false);
|
生成的 URL 以当前服务器域名为主域名. 适用于一个域名对应一个或多个项目的情况
第四个参数为 二级域名, 如果配置了 第四个参数,那么会在主域名前生成一个二级域名
1
2
3
|
$url = url('/download/','',false,'blog');
// 当前项目地址为 http://caoayu.xyz/project
// 生成 url 为 http://blog.caoayu.xuz/project/download
|