一直用的是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); function checkdir($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); } } }//end while closedir($dh); }//end if($dh }//end function function checkBOM($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 "<font color=red>BOM found, automatically removed.</font>"; }else{ return ("<font color=red>BOM found.</font>"); } } else return ("BOM Not Found."); }//end function function rewrite($filename, $data){ $filenum = fopen($filename, "w"); flock($filenum, LOCK_EX); fwrite($filenum, $data); fclose($filenum); } ?>
將這段代碼保存成一個php文件,放到你的項目根目錄中,執行一下,它會自動去除掉你當前目錄下所有文件里的BOM頭.驗證碼瞬間就刷出來了.
這里貼一個關于BOM頭的科普:解釋BOM頭和去掉方法
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。