php二元流輸出亂碼的解決方法:1、開啟本機「conn.php」和「print.php」檔案;2、用「ob_clean」清空header內容,修改程式碼如「mysql_close(); ob_clean();header("Content-type:$type");」。
本教學操作環境:windows7系統、PHP8.1版、Dell G3電腦。
php 二進位流輸出亂碼怎麼辦?
最近在用php開發從mysql讀取並輸出二進位文件,遇到了亂碼問題。
一般輸出二進位檔案是用下面的方法:
<?php if(!isset($id) or $id=="") die("error: id none"); //定位记录,读出 $conn=mysql_connect("127.0.0.1","***","***"); if(!$conn) die("error : mysql connect failed"); mysql_select_db("test",$conn); $sql = "select * from receive where id=$id"; $result = mysql_query($sql); $num=mysql_num_rows($result); if($num<1) die("error: no this recorder"); $data = mysql_result($result,0,"file_data"); $type = mysql_result($result,0,"file_type"); $name = mysql_result($result,0,"file_name"); mysql_close($conn); //先输出相应的文件头,并且恢复原来的文件名 header("Content-type:$type"); header("Content-Disposition: attachment; filename=$name"); echo $data; ?>
用上面的方法是沒有問題的。但如果把database 連線封裝在一個單獨的檔案中,就有問題了。改寫上面的程式碼為2個檔案:
//conn.php <?php function Open_DB(){ $conn=mysql_connect("127.0.0.1","***","***"); if(!$conn) die("error : mysql connect failed"); mysql_select_db("test",$conn); } ?>
//print.php <?php if(!isset($id) or $id=="") die("error: id none"); //定位记录,读出 require_once('conn.php'); Open_DB(); $sql = "select * from receive where id=$id"; $result = mysql_query($sql); $num=mysql_num_rows($result); if($num<1) die("error: no this recorder"); $data = mysql_result($result,0,"file_data"); $type = mysql_result($result,0,"file_type"); $name = mysql_result($result,0,"file_name"); mysql_close(); header("Content-type:$type"); header("Content-Disposition: attachment; filename=$name"); echo $data; ?>
這時候呼叫print.php開啟word檔案時會產生亂碼。問題就出在"require_once('conn.php')"語句。 php在呼叫該語句時會在header中輸出,這影響到了後面的2個header語句,從而破壞了word檔案的資料流。因此打開的word檔案會是亂碼。
解決的方法是用ob_clean清空header內容。改寫的print.php 如下
//print.php <?php if(!isset($id) or $id=="") die("error: id none"); //定位记录,读出 require_once('conn.php'); Open_DB(); $sql = "select * from receive where id=$id"; $result = mysql_query($sql); $num=mysql_num_rows($result); if($num<1) die("error: no this recorder"); $data = mysql_result($result,0,"file_data"); $type = mysql_result($result,0,"file_type"); $name = mysql_result($result,0,"file_name"); mysql_close(); ob_clean(); header("Content-type:$type"); header("Content-Disposition: attachment; filename=$name"); echo $data; ?>
推薦學習:《PHP影片教學》
以上是php 二進位流輸出亂碼怎麼辦的詳細內容。更多資訊請關注PHP中文網其他相關文章!