Maison  >  Article  >  développement back-end  >  Que faire si le flux binaire php génère des caractères tronqués

Que faire si le flux binaire php génère des caractères tronqués

藏色散人
藏色散人original
2022-10-21 09:37:142008parcourir

Solution à la sortie tronquée du flux binaire PHP : 1. Ouvrez les fichiers locaux "conn.php" et "print.php" ; 2. Utilisez "ob_clean" pour effacer le contenu de l'en-tête et modifiez le code tel que "mysql_close ();ob_clean(); header("Type de contenu :$type");".

Que faire si le flux binaire php génère des caractères tronqués

L'environnement d'exploitation de ce tutoriel : système Windows 7, PHP version 8.1, ordinateur Dell G3.

Que dois-je faire si la sortie du flux binaire de php est tronquée ?

Récemment, j'utilisais PHP pour développer, lire et générer des fichiers binaires à partir de MySQL, et j'ai rencontré un problème avec des caractères tronqués.

Généralement, la méthode suivante est utilisée pour générer des fichiers binaires :

<?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;
?>

Il n'y a aucun problème avec la méthode ci-dessus. Mais si vous encapsulez la connexion à la base de données dans un fichier séparé, des problèmes surviendront. Réécrivez le code ci-dessus en 2 fichiers :

//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;
?>

À ce moment, lors de l'appel de print.php pour ouvrir le fichier Word, des caractères tronqués seront générés. Le problème réside dans l'instruction "require_once('conn.php')". Lorsque PHP appelle cette instruction, elle sera affichée dans l'en-tête, ce qui affecte les deux instructions d'en-tête suivantes, détruisant ainsi le flux de données du fichier Word. Par conséquent, le fichier Word ouvert sera tronqué.

La solution est d'utiliser ob_clean pour effacer le contenu de l'en-tête. Le print.php réécrit est le suivant

//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;
?>

Apprentissage recommandé : "Tutoriel vidéo PHP"

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn