浏览器的同源策略(Same origin policy),它是一种约定,也是浏览器最核心最基本的安全功能。所谓同源指的是:协议(是指http和https)、域名(domain)、端口(port)相同。
在php后端api入口文件中加入下面的代码即可解决问题:
header("Access-Control-Allow-Origin:*"); header("Access-Control-Allow-Methods:GET, POST, OPTIONS, DELETE"); header("Access-Control-Allow-Headers:DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type, Accept-Language, Origin, Accept-Encoding");
CORS是一个W3C标准,全称是“跨域资源共享”(Cross-origin resource sharing),它允许浏览器向跨源服务器发出XMLHttpRequest请求,从而克服了只能同源调用的限制。
Access-Control-Allow-Origin指的是允许发起跨域的域名。
在浏览器跨域请求中,请求头(request headers)会出现Origin字段(有个奇怪现象,谷歌游览器在非跨域情况下,也会发送origin字段),这个字段会与Access-Control-Allow-Origin字段的内容进项匹配,如果发现符合Access-Control-Allow-Origin字段的要求才会放行通过,否则会出现CORS错误。
但实际上Access-Control-Allow-Origin有很多的设置方式,“*”是最粗暴简单的,但也是最不安全的,它代表着所有请求都允许通过。如果为了服务器安全考虑不建议这么设置,最好还是使用具体的域名地址。而且如果是“*”的话,浏览器将不会发送cookies,即使你的xhr设置了withCredentials,只有在指定域名下才允许发送。
Access-Control-Allow-Methods指的是请求的方式。
Access-Control-Allow-Headers指的是请求的自定义请求头字段。
跨域时浏览器会向服务器发送预检请求,询问是否支持跨域的自定义header字段,这时候就需要设置的Access-Control-Allow-Headers字段进行应答。
例如:把<替换成<>,把>替换成><,不管谁在前都会影响下一次。
let newStr= oldStr.replace(/<|"|=|\/|>/g, str => { let return_str = str; switch (str) { case "<": return_str = `<>`; case ">": return_str = `><`; break; } return return_str; });
mysqladmin --version 验证mysql
mysql -h主机地址 -u用户名 -p 连接mysql
show engines 查看数据库支持的引擎
show variables like '%storage_engine%' 查看当前使用的数据库引擎
MySQL每个数据库都会在data目录下生成一个目录,里面有*.frm、*.myi、*.myd和*.opt文件。
*.frm--表定义,是描述表结构的文件。
*.MYD--"D"数据信息文件,是表的数据文件。
*.MYI--"I"索引信息文件,是表数据文件中任何索引的数据树。
*.opt--记录数据库选项,数据库的字符集。
增:返回添加记录的id,删和修返回影响的条数,查返回查询出来的结果集。
MySQL数据库版本:
5.X:
5.0-5.1:早期产品的延续,升级维护
5.2-5.3:不常用
5.4-5.X:MySQL整合了三方公司的新存储引擎,以前的版本都是mysql自己单干。(现在主要是用5.5和5.7)
连接层:提供与客户端连接的服务
服务层:1.提供各种接口。2.提供SQL优化器:MySQL QUery Optimizer
引擎层:提供了各种存储数据的方式(InnoDB MyISAM)
存储层:存储数据
InnoDb:事务有限,适合高并发操作;行锁
MyISAM:性能优先
json_encode 所有字符串数据的编码必须是 UTF-8,不然返回false
ini_set('session.cookie_lifetime',0);
把安装目录下的composer.phar移动到项目根目录下:
1、找到composer位置的命令:which composer
2、把安装目录下的composer.phar移动到项目根目录下
3、在项目下正常运行安装命令即可
javascript的sessionStorage,在微信关闭时会自动失效,默认设置。这里的关闭不是指彻底关闭微信,而是只要离开页面就会失效!
设置:
sessionStorage.setItem('inviteuid', inviteuid);
获取:
sessionStorage.getItem('inviteuid')
判断是否设置了:
sessionStorage.getItem("inviteuid") != null
if ($a) { } else switch($a) { }
if ($a) { } else do { } while (!$a);
//例如判断数组是否为空后做操作 if (count($array)) { for ($i = 0; $i < count($array); $i++) { } } else { //数组为空的逻辑 } //可以写成 if (count($array) == 0) { //数组为空的逻辑 } else for ($i = 0; $i < count($array); $i++) { }
$a = true; if ($a) { echo “true”; } else label: { echo “false”; } //转化后写法 $a = true; if ($a) { echo "true"; } else { label: ; //单独的一条语句 } echo "false"; //所以运行结果是:truefalse //label不是一个常量可以是任意字符串
unserialize(): Error at offset 0 of 13465 bytes
类似于上面这种报错大多数是因为缓存引起的,建议先彻底清掉缓存试一下,再找其他原因!
var_dump(1...9);//输出10.9
原因:
首先明确一点,var_dump()把1...9识别为了浮点数。
1...9会被依次识别为:1(浮点数1),然后是.(字符串连接符号),然后是.9(浮点数0.9)
function sum(...$numbers) { $acc = 0; foreach ($numbers as $n) { $acc += $n; } return $acc; } echo sum(1, 2, 3, 4);//输出10
function add($a, $b) { return $a + $b; } echo add(...[1, 2]);//输出3 $a = [1, 2]; echo add(...$a);//输出3
PHP 从5.6+开始在用户自定义函数中支持可变数量的参数列表
if (print("1\n") && print("2\n") && print("3\n") && print("4\n")) { ; }//输出:4 111
实际上等同于:
if (print ("1\n" && print ("2\n" && print ("3\n" && print "4\n")))) { ; }
解析:
print并不是一个函数,所以并不要求一定要有小括号(所以即使你写了小括号,括号也会在语法分析阶段被忽略),即:第一个代码块在PHP看来就是第二个代码块的样子。
所以就是:
最先输出4, 然后输出 "3\n" && print的结果1 , 然后输出 "2\n" && 1的结果1, 最后是 "1\n" && 1的结果1。
多数情况直接删除与入口文件同级的user.ini
在Linux系统时,路径中的斜杠必须用(/)而不能用反斜杠(\)否则将识别不到文件。
首先说一下self的限制,使用 self:: 或者 __CLASS__ 对当前类的静态引用,取决于定义当前方法所在的类。
<?php class A { public static function who() { echo __CLASS__; } public static function test() { self::who(); } } class B extends A { public static function who() { echo __CLASS__; } } B::test();//A
以上案例本意是想输出:B,却因为self限制而失败。
后期静态绑定本想通过引入一个新的关键字表示运行时最初调用的类来绕过限制。简单地说,这个关键字能够让你在上述例子中调用 test() 时引用的类是 B 而不是 A。最终决定不引入新的关键字,而是使用已经预留的 static 关键字。
<?php class A { public static function who() { echo __CLASS__; } public static function test() { static::who(); // 后期静态绑定从这里开始 } } class B extends A { public static function who() { echo __CLASS__; } } B::test();//B
在非静态环境下,所调用的类即为该对象实例所属的类。由于 $this-> 会在同一作用范围内尝试调用私有方法,而 static:: 则可能给出不同结果。另一个区别是 static:: 只能用于静态属性。
foo(); static::foo(); } } class B extends A { /* foo() will be copied to B, hence its scope will still be A and * the call be successful */ } class C extends A { private function foo() { /* original method is replaced; the scope of the new one is C */ } } $b = new B(); $b->test(); $c = new C(); $c->test(); //fails
输出结果:
success! success! success! Fatal error: Call to private method C::foo() from context 'A' in /tmp/test.php on line 9
后期静态绑定的解析会一直到取得一个完全解析了的静态调用为止。另一方面,如果静态调用使用 parent:: 或者 self:: 将转发调用信息。
<?php class A { public static function foo() { static::who(); } public static function who() { echo __CLASS__."\n"; } } class B extends A { public static function test() { A::foo(); parent::foo(); self::foo(); } public static function who() { echo __CLASS__."\n"; } } class C extends B { public static function who() { echo __CLASS__."\n"; } } C::test(); //结果: A C C