关于PHP的BOM头
一直用的是wamp的环境,php的版本还停留在5.3.php7都出来了,我连php5.6都还没用一把,很多相对于5.3时代的新函数和特性都还没体验到.但是碍于懒,决定装phpstudy切换到5.6的版本体验一把.
原先的wamp环境下mysql是没有登录密码的,但是phpstudy默认有个密码,所以我需要去我目前的项目框架配置项里改一下数据库的连接密码,心想就是改个密码嘛犯不着开sublime了,直接用记事本给改了.然后打开我的项目,首页出来了,没啥问题,再点登录,哎?验证码咋不出来了?用firebug抓了一下验证码的访问地址,没问题啊.然后去验证码的类文件里关掉了header部分,然后浏览器执行验证码的url,也不报错,只是给出和以往没开header时类似的一堆乱码.这下×××了.
网站登录没验证码,这叫什么.赶紧百度了一下.很激动,发现提这种问题的很多哎~很快就发现了一个显眼的词,BOM头.以前好像也听说过,记得是刚学php的时候,有个视频里面的老师提过,说不推荐大家用dw和记事本写php因为会生成一个BOM头,但当时根本不知道生成这个BOM头会带来什么后果.我用的是一个基于THINKPHP修改过的框架,网上反应这个问题的绝大多数都是在THINK社区,所以我觉得我的问题应该能参照他们的解决方案试一下.经过粗略扫描,发现了一个看起来比较靠谱的答案.这位大牛提供了一份代码.如下:
<?php/*清除bom*/if(isset($_GET['dir'])){$basedir=$_GET['dir'];}else{$basedir='.';}$auto=1;checkdir($basedir);functioncheckdir($basedir){if($dh=opendir($basedir)){while(($file=readdir($dh))!==false){if($file!='.'&&$file!='..'){if(!is_dir($basedir."/".$file)){echo"filename:$basedir/$file".checkBOM("$basedir/$file")."<br>";}else{$dirname=$basedir."/".$file;checkdir($dirname);}}}//endwhileclosedir($dh);}//endif($dh}//endfunctionfunctioncheckBOM($filename){global$auto;$contents=file_get_contents($filename);$charset[1]=substr($contents,0,1);$charset[2]=substr($contents,1,1);$charset[3]=substr($contents,2,1);if(ord($charset[1])==239&&ord($charset[2])==187&&ord($charset[3])==191){if($auto==1){$rest=substr($contents,3);rewrite($filename,$rest);return"<fontcolor=red>BOMfound,automaticallyremoved.</font>";}else{return("<fontcolor=red>BOMfound.</font>");}}elsereturn("BOMNotFound.");}//endfunctionfunctionrewrite($filename,$data){$filenum=fopen($filename,"w");flock($filenum,LOCK_EX);fwrite($filenum,$data);fclose($filenum);}?>
将这段代码保存成一个php文件,放到你的项目根目录中,执行一下,它会自动去除掉你当前目录下所有文件里的BOM头.验证码瞬间就刷出来了.
这里贴一个关于BOM头的科普:解释BOM头和去掉方法
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。