ホームページ  >  記事  >  バックエンド開発  >  PHPバイナリストリームが文字化けを出力する場合の対処方法

PHPバイナリストリームが文字化けを出力する場合の対処方法

藏色散人
藏色散人オリジナル
2022-10-21 09:37:141931ブラウズ

php バイナリ ストリームの出力が文字化けする場合の解決策: 1. ローカルの「conn.php」ファイルと「print.php」ファイルを開きます; 2. 「ob_clean」を使用してヘッダーの内容をクリアし、コードを変更します「mysql_close(); ob_clean();header("Content-type:$type");」など。

PHPバイナリストリームが文字化けを出力する場合の対処方法

このチュートリアルの動作環境: Windows 7 システム、PHP バージョン 8.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;
?>

上記の方法で問題ありません。ただし、データベース接続を別のファイルにカプセル化すると、問題が発生します。上記のコードを 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(&#39;conn.php&#39;);
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 がこのステートメントを呼び出すと、ヘッダーに出力され、次の 2 つのヘッダー ステートメントに影響を及ぼし、Word ファイルのデータ フローが破壊されます。そのため、開いたワードファイルが文字化けしてしまいます。

解決策は、ob_clean を使用してヘッダーの内容をクリアすることです。書き換えられた print.php は次のとおりです

//print.php
<?php
if(!isset($id) or $id=="") die("error: id none");
//定位记录,读出
require_once(&#39;conn.php&#39;);
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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。