首页
关于
归档
朋友
壁纸
留言
API平台
告白墙
更多
休闲游戏
留言板
练字贴
Layui手册
Search
1
【PHP】PHPoffice/PHPSpreadsheet读取和写入Excel
1,019 阅读
2
【Git】No tracked branch configured for branch master or the branch doesn't exist.
749 阅读
3
【composer】composer常用命令
490 阅读
4
【Layui】控制页面元素展示隐藏
443 阅读
5
【MySQL】MySQL触发器应用场景和使用方法
422 阅读
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
登录
Search
标签搜索
PHP
函数
方法
类
MySQL
ThinkPHP
OOP
JavaScript
Layui
Web
Linux
Array
设计模式
Git
PHPSpreadsheet
PHPoffice
排序算法
面试题
Windows
基础
小破孩
累计撰写
212
篇文章
累计收到
16
条评论
首页
栏目
默认分类
PHP
ThinkPHP
Laravel
面向对象
设计模式
算法
基础
网络安全
Web
HTML
CSS
JavaScript
jQuery
Layui
VUE
uni-app
Database
MySQL
Redis
RabbitMQ
Nginx
Git
Linux
Soft Ware
Windows
网赚
Go
页面
关于
归档
朋友
壁纸
留言
API平台
告白墙
休闲游戏
留言板
练字贴
Layui手册
搜索到
208
篇与
的结果
2022-06-17
【PHP】面向对象 - final关键字
final关键字final关键字用于修饰类和方法。如果父类中的方法声明了final,则子类无法对其覆盖;如果父类声明了final,则不能被继承。 //父类: final class BaseClass { public function test() { echo "use test\n"; } final public function moreTesting() { echo "use moreTesting\n"; } } //子类继承父类: class ChildClass extends BaseClass { public function moreTesting() { echo "use moreTesting1111111\n"; } } //运行结果报错 PHP Fatal error: Cannot override final method BaseClass::moreTesting()
2022年06月17日
109 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - const关键字
constconst是一个定义常量的关键字用“const”修饰的成员属性的访问方式和“static”修饰的成员访问的方式差不多,也是使用“类名”,在方法里面使用“self”关键字。但是不用使用“$”符号,也不能使用对象来访问。 <?php class MyClass{ //定义一个常量CONSTANT const CONSTANT = 'constant value'; function showConstant() { echo self::CONSTANT ; // 使用self访问,不要加“$” } } echo MyClass::constant ; //使用类名来访问,也不加“$” $class = new MyClass(); $class->showConstant(); // echo $class::constant; 是不允许的 ?>
2022年06月17日
112 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - 静态方法与普通方法
静态方法:静态和公共、受保护、私有这3种属性格式没有关系, 他们并不是并列的静态方法不需要通过对象即可调用,所以伪变量 $this 在静态方法中不可用在同一个类中可通过self::关键字来调用静态方法;不同类中,可以通过类的实例化对象来调用静态方法或者通过 类名::静态方法名的方式调用。类里面的静态方法只能访问类的静态属性,不能访问类的非静态成员。从程序运行开始就实例生成内存 ,会高很多,但静态内存是有限制的,实例太多会占用大量内存,且.静态内存会常驻适用于多次频繁调用普通方法:实例方法开始生成内存,执行效率相对于静态方法会慢很多普通方法不会常驻内存可以通过$this,self关键字来调用,即普通方法需要对象去调用,而静态方法不需要
2022年06月17日
144 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - 静态变量与普通变量
在变量的前面加上static 就构成了静态变量(static 变量)。静态变量:静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该区域中的数据在整个程序的运行期间一直占用这些存储空间(在程序整个运行期间都不释放),也可以认为是其内存地址不变,直到整个程序运行结束。(在函数执行完后不会被销毁,保留上次值)静态变量虽在程序的整个执行过程中始终存在,但是在它作 用域之外不能使用。属于静态存储方式的变量不一定就是静态变量。 例如:外部变量(在PHP中指全局变量)虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。静态局部变量:static类型的内部变量是一种只能在某个特定函数中使用,只会被初始化一次。当在某函数里定义一个静态变量后,这个变量不会即使函数退出了,在下次调用这个函数时,它会使用前次被调用后留下的值。作用域为该函数内部,外部函数不能使用。局部静态变量定义时没有赋初值,系统会自动赋初值0(对数值型变量)或空字符(对字符变量)。局部静态变量占用内存时间较长,并且可读性差全局局部变量:全局变量(外部变量)的声明之前加上static 就构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。静态全局变量则限制了其作用域, 即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。普通变量:非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。动态变量,属于动态存储类别,占动态存储空间,函数调用结束后即释放,不会保留上次函数运行的值。 // 静态局部变量:函数每次执行都会保留上次值 function static_test() { static $test = 0; $test++; echo $test; } static_test();// 第一次执行 输出 1 static_test();// 第二次执行 输出 2 // 普通局部变量:函数每次执行完都释放 function test() { $test = 0; $test++; echo $test; } test();// 第一次执行 输出 1 test();// 第二次执行 输出 1把局部变量改变为静态变量后是改变了它的存储方式,即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。
2022年06月17日
131 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - static关键字
staticstatic关键字是在类中描述成员属性和方法是静态的。static成员能够限制外部的访问,因为static成员是属于类的,不属于任何对象实例,是在类第一次被加载的时候分配的空间,其他类无法访问,只能对垒的实例共享,能对类的成员形成保护静态成员是在类第一次加载的时候就创建的,所以在类的外部不需要对象而使用类名就可以访问的到静态的成员。类里面的静态方法只能访问类的静态属性,不能访问类的非静态成员。在静态方法中可以通过使用 self::成员属性的方法进行访问。静态属性不能通过一个类已实例化的对象来访问(但静态方法可以)。 <? class Person{ //下面是人的静态成员属性 public static $myCountry = "中国"; //这是人的静态成员方法 public static function say() { echo "我是中国人"; } } //输出静态属性 echo Person::$myCountry; //访问静态方法 Person::say(); (new Person())->say(); //重新给静态属性赋值 Person::$myCountry = "美国"; echo Person::$myCountry; ?>
2022年06月17日
129 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - 访问权限
public: 公有类型 在子类中可以通过self::var调用public方法或属性,parent::method调用父类方法在实例中可以能过$obj->var 来调用 public类型的方法或属性protected: 受保护类型在子类中可以通过self::var调用protected方法或属性,parent::method调用父类方法在实例中不能通过$obj->var 来调用 protected类型的方法或属性private: 私有类型该类型的属性或方法只能在该类中使用在该类的实例、子类中、子类的实例中都不能调用私有类型的属性和方法 <?php //父类 class father{ public function a(){ echo "public function a".PHP_EOL; } private function b(){ echo "private function b".PHP_EOL; } protected function c(){ echo "protected function c".PHP_EOL; } } //子类 class child extends father{ function d(){ parent::a();//调用父类的a方法 } function e(){ parent::c(); //调用父类的c方法 } function f(){ parent::b(); //调用父类的b方法 } } $father=new father(); $father->a(); //输出 public function a $father->b(); //显示错误 外部无法调用私有的方法 $father->c(); //显示错误 外部无法调用受保护的方法 $chlid=new child(); $chlid->d();//输出 public function a $chlid->e(); ////输出 protected function c $chlid->f();//显示错误 无法调用父类private的方法 Uncaught Error: Call to private method father::b() from context 'child'
2022年06月17日
115 阅读
0 评论
0 点赞
2022-06-17
【PHP】面向对象 - 三大基本特征和五大基本原则
面向对象基本特征:封装隔离性:被封装后的对象,其外部对象是无法直接访问对象的内部实现细节,内部实现细节的的改动不会影响到外部对象的访问原则(即:对象内部修改后,在公开暴露指定的访问路径不变的情况下,外部访问它的对象是无需修改的),这是隔离性的体现,同时也是实现高内聚,低耦合的最根本的思想之一;可复用性:被封装后的对象可以被外部多个对象访问,而无需为每个外部对象去指定不同的服务对象;减少代码的冗余。可读性:合理设置被封装的对象名称,可增强代码的可读性,通过方法名或者类名即可了解其作用。继承PHP中主要通过extends关键字来实现继承: class Student extends Person{}PHP只能单继承,不支持一个类继承多个类。但是一个类可以进行多层继承(即A继承于B,而C又继承于A,C通过A间接继承了B)子类继承父类非私有的属性和方法,可以通过$this关键字进行访问覆盖:子类中声明与父类相同名称的属性和方法,则该属性和方法会覆盖父类中的属性和方法,属性被覆盖后,无法访问父类中的属性,方法被覆盖后,可以通过parent::方法名()进行访问多态同一方法作用于不同对象时,产生不同的执行结果多态存在的三个必要条件:继承、重写(子类继承父类后对父类方法进行重新定义)、父类引用指向子类对象示例如下: abstract class Person{ // 父类使用abstract关键字修饰 abstract function say(); } class Chinese extends Person{ // 子类重写父类方法 function say(){ echo "我是中国人<br>"; } } class English extends Person{ // 子类重写父类方法 function say(){ echo "我是英国人"; } } $zhangsan = new Chinese(); $zhangsan->say(); $z = new English(); $z->say(); Person $p = new Chinese(); // 父类引用指向子类对象上述代码中,两个子类都是继承自同一父类,但因为都重写了父类的方法,表现出了不同的形态 基本原则:1、单一职责原则(SRP)单一职责有两个含义:一个是避免相同的职责分散到不同的类中,另一个是避免一个类承担太多职责2、开放封闭原则(OCP)一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的3、里氏替换原则(LSP)子类型必须能够替换掉它们的父类型,并出现在父类能够出现的任何地方。4、依赖倒置原则(DIP)依赖倒置简单地讲就是将依赖关系倒置为依赖接口,具体概念如下:上层模块不应该依赖于下层模块,它们共同依赖于一个抽象(父类不能依赖子类,它们都要依赖抽象类)。抽象不能依赖于具体,具体应该依赖于抽象。5、接口隔离原则(ISP)不同的模块要通过抽象接口隔离开,而不是通过具体的类强耦合。
2022年06月17日
140 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP函数大全
PHP函数大全有道云地址:http://note.youdao.com/noteshare?id=f1271100f4366b0338e9a45b8bbd4db7&sub=0DA577EC658B4923A67FA4EB862D2FDA
2022年06月17日
111 阅读
0 评论
0 点赞
2022-06-17
【Nginx】Nginx Log日志统计分析常用命令
IP相关统计统计IP访问量(独立ip访问数量) awk '{print $1}' access.log | sort -n | uniq | wc -l 查看某一时间段的IP访问量(4-5点) grep "07/Apr/2017:0[4-5]" access.log | awk '{print $1}' | sort | uniq -c| sort -nr | wc -l 查看访问最频繁的前100个IP awk '{print $1}' access.log | sort -n |uniq -c | sort -rn | head -n 100 查看访问100次以上的IP awk '{print $1}' access.log | sort -n |uniq -c |awk '{if($1 >100) print $0}'|sort -rn 查询某个IP的详细访问情况,按访问频率排序 grep '127.0.01' access.log |awk '{print $7}'|sort |uniq -c |sort -rn |head -n 100 页面访问统计查看访问最频的页面(TOP100) awk '{print $7}' access.log | sort |uniq -c | sort -rn | head -n 100 查看访问最频的页面([排除php页面】(TOP100) grep -v ".php" access.log | awk '{print $7}' | sort |uniq -c | sort -rn | head -n 100 查看页面访问次数超过100次的页面 cat access.log | cut -d ' ' -f 7 | sort |uniq -c | awk '{if ($1 > 100) print $0}' | less 查看最近1000条记录,访问量最高的页面 tail -1000 access.log |awk '{print $7}'|sort|uniq -c|sort -nr|less每秒请求量统计统计每秒的请求数,top100的时间点(精确到秒) awk '{print $4}' access.log |cut -c 14-21|sort|uniq -c|sort -nr|head -n 100每分钟请求量统计统计每分钟的请求数,top100的时间点(精确到分钟) awk '{print $4}' access.log |cut -c 14-18|sort|uniq -c|sort -nr|head -n 100每小时请求量统计统计每小时的请求数,top100的时间点(精确到小时) awk '{print $4}' access.log |cut -c 14-15|sort|uniq -c|sort -nr|head -n 100性能分析在nginx log中最后一个字段加入$request_time 列出传输时间超过 3 秒的页面,显示前20条 cat access.log|awk '($NF > 3){print $7}'|sort -n|uniq -c|sort -nr|head -20 列出php页面请求时间超过3秒的页面,并统计其出现的次数,显示前100条 cat access.log|awk '($NF > 1 && $7~/\.php/){print $7}'|sort -n|uniq -c|sort -nr|head -100蜘蛛抓取统计统计蜘蛛抓取次数 grep 'Baiduspider' access.log |wc -l 统计蜘蛛抓取404的次数 grep 'Baiduspider' access.log |grep '404' | wc -lTCP连接统计查看当前TCP连接数 netstat -tan | grep "ESTABLISHED" | grep ":80" | wc -l 用tcpdump嗅探80端口的访问看看谁最高 tcpdump -i eth0 -tnn dst port 80 -c 1000 | awk -F"." '{print $1"."$2"."$3"."$4}' | sort | uniq -c | sort -nr
2022年06月17日
93 阅读
0 评论
0 点赞
2022-06-17
【MySQL】MySQL命令总结
完整的创建数据库例子: >create database db_test default character set utf8 collate utf8_general_ci; >use db_test; >CREATE TABLE tb_user( >id INT(10) NOT NULL AUTO_INCREMENT COMMENT"主键", >name VARCHAR(20) NOT NULL COMMENT"姓名", >age INT(3) DEFAULT 0, >PRIMARY KEY(id) >) COMMENT"用户表"; 其他有关命令: 1,启动和关闭数据库 >net start mysql >net stop mysql 所以命令必须是一行的第一个,并且以分号结尾: All text commands must be first on line and end with ";" 2,根据用户名密码,登录数据库 >mysql -uroot -p; 如果数据库没有密码则使用 >mysql -uroot; 3,查看在当前服务器中有多少个数据库 >show databases; 4,删除某个数据库 >drop database databaseName; >commit; 5,创建数据库 >CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 更改数据库的字符编码 ALTER DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 6,选择使用某个数据库 >use databaseName; 7,查看数据库中有多少的表 >show tables; 8,创建表 >create table tableName( id int(10) NOT NULL AUTO_INCREMENT,PRIMARY KEY(id), name varchar(20) ); 9,显示本数据库的所有表 >show tables; 10,显示某一个表 >show create table tableName; 11,显示表结构 >describe tableName; (或者简写: desc tableName;) 12,向表中加入数据并查看 >insert into tableName(id,name...) values('1','admin',...); >select * from tableName; 13,导入.sql文件(文件所在路径是F:\file.sql >source F:/file.sql; 14,删除表 >drop table tableName; 15,删除表中的所有数据,但是表结构依然存在 >delete from tableName; 16,更新表中的数据,如果没有where,则将影响所有的记录 >update tableName set name='administrator' where id='1'; 17,查看服务器版本和当前日期 >select version(),current_date; >select version(); >select now(); 18,把mysql作为一个简单的计算器 select pi(); >select pi()*10; 19,查看用户 >select user(); 20,使用load >load data local infile filePath into table tableName; 21,慢日志 查看慢日志是否开启:show variables like '%slow_query_log'; 开启慢日志:set global slow_query_log=1; 查看慢查询时间:show variables like '%long_query_time%'; 修改慢查询时间:set global long_query_time=2;//两秒
2022年06月17日
118 阅读
0 评论
0 点赞
2022-06-17
【MySQL】MySQL中批量替换某个字段的部分数据
1.修改字段里的所有含有指定字符串的文字 UPDATE 表A SET 字段B = replace(字段B, 'aaa', 'bbb') example: update table set url= replace(url, 'aaa', 'bbb') 【将url字段中的aaa批量更改为bbb】 update table set url= REPLACE (url,'3','1.png') where 条件; 2.常规条件修改: update table set column='' where column is null
2022年06月17日
119 阅读
0 评论
0 点赞
2022-06-17
【MySQL】MySQL添加用户、删除用户与授权
MySql中添加用户,新建数据库,用户授权,删除用户,修改密码(注意每行后边都跟个;表示一个命令语句结束): 1.新建用户 1.1 登录MYSQL: @>mysql -u root -p @>密码 1.2 创建用户: mysql> insert into mysql.user(Host,User,Password) values("localhost","test",password("1234")); 这样就创建了一个名为:test 密码为:1234 的用户。 注意:此处的"localhost",是指该用户只能在本地登录,不能在另外一台机器上远程登录。如果想远程登录的话,将"localhost"改为"%",表示在任何一台电脑上都可以登录。也可以指定某台机器可以远程登录。 1.3 然后登录一下: mysql>exit; @>mysql -u test -p @>输入密码 mysql>登录成功 2.为用户授权 授权格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.1 登录MYSQL(有ROOT权限),这里以ROOT身份登录: @>mysql -u root -p @>密码 2.2 首先为用户创建一个数据库(testDB): mysql>create database testDB; 2.3 授权test用户拥有testDB数据库的所有权限(某个数据库的所有权限): mysql>grant all privileges on testDB.* to test@localhost identified by '1234'; mysql>flush privileges;//刷新系统权限表 格式:grant 权限 on 数据库.* to 用户名@登录主机 identified by "密码"; 2.4 如果想指定部分权限给一用户,可以这样来写: mysql>grant select,update on testDB.* to test@localhost identified by '1234'; mysql>flush privileges; //刷新系统权限表 2.5 授权test用户拥有所有数据库的某些权限: mysql>grant select,delete,update,create,drop on *.* to test@"%" identified by "1234"; //test用户对所有数据库都有select,delete,update,create,drop 权限。 //@"%" 表示对所有非本地主机授权,不包括localhost。(localhost地址设为127.0.0.1,如果设为真实的本地地址,不知道是否可以,没有验证。) //对localhost授权:加上一句grant all privileges on testDB.* to test@localhost identified by '1234';即可。 3. 删除用户 @>mysql -u root -p @>密码 mysql>Delete FROM user Where User='test' and Host='localhost'; mysql>flush privileges; mysql>drop database testDB; //删除用户的数据库 删除账户及权限:>drop user 用户名@'%'; >drop user 用户名@ localhost; 4. 修改指定用户密码 @>mysql -u root -p @>密码 mysql>update mysql.user set password=password('新密码') where User="test" and Host="localhost"; mysql>flush privileges; 5. 列出所有数据库 mysql>show database; 6. 切换数据库 mysql>use '数据库名'; 7. 列出所有表 mysql>show tables; 8. 显示数据表结构 mysql>describe 表名; 9. 删除数据库和数据表 mysql>drop database 数据库名; mysql>drop table 数据表名;
2022年06月17日
126 阅读
0 评论
0 点赞
2022-06-17
【Web】CSS常用内容及解释
CSS 选择器 基本选择器grif *通配符:匹配所有的html标记,所有吊机都会改变的 标签选择器:将其匹配指定的html标记 class选择器:给一类HTML标记加样式。这里所指的“一类”是:每个HTML标记都有一个class属性,且class的值一样。class属性是公共属性,每个HTML标记都有 id选择器:给指定id的元素添加样式。网页中HTML标记的id属性的值,必须是唯一的。 组合选择器 多元素选择器:给多个元素加同一个样式,多个选择器之间用“,”隔开 后代选择器 给某个标签的某个后代元素加样式,选择器之间用空格隔开 子元素选择器:给某个元素的子元素添加样式举例:div > h1.title{color:red;} css尺寸属性 width:元素宽度,一定要加px单位 height:元素高度 css字体属性 font-size:字体大小 font-family:字体 font-style:斜体,取值:italic font-weight:粗体,取值,bold css文本属性 color:文本颜色 text-decoration:文本修饰线,取值:none(无),underline(下划线),overline(上划线),line-through(删除线) text-align:文本水平对齐方式,取值:left,center,right line-height:行高,可以用固定值,也可以用百分比 text-indent:首行缩进 letter-spacing:字间距 CSS选择器——基本选择器(单个选择器) 1,通配符“*”:将匹配所有的HTML标记,只要<body>中存在的标记都会生效。 2,标签选择器:对应于HTML标记,有什么样的HTML标记,就有什么样的标签选择器。如:p{color:red;} 3,类选择器:给HTML标记中,class属性值相同的元素,添加样式。命名必须以“.”开头。如:.news{} 4,Id选择器:给HTML标记中,具有id属性的元素,添加样式。唯一性。命名以“#”开头。如:#news{} CSS选择器——组合选择器(多个选择器) 1,多元素选择器:同时给多个元素添加样式,各个选择之间用逗号“,”分开。如:p,h1,#box{} 2,后代元素选择器:给某个元素的所有后代元素,添加样式。用空格隔开。如:#box h1{} 3,子元素选择器:给某个元素的子元素添加样式。用“>”隔开。如:#box > h1{} 一个超链接,有四个状态: 正常状态(:link):鼠标没放上之前链接的样式。 放上状态(:hover):鼠标放到链接上时的样式。 激活状态(:active):按住鼠标左键不松开的样式,这个状态特殊短暂。 访问过的状态(:visited):按下鼠标左键,并弹起,这时的样式效果。 在平常工作中,会使用以下写法,来给链接加不同的样式: a:link, a:visited{ color:#444; text-decoration:none; } //将“正常状态”和“访问过的状态”合二为一。 a:hover{ color:#990000; text-decoration:underline; } //“鼠标放上”单做一种效果 list-style:列表样式,取值:none。去掉项目符号或者编号前面的各种符号 ul li{list-style:none;/*去除前面的符号*/} css边框属性 border-left:左边框线 格式:border-left:粗细 线型 线的颜色 线型:none(无线) solid(实线) dashed(虚线) dotted(点状线) 举例:border-left:5px dashed red; border-right:有边框 border-top:上边框 border-bottom:下边框 /*行内元素没有width和height属性 块级元素才有width和height的属性 */ css内边距属性 padding-left:左内填充距离,左边先到内容间的距离 padding-right:右内填充距离,右边线到内容间的距离 padding-top:上内填充距离,上边线到内容间的距离 padding-bottom:下内填充距离,下边线到内容间的距离 缩写形式 padding:10px;//四个边的内填充分别为10px padding:10px 20px;//上下为10px,左右为20px padding:5px 10px 20px;//上为5px,左右为10px,下为20px padding:5px 10px 15px 20px; //循序是:上右下左(顺时针) css外边距属性 margin-left:左边线往外的距离 margin-right:右边线往外的距离 margin-top:上边线往外的距离 margin-bottom;下边线往外的距离 简写形式 margin:10px;//四个外边距分别为10px margin:10px 20px;//上下外边距10px,左右外边距20px margin:5px 10px 15px;//上外边距5px,左右外边距10px,下外边距15px margin:5px 10px 15px 20px;//上右下左(顺时针方向) css背景属性 background-color:背景颜色 background-image:背景图片 例:background-image:url(路径) background-repeat:背景平铺方式。取值no-repeat(不平铺),repeat-x(水平方向),repeat-y(垂直方向) background-position:背景定位,格式:background-position:水平方向定位,垂直方向定位 英文单词定位:background-position:left|center|right top|center|bottom; 用固定值定位:background-position:50px 50px;//背景距离容器的左边50px,容器的顶端50px 用百分比定位:background-position:50% 50%;//水平居中,垂直居中 用混合定位:background-position:left 10px;//背景靠左边齐,距离容器顶端10px 简写方式: background:背景色 背景图 平铺方式 定位方式 举例:background:url(images/bg.gif) no-repeat center center; 举例:background: #ccc url(images/bg.gif) no-repeat left 10px; css浮动和清除 float:让元素浮动,取值:left(左浮动),right(右浮动) clear:清除浮动,取值:left(清除左浮动),right(清除右浮动),both(同时清除上面的左右浮动) 1、CSS浮动 浮动的元素,将向左或向右浮动,浮动到包围元素的边上,或上一个浮动元素的边上为止。 浮动的元素,不再占空间了,并且,浮动元素的层级要高于普通元素。 浮动的元素,一定是“块元素”。不管它原来是什么元素。 如果浮动的元素,没有指定宽度的话,浮动后它将尽可能的变窄。因此,浮动元素一般要定宽和高。 一行的多个元素,要浮动一起浮动 2、CSS清除浮动 CSS清除浮动的功能有两个:(1)可以包围元素从“视觉上”包住浮动元素(2)清除之下的其它元素将恢复默认排版。 有浮动,就得有清除。 如果包围元素指定了高度了,那么可以不使用清除功能。 css优先级 行内样式》id选择器》class选择器》标签选择器 display属性 功能:规则网页元素如何显示的问题 取值:none(隐藏),block(一块级元素显示),inline(以行内元素显示) block:可以实现将行内元素转换成块级元素 inline:可以实现将块级元素转换成行内元素 overflow属性:当内容溢出时,该如何显示 取值:visible(可见),hidden(隐藏),scroll(出现滚动条),auto(自动) cursor光标类型 取值:text(文本),help(帮助),wait(等待),pointer(手型)等。 css定位 position:元素定位方式 static:静态定位(默认状态,不定位); fixed:固定位置 relative:相对定位 absolute:绝对定位 定位方式要与定位属性配合使用 定位坐标:指定定位的元素,偏移目标元素多远的距离 left:定位元素,距离目标元素左边的距离 top:定位元素,距离目标元素上边的距离 right:定位元素,距离目标元素右边的距离 bottom:定位元素,距离目标元素下边的距离 css表格属性 border-collapse:表格边框线合并,取值:collapse 全局css设置 1、清除所有的标记的内外边距 body,ul,li,a,img,p,input{ margin:0; padding:0; } 2、去除项目符号或编号前面的符号 ul,ol,li{ list-style:none; } 3、全局链接效果 a:link , a:visited{color:#444;text-decoration:none;} a:hover{color:red;} 4、网页中所有的文字大小颜色 body{ font-size:12px; font-family:宋体; color:#ccc; } 5、去除图片的链接边框线 img{border:0;} 6、全局的类样式 .floatL{ float:left; } .floatR{ float:right; } .clear{clear:both;} .blank10{ height:10px; clear:both; } .red{ color:red; } .blue{ color:blue; }
2022年06月17日
139 阅读
0 评论
0 点赞
2022-06-17
【Web】HTML标签大全及使用方法
body常用属性: <body bgColor="#123123" background=""></body> html文本标记 <b></b>:加粗 bold <i></i>:斜体 italic <u></u>:下划线 underline <s></s>:删除线 strike <sup></sup>:上标 <sub></sub>:下标 <font></font>字体标记 size:文子大小1-7,1小,7大 color:颜色值 face: 字体 <p></p>:表示一个段落 align:水平对齐方式,left,center,right <br>:换行标记 <hr>:水平线标记 size:水平线的粗细,单位为px color:水平线的颜色 width:水平线的宽度 noshade:去掉水平线的阴影 <pre></pre>:原封不动的输出 <h1>......<h6>:标题标记 HTML字符实体 空格: < :< > :> & :& ¥ :¥ × :× ÷ :÷ HTML项目符号 无序列表 <ul type="disc(小黑点)|circle(空心圆)|square(实心方块)"> <li>内容</li> <li>内容</li> <li>内容</li> </ul> 有序列表 <ol type="A" start="6">//type:编号类型,取值1,a,A,i,I | start:从第几个开始编号 <li></li> <li></li> <li></li> <li></li> </ol> <marquee></marquee>:滚动字母标记 属性: direction:滚动方向,up,down,left,right width:滚动宽度 height:滚动高度 bgColor:滚动背景颜色 scrollAmount:滚动步长值,值越大,滚动越快 scrollDelay:两步之间的停留时间,以毫秒为单位,一秒=1000毫秒 loop:循环滚动的次数 图片标记:行内元素,单边标记 width:图片宽度 height:图片高度 border:图片边框粗细 src:图片路径(相对路径) align:图片水平对齐方式,取值left,center,right hspace:图片与左右文字之间的距离(水平距离) vspace:图片与上下文字间的距离(垂直距离) 注意: 如果图片相等比例缩放,只需要指定width或者height其中的一个 align属性只能让文本居中,不能让图片单独居中 align可以是实现,图文混排效果,align = "left|right" 超链接:行内元素 常用属性 href:目标文件地址url, target:目标文件显示窗口 _blank:在新窗口中打开目标文件 _self:在当前窗口中打开目标文件(默认) _parent:在父级窗口来打开目标文件 _top:在最顶级窗口来打开目标文件 绝对地址URL 远程绝对地址:如:http://www.baidu.com 本地绝对地址:file:///C:/ 特殊链接 下载链接<a href="images/winrar.rar">下载WinRAR解压缩文件</a> 邮箱链接<a href="mailto:3584685883@qq.com">请给我发邮件</a> 普通空连接<a href="#">普通空连接</a> js链接:添加JS功能代码<a href="javascript:window.close()">关闭窗口</a> 锚点链接:定义记号 命名规则:可以包含字母,数字,下划线,但只能以字母开头 <a href = “文件名#锚点名称”>……</a> 文件名:可有可无。如果是同一个网页的不同部分跳转,不需要文件名;如果是跳到另一个网页的不同部分,这时必须要有文件名。 <meta>标记 http-equiv属性 设置网页的字符<meta http-equiv="Conten-Type" content="text/html;charset=utf-8" /> 网页自动刷新 <meta http-equiv="refresh" content="2">//每隔两秒钟,自动刷新 <meta http-equiv="refresh" content="2;url=http://www.baidu.com">//两秒钟后,调到百度 name属性 <meta name="keywords" content="设置网页搜索的关键字" /> <meta name="direction" content="描述网页信息" /> 表格结构 <table> <tr> <td></td> <td></td> </tr> <tr> <td></td> <td></td> </tr> </table> table属性: width:表格宽度,单位可以是百分比,也可以是固定值 height:表格高度 align:表格水平对齐方式,取值:left,center,right border:边框粗细 bordercolor:边框颜色 bgcolor:表格背景色 background:背景图片url cellpadding:单元格变现到内容间的距离(填充距离) cellspacing:单元格与单元格之间的距离(间距) rules:合并单元格边框线,取值:all tr属性 bgcolor:行的背景色 height:行的高度 align:行中的文本水平居中,取值left,center,right valign:垂直居中,取值:top,middle,bottom <td>或<th>属性 td:普通的单元格,th标题单元格,居中加粗显示 width:单元格宽度 height:单元格高度 bgcolor:单元格背景色 background:单元格背景图片 align:水平对齐 valign:垂直对齐 rowspan:上下单元格合并,合并属性必须放在第一个单元格中 colspan:左右单元格合并,合并时,有增就得有减,要保证每行单元格的个数不变 表单 <form>标技属性-块元素 name:给表单起个名字,对js用来做表单验证 method:表单提交方式,取值get,post action:指表单的处理程序,一般是PHP文件 enctype:指定标点数据的编码方式,这个属性只能用在method="post"的情况下 application/x-www-form-urldecoded//默认的加密方式 multipart/form-data//如果你上传文件,该值必须他自己 get方法和post方法 get方式不能提交敏感数据 get方式只提交少量数据,长度受限 get方式不能上传附件 post提交数据相对安全 post方式可提交海量数据 post方式可以上传附件 单行文本域:<input type="text" 属性="值"> 单行密码域:<input type="password" 属性="值"> name:文本框的名字。可以使字母数字,下划线,只能以字母开头 type:表单元素的类型 value:文本框中的值 size:文本框的长度,以字符为单位 maxlength:最多可以输入多少字符 readonly:只读属性,可以先种,但不能修改readonly="readonly" disabled:禁止属性,不能选中,不能修改disabled="disabled" 单选按钮<input type="radio" 属性="值"> name:元素名称 value:元素值,该value中数据将发往服务器 checked:默认选择那一项 注意:一组单选按钮,只能选择一个,但name的值必须一致。 复选框<input type="checkbox" 属性="值"> name:元素名称 value:元素的值 checked:默认选中 注意:复选框也是一组选项,因此name的值必须一致。在PHP中,使用数组来获取多个同名的name的值。复选框可以同时选多个,也可以一个都不选 下拉列表 <select>:标记的属性,只有一个name属性 <option>:标记的属性有两个:value属性,selected属性 selected:默认选中:selected="selected" 文本域<textarea name="名称" cols="宽度" rows="高度"></textarea> name:元素名称 cols:宽度,是指多少个字符宽 rows:高度,指行高 各种按钮 提交按钮:<input type="submit" name="提交表单" /> 重置按钮:<input type="reset" name="重新填写" /> 图片按钮:<input type="image" src="路径" />//功能就是提交表单,与submit按钮功能一样 普通按钮:<input type="botton" onclick="javascript:window.close()" value="关闭窗口" /> 隐藏域:<input type="hidden" name="名称" value="默认值" /> 长传文件域<input type="file" 属性="属性"> name:表单元素的名称 value:表单元素的值,这个值其实就是上传的文件名 <caption>表格标题 <caption>标记是<table>的子标记,<caption>放在<table>开始标记之后 图片热点(图像地图) 标记结构 <img src="图片地址" usemap="#map" /> <map id="map" name="map"> <area shape="热区形状" coords="热区坐标" href="链接地址" /> <area shape="热区形状" coords="热区坐标" href="链接地址" /> <area shape="热区形状" coords="热区坐标" href="链接地址" /> </map> <area>标记常用的属性 shape:热去的形状,取值:rect(矩形),circle(圆形),polygon(多边形) coords:执区的坐标(位置) 如果shape=rect时,那么,coords="x1,y1,x2,y2",例如:coords="50,50,200,150" (x1,y1)为矩形左上角的坐标值,(x2,y2)为矩形右下角的坐标值 如果shape=circle时,那么,soords="x,y,r",其中(x,y)为圆心坐标,r为半径 <frameset>属性 cols:划分左右型框架 cols = “200,*” //左框架的宽度为200px,剩下的都是右框架的 cols = “180,*,180” //左框架和右框架的宽分别为180px,剩下都是中间框架 cols = “20%,*” //划分框架时,可以用百分比来表示 rows:划分上下行框架 rows = “200,*” //上框架的高度为200px,剩下都是下框架的 rows = “180,*,180” //上框架和下框架高分别为180px,剩下都是中间框架 注意:cols属性和rows属性,每个框架只能用其中一个,不能两个同时用。 frameborder:是否显示框架的边框线,取值:1或0,yes或no border:边框线的粗细 bordercolor:边框颜色 <frame>框架页的属性 src:该小窗口中,默认显示的网页地址 noresize:不能调整小窗口的大小,如:noresize="noresize" scrolling:是否显示滚动条,取值:auto,yes,no name:给当前小窗口起个名字,这个name就是给<a>标记target属性来用的 <noframes>:IE6不支持框架,高版本都支持。 <noframes>对不起,你的电脑太老了,该砸了,换新的!</noframes> 内嵌框架(行内框架,浮动框架):<iframe 属性 = “值”>对不起,你的浏览器版本太低!</iframe> 内嵌框架,相当于在现有的网页中,挖了一个“窟窿”,透过这个“窟窿”可以看见里面内容。 与普通框架的区别:<iframe>是<body>的子标记,因此,它应该放在<body> src:引入文件地址 width:框架的宽度 height:框架的高度 frameborder:是否显示框架的边框线,取值:yes或no scrolling:是否显示滚动条,取值:auto,yes,no name:指定当前小窗口的名称,该名称也是给<a>标记的target属性来用 align:框架在网页中的对齐方式,取值:left,center,right 注意:src引入的文件只能是html文件或php文件,不能是其它文件。 在placeholder里面进行换行 例如:<textarea placeholder="有限公司 服务中心" class="layui-textarea" name="one"></textarea>
2022年06月17日
162 阅读
0 评论
0 点赞
2022-06-17
【PHP】TP5.1框架获取服务器信息
//获取服务器相关信息 $info = [ '操作系统'=>PHP_OS, '运行环境'=>$_SERVER["SERVER_SOFTWARE"], 'PHP运行方式'=>php_sapi_name(), 'ThinkPHP版本'=> 'V'. \think\facade\App::version(), '上传附件限制'=>ini_get('upload_max_filesize'), '执行时间限制'=>ini_get('max_execution_time').'秒', '服务器时间'=>date("Y年n月j日 H:i:s"), '北京时间'=>gmdate("Y年n月j日 H:i:s",time()+8*3600), '服务器所处时区' => date_default_timezone_get(), '服务器域名/IP'=>$_SERVER['SERVER_NAME'].' [ '.gethostbyname($_SERVER['SERVER_NAME']).' ]', '剩余空间'=>round((disk_free_space(".")/(1024*1024)),2).'M', 'register_globals'=>get_cfg_var("register_globals")=="1" ? "ON" : "OFF", 'magic_quotes_gpc'=>(1===get_magic_quotes_gpc())?'YES':'NO', 'magic_quotes_runtime'=>(1===get_magic_quotes_runtime())?'YES':'NO' ]; /** * 获取当前的运行环境 * @return string */ function getHuanjing(){ switch (PHP_SAPI){ case 'fpm-fcgi': return 'nginx+php-fpm'; break; case 'cgi-fcgi': return 'nginx+fastcgi'; break; case 'apache2handler': return 'apache'; break; default: return PHP_SAPI; } } /** * 获取数据库版本 */ function dbVersion(){ $db = think\Db::query('select VERSION()'); return $db[0]['VERSION()']; } /** * 获取最大上传文件大小 */ function get_upload_max_filesize(){ return ini_get('upload_max_filesize'); }
2022年06月17日
197 阅读
1 评论
0 点赞
2022-06-17
【MySQL】MySQL索引失效的几个情况
索引查询失效的几个情况:1、like 以%开头,索引无效;当like前缀没有%,后缀有%时,索引有效。2、or语句前后没有同时使用索引。当or左右查询字段只有一个是索引,该索引失效,只有当or左右查询字段均为索引时,才会生效3、组合索引,不是使用第一列索引,索引失效。4、数据类型出现隐式转化。如varchar不加单引号的话可能会自动转换为int型,使索引无效,产生全表扫描。5、在索引列上使用 IS NULL 或 IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可。(此处是错误的!)在索引列上使用 IS NULL 或 IS NOT NULL操作,索引不一定失效!!!6、在索引字段上使用not,<>,!=。不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 优化方法: key<>0 改为 key>0 or key<0。7、对索引字段进行计算操作、字段上使用函数。(索引为 emp(ename,empno,sal))8、当全表扫描速度比索引速度快时,mysql会使用全表扫描,此时索引失效。索引失效分析工具:可以使用explain命令加在要分析的sql语句前面,在执行结果中查看key这一列的值,如果为NULL,说明没有使用索引。
2022年06月17日
147 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP实现阿拉伯数字转化为大写汉字
class Num2Cny{ static $basical = array(0 => "零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖"); static $advanced = array(1 => "拾", "佰", "仟"); public static function ParseNumber($number){ $number = trim($number); if ($number > 999999999999) return "数字太大,无法处理。抱歉!"; if ($number == 0) return "零"; if (strpos($number, '.')) { $number = round($number, 2); $data = explode(".", $number); $data[0] = self::int($data[0]); $data[1] = self::dec($data[1]); return $data[0] . $data[1]; } else { return self::int($number) . '整'; } } public static function int($number){ $arr = array_reverse(str_split($number)); $data = ''; $zero = false; $zero_num = 0; foreach ($arr as $k => $v) { $_chinese = ''; $zero = ($v == 0) ? true : false; $x = $k % 4; if ($x && $zero && $zero_num > 1) continue; switch ($x) { case 0: if ($zero) { $zero_num = 0; } else { $_chinese = self::$basical[$v]; $zero_num = 1; } if ($k == 8) { $_chinese .= '亿'; } elseif ($k == 4) { $_chinese .= '万'; } break; default: if ($zero) { if ($zero_num == 1) { $_chinese = self::$basical[$v]; $zero_num++; } } else { $_chinese = self::$basical[$v]; $_chinese .= self::$advanced[$x]; } } $data = $_chinese . $data; } return $data . '元'; } public static function dec($number){ if (strlen($number) < 2) $number .= '0'; $arr = array_reverse(str_split($number)); $data = ''; $zero_num = false; foreach ($arr as $k => $v) { $zero = ($v == 0) ? true : false; $_chinese = ''; if ($k == 0) { if (!$zero) { $_chinese = self::$basical[$v]; $_chinese .= '分'; $zero_num = true; } } else { if ($zero) { if ($zero_num) { $_chinese = self::$basical[$v]; } } else { $_chinese = self::$basical[$v]; $_chinese .= '角'; } } $data = $_chinese . $data; } return $data; } } 使用方法 Num2Cny::ParseNumber($number); 注意:命名空间,访问方法,接受的$number数据验证
2022年06月17日
140 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP实现表格转换成数组
/** * @Author:小破孩 * @Time:2020/07/20 11:42 * @param $table 表格html代码 * @return mixed * @Description: 表格转数组 */ function tableArr($table){ $table = preg_replace("'<table[^>]*?>'si", "", $table); $table = preg_replace("'<tr[^>]*?>'si", "", $table); $table = preg_replace("'<td[^>]*?>'si", "", $table); $table = str_replace("</tr>", "{tr}", $table); $table = str_replace("</td>", "{td}", $table); //去掉 HTML 标记 $table = preg_replace("'<[/!]*?[^<>]*?>'si", "", $table); //去掉空白字符 $table = preg_replace("'([rn])[s]+'", "", $table); $table = preg_replace('/ /', "", $table); $table = str_replace(" ", "", $table); $table = str_replace(" ", "", $table); $table = explode('{tr}', $table); array_pop($table); foreach ($table as $key => $tr) { $td = explode('{td}', $tr); array_pop($td); $td_array[] = $td; } return $td_array; }
2022年06月17日
176 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP常见header头
//200 正常状态 header('HTTP/1.1 200 OK'); // 301 永久重定向,记得在后面要加重定向地址 Location:$url header('HTTP/1.1 301 Moved Permanently'); // 重定向,其实就是302 暂时重定向 header('Location: http://www.maiyoule.com/'); // 设置页面304 没有修改 header('HTTP/1.1 304 Not Modified'); // 显示登录框, header('HTTP/1.1 401 Unauthorized'); header('WWW-Authenticate: Basic realm="登录信息"'); echo '显示的信息!'; // 403 禁止访问 header('HTTP/1.1 403 Forbidden'); // 404 错误 header('HTTP/1.1 404 Not Found'); // 500 服务器错误 header('HTTP/1.1 500 Internal Server Error'); // 3秒后重定向指定地址(也就是刷新到新页面与 <meta http-equiv="refresh" content="10;http://www.maiyoule.com/ /> 相同) header('Refresh: 3; url=http://www.maiyoule.com/'); echo '10后跳转到http://www.maiyoule.com'; // 重写 X-Powered-By 值 header('X-Powered-By: PHP/5.3.0'); header('X-Powered-By: Brain/0.6b'); //设置上下文语言 header('Content-language: en'); // 设置页面最后修改时间(多用于防缓存) $time = time() - 60; //建议使用filetime函数来设置页面缓存时间 header('Last-Modified: '.gmdate('D, d M Y H:i:s', $time).' GMT'); // 设置内容长度 header('Content-Length: 39344'); // 设置头文件类型,可以用于流文件或者文件下载 header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="example.zip"'); header('Content-Transfer-Encoding: binary'); readfile('example.zip');//读取文件到客户端 //禁用页面缓存 header('Cache-Control: no-cache, no-store, max-age=0, must-revalidate'); header('Expires: Mon, 26 Jul 1997 05:00:00 GMT'); header('Pragma: no-cache'); //设置页面头信息 header('Content-Type: text/html; charset=iso-8859-1'); header('Content-Type: text/html; charset=utf-8'); header('Content-Type: text/plain'); header('Content-Type: image/jpeg'); header('Content-Type: application/zip'); header('Content-Type: application/pdf'); header('Content-Type: audio/mpeg'); header('Content-Type: application/x-shockwave-flash'); //.... 至于Content-Type 的值 可以去查查 w3c 的文档库,那里很丰富
2022年06月17日
132 阅读
0 评论
0 点赞
2022-06-17
【PHP】PHP实现加密和解密
/** * @Author:小破孩 * @Time: 2020/7/21 16:51 * @param $txt 加密的文本 * @param string $key * @return string * @Description:加密 */ function lock_url($txt,$key='abcd'){ $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $nh = rand(0,64); $ch = $chars[$nh]; $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = base64_encode($txt); $tmp = ''; $i=0;$j=0;$k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64; $tmp .= $chars[$j]; } return urlencode($ch.$tmp); } /** * @Author:小破孩 * @Time: 2020/7/21 16:51 * @param $txt 解密的文本 * @param string $key * @return false|string * @Description:解密 */ function unlock_url($txt,$key='abcd'){ $txt = urldecode($txt); $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $ch = $txt[0]; $nh = strpos($chars,$ch); $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = substr($txt,1); $tmp = ''; $i=0;$j=0; $k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]); while ($j<0) $j+=64; $tmp .= $chars[$j]; } return base64_decode($tmp); } 更新/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/3/26 17:59 * @param string $key * @param $string * @return string * @Description:加密 */ public function encryption($txt,$key='sflksdfpds456f4s4f9sd4fsd54fs9847d4ds4sd4fs'){ $txt = $txt.$key; $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $nh = rand(0,64); $ch = $chars[$nh]; $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = base64_encode($txt); $tmp = ''; $i=0;$j=0;$k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = ($nh+strpos($chars,$txt[$i])+ord($mdKey[$k++]))%64; $tmp .= $chars[$j]; } return urlencode(base64_encode($ch.$tmp)); } /** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/3/26 17:59 * @param string $key * @param $string * @return string * @Description:解密 */ public function decryption($txt,$key='sflksdfpds456f4s4f9sd4fsd54fs9847d4ds4sd4fs'){ $txt = base64_decode(urldecode($txt)); $chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-=+"; $ch = $txt[0]; $nh = strpos($chars,$ch); $mdKey = md5($key.$ch); $mdKey = substr($mdKey,$nh%8, $nh%8+7); $txt = substr($txt,1); $tmp = ''; $i=0;$j=0; $k = 0; for ($i=0; $i<strlen($txt); $i++) { $k = $k == strlen($mdKey) ? 0 : $k; $j = strpos($chars,$txt[$i])-$nh - ord($mdKey[$k++]); while ($j<0) $j+=64; $tmp .= $chars[$j]; } return trim(base64_decode($tmp),$key); } 更新/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/3/29 10:10 * @param $string * @param string $operation * @param string $key * @return false|string|string[] * @Description:函数encrypt($string,$operation,$key)中$string:需要加密解密的字符串;$operation:判断是加密还是解密,E表示加密,D表示解密;$key:密匙。 */ public function encryption($string,$operation = 'E',$key='sflksdfpds456f4s4f9sd4fsd54fs9847d4ds4sd4fs'){ $key=md5($key); $key_length=strlen($key); $string=$operation=='D'?base64_decode($string):substr(md5($string.$key),0,8).$string; $string_length=strlen($string); $rndkey=$box=array(); $result=''; for($i=0;$i<=255;$i++){ $rndkey[$i]=ord($key[$i%$key_length]); $box[$i]=$i; } for($j=$i=0;$i<256;$i++){ $j=($j+$box[$i]+$rndkey[$i])%256; $tmp=$box[$i]; $box[$i]=$box[$j]; $box[$j]=$tmp; } for($a=$j=$i=0;$i<$string_length;$i++){ $a=($a+1)%256; $j=($j+$box[$a])%256; $tmp=$box[$a]; $box[$a]=$box[$j]; $box[$j]=$tmp; $result.=chr(ord($string[$i])^($box[($box[$a]+$box[$j])%256])); } if($operation=='D'){ if(substr($result,0,8)==substr(md5(substr($result,8).$key),0,8)){ return substr($result,8); }else{ return''; } }else{ return str_replace('=','',base64_encode($result)); } } 更新/** * @Author: 小破孩嫩 * @Email: 3584685883@qq.com * @Time: 2021/3/29 10:11 * @param $string 字符串,明文或密文; * @param string $operation DECODE表示解密,其它表示加密; * @param string $key 密匙; * @param int $expiry 密文有效期 * @return false|string * @Description:非常给力的authcode加密函数,Discuz!经典代码(带详解) */ public function encryption($string, $operation = 'DECODE', $key = 'sflksdfpds456f4s4f9sd4fsd54fs9847d4ds4sd4fs', $expiry = 0) { // 动态密匙长度,相同的明文会生成不同密文就是依靠动态密匙 $ckey_length = 4; // 密匙 $key = md5($key ? $key : $GLOBALS['discuz_auth_key']); // 密匙a会参与加解密 $keya = md5(substr($key, 0, 16)); // 密匙b会用来做数据完整性验证 $keyb = md5(substr($key, 16, 16)); // 密匙c用于变化生成的密文 $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : ''; // 参与运算的密匙 $cryptkey = $keya.md5($keya.$keyc); $key_length = strlen($cryptkey); // 明文,前10位用来保存时间戳,解密时验证数据有效性,10到26位用来保存$keyb(密匙b), //解密时会通过这个密匙验证数据完整性 // 如果是解码的话,会从第$ckey_length位开始,因为密文前$ckey_length位保存 动态密匙,以保证解密正确 $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string; $string_length = strlen($string); $result = ''; $box = range(0, 255); $rndkey = array(); // 产生密匙簿 for($i = 0; $i <= 255; $i++) { $rndkey[$i] = ord($cryptkey[$i % $key_length]); } // 用固定的算法,打乱密匙簿,增加随机性,好像很复杂,实际上对并不会增加密文的强度 for($j = $i = 0; $i < 256; $i++) { $j = ($j + $box[$i] + $rndkey[$i]) % 256; $tmp = $box[$i]; $box[$i] = $box[$j]; $box[$j] = $tmp; } // 核心加解密部分 for($a = $j = $i = 0; $i < $string_length; $i++) { $a = ($a + 1) % 256; $j = ($j + $box[$a]) % 256; $tmp = $box[$a]; $box[$a] = $box[$j]; $box[$j] = $tmp; // 从密匙簿得出密匙进行异或,再转成字符 $result .= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256])); } if($operation == 'DECODE') { // 验证数据有效性,请看未加密明文的格式 if((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) { return substr($result, 26); } else { return ''; } } else { // 把动态密匙保存在密文里,这也是为什么同样的明文,生产不同密文后能解密的原因 // 因为加密后的密文可能是一些特殊字符,复制过程可能会丢失,所以用base64编码 return $keyc.str_replace('=', '', base64_encode($result)); } }
2022年06月17日
124 阅读
0 评论
0 点赞
1
...
9
10
11