test2.php
<?php 
$conn=@mysql_connect("localhost","root","123456") or die("服务器连接错误!"); //链接数据库 
@mysql_select_db("image",$conn) or die("未发现数据库!"); 
$query="select * from test where id=1"; 
$result=mysql_query($query); 
if(!$result) die("error: mysql query"); 
$num=mysql_num_rows($result); 
if($num<1) die("error: no this recorder"); 
$data = mysql_result($result,0,"img"); 
header("Content-type: image/JPEG"); 
echo $data; 
?> 我想echo "<img src='".$data."'>"; 一堆乱码。为啥一定要在另一个页面调用<img src='test2.php?file=1' />,而且必须加个参数,,否则就不能显示???

解决方案 »

  1.   

    header("Content-type: image/JPEG"); 
    echo $data;//$data不能加img标签
      

  2.   

    楼主请先理解下这个$data。
    其实,你从数据库中取出的这个$data并不是一般意义上的文本型字符串,而是一个二进制字节流。
    这个echo $data,就相当于输出了一幅图片的完整的二进制字节流。
    而header("Content-type: image/JPEG")进一步表明了你的test2.php是一幅图片而不是普通的html文档,这是有本质区别的。
    echo "<img src='".$data."'>"就相当于把一幅图片的二进制流硬塞到了src里。你可以想像一下你用二进制编辑工具打开了一幅图片,然后ctrl+a、ctrl+c再ctrl+v到src里,不乱码才怪了。
    总之,理解这个问题,你只需要理解test2.php已经是一幅图片而不是html文档这个事实。
      

  3.   

    至于你说的test2.php?file=1这里,必须加个参数的这里,我认为没什么道理,应该是缓存问题。
    应该是之前你的test2.php输出了错误的二进制流,导致浏览器缓存了一幅错误的图片(test2.php),然后你又重新修正了,并加了参数,浏览器就去读新的图片(test2.php?file=1)。解决这个问题,应该仅仅只用清理一下浏览器缓存。
      

  4.   

    没有什么可想不通的
    浏览器可没有你那么聪明,知道什么地方时文字、什么地方时图片
    所以输出数据时要发标头,比如你的 header("Content-type: image/JPEG");  
    默认是文本浏览器一次只能接受一种类型的数据
    所以  img src='".$data."'> 中的 $data 的内容也被当做文本显示了<img src='test2.php?file=1' />
    的作用不是因为缓存问题,解决缓存问题需要每次给不同的值
    而是向服务器传递需求,虽然你的代码中 $query="select * from test where id=1"; 
    把图片固定了,但实际应用时是可以指定图片的 id 的