面包屑思维模型实战模型错题集结构手册流程手册自我检测专题模块
-
微信小程序前端微信小程序前端易错点收集查看
-
css/less/sass样式控制在开发过程中的一些样式控制bug规避查看
-
tp5开发小程序tp5开发小程序时错误积累查看
-
PHP错题集PHP在实际开发过程中遇到的问题查看
-
MySql数据库使用MySql在实际开发中遇到的错误总结查看
-
TP5错题集积累tp5框架在实际开发过程中遇到的问题查看
-
uni-app爬坑主要用于uni-app项目中遇到的一些问题查看
-
Vue.js易错收集vue.js项目常见错误收集整理查看
-
uni-app开发微信小程序uni-app开发微信小程序的一些爬坑积累查看
-
LinuxLinux在部署、开发、运维时遇见的错误积累查看
-
安全设计常见安全设计查看
-
Redis项目中使用redis的相关错误积累查看
-
前端特效前端特效相关错题集查看
最新博文
-
命名空间问题(namespace和use)
thinkphp首先确定一个逻辑:命名空间的使用,是便于不同文件夹下同名类的调用不混淆。namespace和use的写法不是绝对路径,thinkphp5内核系统和有些第三方类库都做了命名空间的别名修改,即用别名来代替绝对路径。
命名空间主要服务于类的编写和使用。所以主要是两方面:安顿类库(在编写的类中使用正确的namespace)、使用类库(在类库的使用文件中正确使用use,并且正确地实例化类)。
一.namespace和use强调的不同
类的namespace和类使用者的use不是一致的,namespce是类文件class.php(或php)所在的文件夹路径,不包含自己;use则要包含类文件class.php(或php)。
1.namespace强调本类所在文件夹路径
2.use强调类的地址,有点像src,其主要是为了懒加载
例如:A控制器要使用B类(名称是Keep.php)
B的路径是 extend/test/chang/Keep.php
则B中的写法是
namespace test/chang;
class Keep{
}
A中的写法是
use test/chang/Keep
二.常用namespace根名
系统内置的几个根命名空间(类库包)如下:
think 系统核心类库 thinkphp/library/think
think vendor内置第三方类库 vendor/topthink
traits 系统Trait类库 thinkphp/library/traits
app 应用类库 application
类库名 vendor中composer下来的第三方类库 vendor
类库名 extend下非composer的第三方类库 extend
类库名 手动注册命名空间的第三方类库 任意位置
三.namespace和use不是绝对路径----定义命名空间别名
例如:绝对路径是app/index/model/User
完全写法是 namespace app\index\model 引用则是 use app\index\model\User
然而可以通过定义命名空间别名,将其改为model\User。
做法如下:
在应用公共文件中注册命名空间别名
\think\Loader::addNamespaceAlias('model','app\index\model');
四.类的分类
类主要分为:
1.thinkphp内置类;
2.第三方类(composer荡下来的);
3.第三方类(extend下的)
4.自定义类(任意位置)
我们要注意的地方主要是extend下的第三方类和自定义的类
五.自动注册和手动注册
自动注册和手动注册,就主要是针对extend下的类和自定义类。其强调怎样正确namespace、use,已经正确实例化对象。
1.自动注册(针对extend目录下的类)
namespace和use都是类库绝对路径(不包含extend自己),实例化也是要在new 后面加绝对路径
(1)使用use引用情况下实例化:实例化要加绝对路径+new后不加第一斜杠\
use test
$test= new test\Test();
(2)不使用应用情况下实例化:实例化要加绝对路径+new后必须加第一斜杠\
use test
$test=new \test\Test();
2.手动注册
在应用公共文件中添加下面的代码
\think\Loader::addNamespace('my','../application/extend/my/');
如果要同时注册多个根命名空间,可以使用
\think\Loader::addNamespace([ 'my' => '../application/extend/my/', 'org' => '../application/extend/org/', ]);
也可以直接在应用的配置文件中添加配置,系统会在应用执行的时候自动注册。
'root_namespace' => [
'my' => '../application/extend/my/',
'org' => '../application/extend/org/',
]其namespace和use不用绝对路径,直接使用"root_namespace"或者Loader::addNamespace()中定义定义的字段代替其要代替的路径名称。
阅读更多风口下的猪2019-06-09【thinkphp】
-
Request相关捕获
thinkphp
阅读更多风口下的猪2019-06-09【thinkphp】
-
引入验证码及切换验证码
thinkphp要使用验证码,首先Thinkphp5框架中要安装think-captcha扩展包。安装过后,会在vendor/topthink/中看到think-captcha文件。
1.引入验证码
在html中引入验证码的方法有两种,分别是:
(1)
{:captcha_img()}(2)
2.切换验证码
切换验证码的思路是不断变换连接,例如:
3.验证码的配置验证码的配置是在config.php中添加验证码配置参数//验证码'captcha' => [// 验证码字符集合'codeSet' => '2345678abcdefhijkmnpqrstuvwxyzABCDEFGHJKLMNPQRTUVWXY',// 验证码字体大小(px),根据所需进行设置验证码字体大小'fontSize' => 30,// 是否画混淆曲线'useCurve' => true,// 验证码图片高度,根据所需进行设置高度'imageH' => '',// 验证码图片宽度,根据所需进行设置宽度'imageW' => '',// 验证码位数,根据所需设置验证码位数'length' => 4,// 验证成功后是否重置'reset' => true],
阅读更多风口下的猪2019-06-09【thinkphp】
-
thinkphp5报错Request对象找不到
thinkphp
阅读更多风口下的猪2019-06-09【thinkphp】
-
修改静态资源路径
thinkphp在thinkphp中模板渲染,需要涉及到静态资源的载入。在开发过程中要查看或修改静态资源的位置
其修改的地方视thinkphp版本不同而定,一般两个地方:要么是application(或app)下的congfig.php配置文件,要么是thinkphp文件下的library/think/下的View.php文件。
或者直接在控制器中通过view()助手函数,进行对全局配置参数
view_replace_str
的设置方法1.在config.php中修改
第一步:在index.php中定义SCRIPT_DIR静态路径常量
//静态资源路径常量define('SCRIPT_DIR', rtrim(dirname($_SERVER['SCRIPT_NAME']), '\/\\'));第二步:在config中定义静态路径:如果需要全局替换的话,可以直接在配置文件中添加:
return = [ // 视图输出字符串内容替换 'view_replace_str' => [ '/ponder/public'=> SCRIPT_DIR . '/public', //前端网页css,img,js所在文件 '/ponder/public/static'=> SCRIPT_DIR . '/public/static', //后台程序css,img,js所在文件 '/ponder/public/common'=> SCRIPT_DIR . '/public/common', //前后共有css,img,js所在文件 '/ponder/' => SCRIPT_DIR . '/' //定义首页 ], ]
方法2.在View.php中修改if ('' != $root) {$root = '/'.ltrim($root, '/');}$baseReplace = ['/ponder' => $root,'/ponder/index.php/admin/crumbs' => $base.'/'.$request->module() .'/'.Loader::parseName($request->controller()),'/ponder/public/static' => $root.'/static','/ponder/static/css' => $root.'/static/css','/ponder/static/js' => $root.'/static/js',];方法3.在控制器中通过view()助手函数
阅读更多风口下的猪2019-06-09【thinkphp】
-
新建模块
thinkphp最开始一直习惯直接在application下直接建模块、控制器以及对应的model和view,然而在本地访问url+info时总是报404。
错误分析:手动在文件夹下建模块等内容时,其不会在app.php等配置文件中记录,则访问会出现“模块不存在、控制器不存在等”
所以,要习惯通过build.php来新增模块。
方法如下:
1.编写index.php
// 定义应用目录define('APP_PATH', __DIR__ . '/application/');// 站点安装目录define('SITE_PATH','/thinkphp');// runtime文件路径define('RUNTIME_PATH', __DIR__ . '/data/runtime/');// 加载框架引导文件require './thinkphp/start.php';$build = include './build.php';// 运行自动生成\think\Build::run($build);注意点:(1).define('APP_PATH', __DIR__ . '/application/')中, __DIR__的配置是在config.php中,application是thinkphp的主程序文件夹名(thinkphp3中有的是app,thinkphp5则是application)2.编写build.php文件return [// 生成应用公共文件'__file__' => ['common.php', 'config.php', 'database.php'],// 定义demo模块的自动生成 (按照实际定义的文件名生成)'admin' => ['__file__' => ['common.php'],'__dir__' => ['behavior', 'controller', 'model', 'view'],'controller' => ['Entry', 'Test', 'UserType'],'model' => ['User', 'UserType'],'view' => ['Entry/index'],],// 其他更多的模块定义];注意点:(1)thinkphp5中所有的文件夹名称都是小写,但build.php中的控制器名称要采用驼峰命名法;(2)build.php在运行时会自己判断,已经有的文件夹和文件他不会覆盖,没有的文件夹和文件他会创建。3.运行build.php文件在index.php中末尾写了\think\Build::run($build);也就是说访问index.php文件则会自动执行build,php
阅读更多风口下的猪2019-06-09【thinkphp】
嵌套使用select语言时使用多个order by报错
MySQL
阅读更多风口下的猪2019-06-09【MySQL】
使用mysql数据库进行左右连接查询的时候出现错误提示 Column ‘id’ in where clause is ambiguous
MySQL
阅读更多风口下的猪2019-06-09【MySQL】
MySQL视图
MySQL视图(view)是一种虚拟存在的表,是一个逻辑表,本身并不包含数据。作为一个select语句保存在数据字典中的。通过视图,可以展现基表(用来创建视图的表)的部分数据;视图数据来自定义视图的查询中使用的表,使用视图动态生成。
一.创建视图的意义
1)简单:使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
2)安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现。
3)数据独立:一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响;源表修改列名,则可以通过修改视图来解决,不会造成对访问者的影响。
总而言之,使用视图的大部分情况是为了保障数据安全性,提高查询效率。一般在金融行业和医疗行业的数据库特别喜欢使用视图。
二.视图使用的注意点
(1)适用场景
A.权限控制的时候,不希望用户访问表中某些含敏感信息的列,比如salary...;
B.关键信息来源于多个复杂关联表,可以创建视图提取我们需要的信息,简化操作;
(2)其与基表的联代关系
虽然视图是一种虚表,但不要认为其是独立可删可改的,视图与基表关联非常紧密,删除或者改变其中一个,另一个也必然受到牵连。
(3)视图和性能的关系
视图由于和基表联系紧密,说白了就是基表的映射备份。也就是说,服务器处理数据是同时处理两份或者多份数据。数据库数据少还行,过了3到5万这个节点,读写和更新操作就很慢了,这时在有视图的情况下读写就更慢了。所以,视图与数据库性能成反比。
三.创建视图
(1)在单表上建立视图
语法结构:
CREATE VIEW viewName (view_column1,view_column2,view_column3)
AS
SELECT base_column1, base_column2, base_column3 FROM baseName
WHERE...
WITH CHECK OPTION
#这里的with check option是说强制视图上执行的所有数据修改语句都必须符合由 select_statement 设置的准则。可加可不加
使用实例:
create view v_F_players(编号,名字,性别,电话)
as
select playernomber,name,sex,phone from PLAYERS
where SEX='F'
with check option;
(2)多表上建立视图
语法结构:
CREATE VIEW viewName
AS
SELECT a.column1,a.column2,b.column1,b.column2,c.column1,c.column2,column1,column2
FROM
baseName1 a, baseName2 b ,baseName3 c
WHERE...
使用实例:
create view v_match
as
select a.playernomber, a.name, matchno, won, lost, c.teamnumber, c.divition
from
PLAYERS a, MATCHES b, TEAMS c
where a.playernomber=b.playernomber and b.teamnumber=c.teamnumber;
主要这里使用了指针,将变量(a、b、c)指向了各个数据表,用以简化写法。
四.查看视图
select * from view_name;
五.修改视图
(1)使用CREATE OR REPLACE语句
A语法结构:
create or replace view view_name as select语句;
B.使用实例:
CREATE OR REPLACE VIEW v1(书名,价格) AS SELECT bookName,price FROM t_book;
(2)使用ALTER语句
A.语法结构:
alter view view_name as select语句;
B.使用实例:
ALTER VIEW v1 AS SELECT * FROM t_book;
六.删除视图
DROP VIEW IF EXISTS v1;
阅读更多风口下的猪2019-06-09【MySQL】
MySQL触发器
MySQLMySQL好像从5.0.2版本就开始支持触发器的功能了
触发器是与表有关的数据库对象,在满足定义条件时触发,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端确保数据的完整性。
一.触发器组成要素
触发器经常用于加强数据的完整性约束和业务规则等。 触发器创建语法四要素:
1.监视地点(table)
2.监视事件(insert/update/delete)
3.触发时间(after/before)
4.触发事件(begin和end之间的触发sql语句集)二.触发器语法
create trigger triggerName
after/before insert/update/delete on tableName
for each row #这句话在mysql是固定的
begin
sql语句;
end;
例子如下:
create trigger ins_stu
after insert on student for each row
begin
insert into cj ( stu_id, stu_name)
values( new.stuid, new.username);
end;
三.使用注意点
1.触发器只能建在永久表上,临时表上不能建触发器;
2.不推荐使用触发器,建议使用存储过程;
3.触发器一般在并发不高的项目中使用;
4.存储过程需要显式调用,意思是阅读源码的时候你能知道存储过程的存在,而触发器必须在数据库端才能看到,容易被忽略;
5.Mysql的触发器本身不是很好,比如after delete无法链式反应的问题。
阅读更多风口下的猪2019-06-09【MySQL】
MySQL插带和带插的区别
MySQL一.insert into select语句(插带)
1.语法结构
语句形式为:Insert into Table2(field1,field2,…) select value1,value2,… from Table1
或者:Insert into Table2 select * from Table1
2.使用注意点
(1)要求目标表Table2必须存在,并且字段field,field2…也必须存在
(2)注意Table2的主键约束,如果Table2有主键而且不为空,则 field1, field2…中必须包括主键
(3)注意语法,不要加values,和插入一条数据的sql混了,不要写成:
Insert into Table2(field1,field2,…) values (select value1,value2,… from Table1)
3.使用实例
由于目标表Table2已经存在,所以我们除了插入源表Table1的字段外,还可以插入常量。示例如下:
--1.创建测试表
create TABLE Table1 (
a varchar(10),
b varchar(10),
c varchar(10)
)
create TABLE Table2 (
a varchar(10),
c varchar(10),
d int
)
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)select * from Table2
--3.INSERT INTO SELECT语句复制表数据部分列和常值
Insert into Table2(a, c, d) select a,c,5 from Table1
或:Insert into Table2 select * from Table1
--4.显示更新后的结果
select * from Table2
二.select into from语句(带插)
1.语法结构
SELECT vale1, value2 into Table2 from Table1
2.使用注意点
要求目标表Table2不存在,因为在插入时会自动创建表Table2,并将Table1中指定字段数据复制到Table2中。当然,如果是拿变量来盛放数据,变量是可以事先存在的(像序列中构建序列库,建取下一个值函数nextval就用的value这个变量来放值)
3.使用实例
--1.创建测试表
create TABLE Table1(
a varchar(10),
b varchar(10),
c varchar(10)
)
--2.创建测试数据
Insert into Table1 values('赵','asds','90')
Insert into Table1 values('钱','asds','100')
Insert into Table1 values('孙','asds','80')
Insert into Table1 values('李','asds',null)
--3.SELECT INTO FROM语句创建表Table2并复制数据
select a,c INTO Table2 from Table1
--4.显示更新后的结果
select * from Table2
--5.删除测试表
drop TABLE Table1
drop TABLE Table2
三.总结说明
1.SELECT INTO 语句可用于创建表的备份复件。
阅读更多风口下的猪2019-06-09【MySQL】
- 数据库
- 开发终端
- 语言基础
- 项目管理
- 产品设计
- 系统
- 工作规范
- 计算机网络
- 前端技术栈
- 数据结构
- 计算机组成原理
- 后端技术栈
- 性能优化
- 安全设计
- 常见模块
- 计算机操作系统
- 服务器
- python
- MySQL
- thinkphp
- PHP
- Java
- JavaScript
- Windows
- Linux
- 特效
- indexedDB
- vue
- 淘宝联盟
- Ionic
- Angular
- 微信小程序
- 支付宝小程序
- uni-app
- css/sass/less
- 支付
- socket
- 爬虫
- web性能优化
- 消息推送
- CVM
- sqlite
- Redis
- 前端基础
- 基础
- element
- Nginx
- yii2
/ponder/index/catelist/catelist/cateid/10.html