分类 PHP 下的文章

源起:

WordPress http 升级成 https 之后,只有 首页可以正常访问,其他链接均失效,改固定链接为 ?p=id可以正常显示,但是以前的 Google 收录页面面临失效的风险。遂着手解决。

发现解决方案,修改 nginx.conf 配置

location / {
            #如果文件不存在则尝试重定向解析
            try_files  $uri $uri/ /index.php?q=$uri&$args
}

探求原理

try_files指令说明

try_files指令
语法:try_files file ... uri 或 try_files file ... = code
默认值:无
作用域:server location

nginx 在0.7以后的版本中加入了一个 try_files 指令,配合命名 location,可以部分替代原本常用的 rewrite 配置方式,提高解析效率。
其作用是按顺序检查文件是否存在,返回第一个找到的文件或文件夹(结尾加斜线表示为文件夹),如果所有的文件或文件夹都找不到,会进行一个内部重定向到最后一个参数。
参考文章 https://www.hi-linux.com/posts/53878.html

LNMP 跨目录访问权限设置

在 ThinkPHP Laravel Typecho 等框架中网站目录一般是在public下,但是public下的程序要跨目录调用public上级目录下的文件,因为LNMP默认是不允许跨目录访问的,所以都是必须要将防跨目录访问的设置去掉,有时候这些框架类的程序提示500错误也可能是这个问题引起的。
那么这个问题怎么解决呢?
1.2,1.3,1.4,1.5及以上版本,修改对应虚拟主机的配置文件(/usr/local/nginx/conf/vhost/域名.conf)
将include enable-php.conf;替换为include enable-php-pathinfo.conf;
lnmp v1.1上,修改对应虚拟主机的配置文件(/usr/local/nginx/conf/vhost/域名.conf)
去掉#include pathinfo.conf前面的#,把try_files $uri =404; 前面加上# 注释掉。

<h4>为什么PHP中的变量前边要加'$'符号</h4>
一直都特别好奇 PHP 中的变量前边都加 $ 符号。别的大众编程语言从没见过这种设定,比如:java,c#,c,c++,go,Ruby,python 甚至连写法被吐槽最多的 Objective-c 都没有。那么这种设定是怎么来的?为什么要这样做呢。
OK,我的第一篇 IT考古文章就来研究探寻一下这个问题。
下面是我人肉过滤掉噪音信息后得到的回答:

历史问题,unix那时候就存在了,SHELL,PERL。。。等脚本语言都是那样定义变量的,主要是区分字符和变量。例如 echo test就是字符"test",echo $test就是输出变量的值。——by umbrella1984
1、加一个$可以使解释程序大为简化,从而提高运行速度
2、php出世的时候perl已经比较流行了,所以加一个$可以吸引众多的perl程序员转向
——by xuzuning
加了$,又可以多使用一些单词做为变量名,不受保留字的影响,变量命名更自由,并且解释器在文本中只要搜索到'$'就可以判断其为变量了。而不用像其他编译型语言那样,总是查找已定义的变量表来判断变量。
不过你说的那个在编辑器中变量名文本拷贝的问题确实挺麻烦,双击一个单词后,它是不会将'$'选中的。还是要手动筛选
——by Metal Lovers

最后奉上一种貌似靠谱,但是最扯最迷惑人的解释

网友1:
!     表示“非”被用到判断中了if(!isset...)
@   被用到防止SQL输出错误信息了
#    常用的注释符号,UNIX系统下#有它的重大意思
%   被用作SQL模糊匹配和ASP程序
^     被用作正则中了
&    就更不用说了,被表示成and($a &amp;&amp; $b)
     这个符号更不能用了,还记得SQL语句中的SELECT  吗?
()   也是不合理的,要不然你得判断语句还怎么写
-+ 这属于运算符号,也不能用
';   之类的就更别提了。。。
你看看,PHP除了用$符号还有什么好的选择?
——by https://blog.csdn.net/ITofwanyifei/article/details/40450553

<h4>PHP的产生历史</h4>
PHP 最初是1994年Rasmus Lerdorf创建的,刚刚开始只是一个简单的用Perl语言编写的程序,用来统计他自己网站的访问者。后来又用C语言重新编写,包括可以访问数据库。在1995年以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程序的文档,并且发布了PHP1.0。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能。以后越来越多的网站使用了PHP,并且强烈要且增加一些特性,比如循环语句和数组变量等等,在新的成员加入开发行列之后,在1995年中,PHP2.0发布了。第二版定名为PHP/FI(Form Interpreter)。PHP/FI加入了对mSQL的支持,从此建立了PHP在动态网页开发上的地位。
注意 这里明确指出,PHP最开始是用 Perl 编写的程序。这就是 PHP 天生的基因。而 Perl 语言里面的变量就是用 $ 表明的。
参考PHP的历史
<h4>所以总结</h4>
PHP 是由 Perl 进化而来的。而那个年代,所有的 类Unix 脚本语言都是前边添加$这样定义变量的,为的是区分字符和变量。
至于后边的便于解释器优化,容易使程序员一眼看到那些是变量,变量起名更自由,等等解释。都是以后的事儿了。大家做阅读理解嘛,请解释一下作者写这段话的心理活动,类似这种的。



title: PHP工程总结

date: 2018-07-02

PHP工程总结

  1. 使用session需要调用session_start()手动开启环境,session_start()调用之前页面不允许输出任何内容,包括空格
  2. sql语句 执行exec(),查询使用query()
  3. order不能作为表名称,这是关键字
  4. 获取最后一条插入数据 id使用PHP内置的方法调用: $db->lastInsertRowID();插入一条数据后获取此条数据id。
  5. $\sum_{i=1}^{n}\sqrt{i+\sin(i)}$
  6. include 和 require 除了处理错误的方式不同之外,在其他方面都是相同的:
    • require 生成一个致命错误(E_COMPILE_ERROR),在错误发生后脚本会停止执行。
    • include 生成一个警告(E_WARNING),在错误发生后脚本会继续执行。
  7. 改updateRow(tablename, id, key-values )
单表查询:
select * from A where to_days(A.create_time)=to_days('2018-10-09')
两表联查:
select * from A inner join user on A.uid=B.uid where to_days(A.create_time)=to_days('2018-10-09')
三表联查:
select * from ((A left join B on A.orderId = B.id) left join C  on B.uid=C.uid)  where to_days(A.create_time)=to_days('2018-10-09')
三生万物,只有推到3,才能找到规律,推及万物
  1. 遇到问题: unable to open database file ,
    原因为:当前文件夹的文件权限,需要为可读可写.
    原理为:当sqlite进行写操作时,会先 生成缓存文件,然后对缓存文件进行操作,而缓存文件的默认权限为当前文件夹的权限。
    
  2. sqlite 中 inner outer 的区别:inner是两个表的交集,outer是一个表+另一个表不够补null的并集

  3. array 插入
 // 第一种方式
        $childArr[$i]['name'] = $name;
        $childArr[$i]['number'] = $number;
        $childArr[$i]['unit'] = $unit;
        // 第二种方式
//        $childArr[] = $subArrItem;
        // 第三种方式,差评!
        //竟然需要两个参数, 不直观
//        array_push($childArr,$subArrItem);
  1. 空值判断
empty
如果 变量 是非空或非零的值,则 empty() 返回 FALSE。
换句话说,""、0、"0"、NULL、FALSE、array()、var $var、未定义; 以及没有任何属性的对象都将被认为是空的,如果 var 为空,则返回 TRUE。
isset
如果 变量 存在(非NULL)则返回 TRUE,否则返回 FALSE(包括未定义)。
变量值设置为:null,返回也是false;unset一个变量后,变量被取消了。注意,isset对于NULL值变量,特殊处理。
is_null
检测传入值【值,变量,表达式】是否是null,只有一个变量定义了,且它的值是null,它才返回TRUE . 其它都返回 FALSE 【未定义变量传入后会出错!】.
参考: www.cnblogs.com/chengmo/archive/2010/10/18/1854258.html
  1. 数据库
数据类型
blob 二进制大数据块
real 4字节浮点数->类float
binary 指定字节长度的二进制数据
timestamp 时间戳,MySQL自动添加当前时间
参考http://dcx.sap.com/1201/zh/dbreference/dtnu.html
  1. MySQL中的timestamp数据类型不能直接用PHP时间和日期函数读取,先用strtotime函数将字符串转换成时间
    $birthday = $ROW['user_birthday'];
    $birthday = strtotime($birthday);
    $birthday  = date('n月j日',$birthday);
    echo $birthday/r/n;        //输出如“12月5日”的日期格式
    date formate时间格式化: http://php.net/manual/zh/function.date.php
  1. phpstrom破解
目前遇到的最好的PHP开发IDE:集成数据库,编程规范检查警告(包括PHP,HTML,SQL,数据库配置)
若资金允许,请点击https://www.jetbrains.com/idea/buy/购买正版,谢谢合作
学生凭学生证可免费申请正版授权 | 创业公司可5折购买正版授权
若资金不足,请尽量给予工具作者捐赠,支持作者&以后还可以获得帮助。
使用工具来源:http://idea.lanyus.com/
1. 下载工具
2. 修改配置文件
3. 移动破解工具到指定目录下
4. 运行软件,弹出软件注册激活激活窗口,Enterkey->Activate license with->Activation code:随意输入激活码文本内容->OK
2) phpstrom的配置文件为 /Application/PhpStorm.app/Contents/bin/phpstorm.vmoptions,
修改这里添加破解包路径:
-javaagent:/Applications/PhpStorm.app/Contents/bin/JetbrainsCrack.jar
3) 下载的破解工具JetbrainsCrack添加到上面配置的路径下
tips: 破解版本请不要轻易升级,以免升级使用后软件破解失效。
  1. 集合数据不能使用数字作为key,会直接赋值到对应的数组下标中,不会作为字典处理。
  2. ajax使用标签button请求,不能使用a标签,会造成事件冲突。
  3. phpstrom使用
    alt+enter 为拼写检查添加忽略单词,需要光标放在单词位置
  4. MySQL联合查询语法(内联、左联、右联、全联)
T1表结构(用户名,密码)   userid   username password
                    1   jack   jackpwd
                    2   owen   owenpwd
T2表结构(积分,等级)   userid   jifen    dengji
                    1   20   3
                    3   50   6
1. 内联(inner  join):取T1,T2的交集
SQL语句:select * from T1 inner join T2 on T1.userid=T2.userid
运行结果   T1.userid   username   password   T2.userid   jifen   dengji
        1   jack   jackpwd   1   20   3
2. 左联(left outer join):以T1为参考表,取T1,T2的并集,T2数据不足补null
SQL语句:select * from T1 left outer join T2 on T1.userid=T2.userid
运行结果   T1.userid   username   password   T2.userid   jifen   dengji
        1   jack   jackpwd   1   20   3
        2   owen   owenpwd   NULL   NULL   NULL
3. 右联(right outer join):以T2为参考表,取T1,T2的并集,T1数据不足补null
SQL语句:select * from T1 right outer join T2 on T1.userid=T2.userid
运行结果   T1.userid   username   password   T2.userid   jifen   dengji
        1   jack   jackpwd   1   20   3
        NULL   NULL   NULL   3   50   6
4. 全联(full outer join):取T1,T2的并集,凡是数据不足的都补null
SQL语句:select * from T1 full outer join T2 on T1.userid=T2.userid
运行结果   T1.userid   username   password   T2.userid   jifen   dengji
        1   jack   jackpwd   1   20   3
        2   owen   owenpwd   NULL   NULL   NULL
        NULL   NULL   NULL   3   50   6



title: php session 不能跨页面传递
categories: PHP

tags: PHP

session错误

  1. 确认当前页面session有没有添加成功
  2. debug可不可以讲session值跨页面传递
  3. 设置php.ini文件session.auto_start=1,此时use_cookies=0,use_only_cookies=0

验证:
php -i 查看PHP配置
php.ini phpinfo()对比配置文件和实际环境配置