PHP網頁中因為 要生成驗證碼而出現 影象“http://localhost/**.php”因其本身有錯無法顯示
我的網頁,要在使用者登入的位置出現驗證碼,程式如下:
<?php
header("Content-type:image/jpeg");
ob_end_flush();
$image_width=90;
$image_height=30;
srand(microtime()*100000);
$string="abcdefghigklmnopqrstuvwxyz123456789";
for($i=0;$i<4;$i++){
$new_number.=$string[rand(0,strlen($string)-1)];
}
$_SESSION['check_code_orginal']=$new_number;
$num_image=imagecreate($image_width,$image_height);
$white=imagecolorallocate($num_image,0,0,0);
$gray=imagecolorallocate($num_image,200,200,200);
imagefill($num_image,0,0,$gray);
$li=imagecolorallocate($num_image,220,220,220);
for($i=0;$i<3;$i++){
imageline($num_image,rand(0,30),rand(0,21),rand(20,40),rand(0,21),$li);
}
for($i=0;$i<90;$i++){
imagesetpixel($num_image,rand()*70,rand()*30,$gray);
}
for($i=0;$i<strlen($_SESSION['check_code_orginal']);$i++){
$font=mt_rand(3,5);
$x=mt_rand(1,8)+$image_width*$i/4;
$y=mt_rand(1,$image_height/4);
$color=imagecolorallocate($num_image,mt_rand(0,100),mt_rand(0,155),mt_rand(0,200));
imagestring($num_image,$font,$x,$y,$_SESSION['check_code_orginal'][$i],$color);
}
$picture="image/check_code.jpg";
touch($picture);
imagejpeg($num_image,$picture);
imagedestroy($num_image);
?>
<img src='image/check_code.jpg'>
因為網頁上還有其他內容,所以, header("Content-type:image/jpeg"); 位置已經被佔用,驗證碼不能出現了,就會出現影象“http://localhost/**.php”因其本身有錯,無法顯示” 那麼,解決這個問題的最簡單的辦法就是,直接刪除 header("Content-type:image/jpeg");
如果網頁上沒有其他內容,我們也可以在 header("Content-type:image/jpeg"); 之前加上 ob_clean();
即: ob_clean();
header("Content-type:image/jpeg");
以上是我在程式中碰到的問題,解決方法就是直接刪除 header("Content-type:image/jpeg"); 程式便可以運行了。至於原因,不知道我以上的理解的正確否,只是拿來供大家參考。
附一段別人的生成驗證碼的程式:
<?php
session_start();
//session_register("login_check_number");
//先成生背景,再把生成的驗證碼放上去
$img_height=70;//先定義圖片的長、寬
$img_width=25;
$authnum='';
//生產驗證碼字元
$ychar="0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z";
$list=explode(",",$ychar);
for($i=0;$i<4;$i++){
$randnum=rand(0,35);
$authnum.=$list[$randnum];
}
//把驗證碼字元儲存到session
$_SESSION["login_check_number"] = $authnum;
$aimg = imagecreate($img_height,$img_width); //生成圖片
imagecolorallocate($aimg, 255,255,255); //圖片底色,ImageColorAllocate第1次定義顏色PHP就認為是底色了
$black = imagecolorallocate($aimg, 0,0,0); //定義需要的黑色
for ($i=1; $i<=100; $i++) {
imagestring($aimg,1,mt_rand(1,$img_height),mt_rand(1,$img_width),"@",imagecolorallocate($aimg,mt_rand(200,255),mt_rand(200,255),mt_rand(200,255)));
}
//為了區別於背景,這裡的顏色不超過200,上面的不小於200
for ($i=0;$i<strlen($authnum);$i++){
imagestring($aimg, mt_rand(3,5),$i*$img_height/4+mt_rand(2,7),mt_rand(1,$img_width/2-2), $authnum[$i],imagecolorallocate($aimg,mt_rand(0,100),mt_rand(0,150),mt_rand(0,200)));
}
imagerectangle($aimg,0,0,$img_height-1,$img_width-1,$black);//畫一個矩形
ob_clean(); //關鍵程式碼,防止出現'影象因其本身有錯無法顯示'的問題。
Header("Content-type: image/PNG");
ImagePNG($aimg);//生成png格式
ImageDestroy($aimg);
?>