前言:通常情况下我们会在wamp或者是wnmp环境下进行开发然后项目会放到l线上lamp或者lnmp的环境中运行,由于基础环境的差异可能导致同一套代码出现不同的运行结果,乱码甚至是报错,本篇文章对笔者所遇到的情况进行说明并给出相应的解决方案。
一、php
1、Parse error: syntax error, unexpected end of file in xxxxxxxx on line xx
如果发现php的语法本身没有什么错误。就有可能是使用了短标签,例如:
这种问题的解决方案是:可以在php.ini中设置
设置后要重启nginx/apache服务器
关于short_open_tag :
决定是否允许使用代码开始标志的缩写形式(<? ?> )。如果要和 XML 结合使用 PHP,可以禁用此选项以便于嵌入使用<?xml ?> 。否则还可以通过php来输出,例如:<?php echo '<?xml version="1.0"'; ?> 。如果禁用了,必须使用 PHP 代码开始标志的完整形式(<?php ?> )。
注意:本指令也会影响到缩写形式 <?= ,它和 <? echo 等价。使用此缩写需要short_open_tag 的值为 On。
2、数据库的bit类型查询出来为□,无法识别,但是能插入或者修改.
方法一:查询时把字段转为十进制(如果使用bit类型的字段不多,可以使用此方法)
方法二:php安装mysqld扩展(数据库中bit类型的字段多的情况下可以使用此方法)
安装方法如下:
首先查看当前的PHP版本
可以看到我的php版本是php5.6.40
如果你的安装方式是:
那么你的扩展安装方式:
如果你是指定版本安装的话
那么你的扩展安装方式:
备注一下:在解决掉这个问题之前笔者也用了很多方法,调整数据库字符集,修改数据库配置文件,使mysql_connect链接字符集时UTF-8,这些都没用
二、MySQL
1、在本地时数据可以成功插入数据,但是上传到服务器就会报错;
举个栗子:
1)SQLSTATE[HY000]: General error: 1364 Field 'name' doesn't have a default value 2) error: Incorrect integer value: '' for column 'cityarea_id' at row 1 3)data too long for column at row
类似于以上报错都可以通过修改数据库配置文件my.ini(若文件不存在,则修改my.cnf)来解决 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES 修改为 sql_mode=NO_ENGINE_SUBSTITUTION
那么为什么要删掉STRICT_TRANS_TABLES
因为STRICT_TRANS_TABLES的意思是存储引擎启用严格模式,非法数据值被拒绝。
三、Apache
1、利用Nginx代理Apache做简易分布式的项目中,nginx做了ssl认证,php的系统变量$_SERVER中$_SERVER['HTTPS']为空
首先,这种情况是正常的,因为你的php服务是通过Apache去承载的,但Apache确实没有ssl证书,那么怎么解决呢?如下:
2、php项目中隐藏.php后缀访问
举个栗子:程序访问路径为demo.mrcg.com/test.php
想要设置为demo.mrcg.com/test直接可以访问
方法一:apache环境下在项目根目录创建.htaccess
重要的的是 ‘RewriteRule ^test$ test.php’
本行代码是利用apache的重写规则,意思是当访问test时会重写至当前目录下的test.php,当然也可以是其他目录:
此方法不是很方便,尤其是你要有多个文件隐藏后缀时,必须一个一个的写,所以我推荐下一种
方法二:利用apache的MultiViews参数
在你的apache项目配置中添加MultiViews参数,如下:
使用MultiViews参数后如果服务器接收了一个对/MyProjects/dir/foo的请求,/MyProjects目录启用了MultiViews,但/MyProjects/dir/foo不存在,则服务器会查找这个目录下所有的 foo.* 文件,并理所当然地为这些文件伪造一个类型映射表,分配给他们相同的媒体类型和内容的编码,用户请求一个文档时,类型映射表会选择其中最符合客户请求的文档,返回给客户。