无法修改标头信息

时间:2011-01-30 21:40:37

标签: php image http post header

我有一个登录页面,用户可以选择其中一个选项。然后它必须显示图表。 但是我得到了这个错误

无法修改标题信息 - 已经在/var/www/databin/php/visual/chart.php上发送的输出(由/var/www/databin/php/visual/chart.php:136开始输出) 126

我在论坛上尝试了很多东西,但我做不到。

感谢您的帮助。

这是代码

<?php
function subval_sort($a,$subkey) {
 foreach($a as $k=>$v) {
  $b[$k] = strtolower($v[$subkey]);
 }
 asort($b);
 foreach($b as $key=>$val) {
  $c[] = $a[$key];
 }
 return $c;
}

function display_graph($str)
{
echo $str;
$data = array( 
"Jan" => 55, 
"Feb" => 54, 
"Mar" => 53, 
"Apr" => 33, 
"May" => 13, 
"Jun" => 15, 
"Jul" => 23, 
"Aug" => 28, 
"Sep" => 32, 
"Oct" => 45, 
"Nov" => 73, 
"Dec" => 71); 

// create image 
$width = 480; 
$height = 250; 
$image = imagecreate($width, $height); 

// colors 
$white = imagecolorallocate($image, 0xFF, 0xFF, 0xFF); 
$navy = imagecolorallocate($image, 0x00, 0x00, 0x80); 
$black = imagecolorallocate($image, 0x00, 0x00, 0x00); 
$gray = imagecolorallocate($image, 0xC0, 0xC0, 0xC0); 

// layout 
$maxval = max($data); 
$nval = sizeof($data); 

$vmargin = 20; // top (bottom) vertical margin for title (x-labels) 
$hmargin = 38; // left horizontal margin for y-labels 

$base = floor(($width - $hmargin) / $nval); // distance between columns 

$ysize = $height - 2 * $vmargin; // y-size of plot 
$xsize = $nval * $base; // x-size of plot 

// title 
$titlefont = 3; 
$title = "Presidential Approval Ratings 2000 (in %)"; 

$txtsz = imagefontwidth($titlefont) * strlen($title); // pixel-width of title 

$xpos = (int)($hmargin + ($xsize - $txtsz)/2); // center the title 
$xpos = max(1, $xpos); // force positive coordinates 
$ypos = 3; // distance from top 

imagestring($image, $titlefont, $xpos, $ypos, $title , $black); 

// y labels and grid lines 
$labelfont = 2; 
$ngrid = 4; // number of grid lines 

$dydat = $maxval / $ngrid; // data units between grid lines 
$dypix = $ysize / ($ngrid + 1); // pixels between grid lines 

for ($i = 0; $i <= ($ngrid + 1); $i++) { 
    // iterate over y ticks 

    // height of grid line in units of data 
    $ydat = (int)($i * $dydat); 

    // height of grid line in pixels
    $ypos = $vmargin + $ysize - (int)($i*$dypix); 

    $txtsz = imagefontwidth($labelfont) * strlen($ydat); // pixel-width of label 
    $txtht = imagefontheight($labelfont); // pixel-height of label 

    $xpos = (int)(($hmargin - $txtsz) / 2); 
    $xpos = max(1, $xpos); 

    imagestring($image, $labelfont, $xpos, 
        $ypos - (int)($txtht/2), $ydat, $black); 

    if (!($i == 0) && !($i > $ngrid)) {
        imageline($image, $hmargin - 3, 
            $ypos, $hmargin + $xsize, $ypos, $gray); 
        // don't draw at Y=0 and top 
    }
} 

// columns and x labels 
$padding = 3; // half of spacing between columns 
$yscale = $ysize / (($ngrid+1) * $dydat); // pixels per data unit 

for ($i = 0; list($xval, $yval) = each($data); $i++) { 

    // vertical columns 
    $ymax = $vmargin + $ysize; 
    $ymin = $ymax - (int)($yval*$yscale); 
    $xmax = $hmargin + ($i+1)*$base - $padding; 
    $xmin = $hmargin + $i*$base + $padding; 

    imagefilledrectangle($image, $xmin, $ymin, $xmax, $ymax, $navy); 

    // x labels 
    $txtsz = imagefontwidth($labelfont) * strlen($xval); 

    $xpos = $xmin + (int)(($base - $txtsz) / 2); 
    $xpos = max($xmin, $xpos); 
    $ypos = $ymax + 3; // distance from x axis 

    imagestring($image, $labelfont, $xpos, $ypos, $xval, $black); 
} 

// plot frame 
imagerectangle($image, $hmargin, $vmargin, 
    $hmargin + $xsize, $vmargin + $ysize, $black); 

// flush image 
header("Content-type: image/gif"); // or "Content-type: image/png" 
imagegif($image); // or imagepng($image) 
imagedestroy($image); 
}
?>

<html>
<body>
<form method="GET"  action="">
<input type="submit" name="name" value="Submit">
<?php

    echo "<select name=\"name\">";
    echo "<option size =30 selected>Select</option>";

 $initDir = "/var/www/databin/userfiles/";
  $peoplearr = scandir ($initDir);

foreach ($peoplearr as $person)
  {
    if (strcmp ($person, ".") == 0)
      continue;
    if (strcmp ($person, "..") == 0)
      continue;
    $str = str_replace(".html","",$person);

    echo "<option>$str</option>";

  }
echo "</select>";
if(isset($_GET['name']))
{
echo $_GET['name'];
$user = $_GET['name'];
$initdir = "/var/www/databin/userfiles/";
$person = $user.".html/";
$person_comparisons = array();
$display_arr       = array();
$str = file_get_contents($initdir.$person."person_comparison");
$person_comparisons = json_decode($str,true);
$i = 0;
if($person_comparisons[$i])
{
while(true)
 {
 $display_arr[$i]['name'] = $person_comparisons[$i]['name'];
 $display_arr[$i]['sim'] = $person_comparisons[$i]['sim'];
 $i = $i + 1;
 if(!$person_comparisons[$i]) break;
 }

$display_arr = subval_sort($display_arr,'sim'); 
print_r($display_arr);
display_graph($display_arr);
}// end if

}

2 个答案:

答案 0 :(得分:1)

典型错误。 display_graph()函数调用:

header("Content-type: image/gif"); // or "Content-type: image/png"

这应该是输出的第一件事。

在你的情况下,你在同一页面上生成html内容和png图像,这是错误的。将png部分移动到一个单独的文件,即display_graph.php,并从你的html代码中调用它:

<img src="display_graph.php?param1=1&param2=2"/>

答案 1 :(得分:0)

您正在打印其他输出打印后的标题,这是错误的,这就是它抱怨的原因。 要修复它,你必须确保在调用

之前没有输出
header()

有时它也可能依赖于标签前的空格,所以请确保在第一个之前没有任何内容

如果不是简单的情况检查在任何标题调用之前没有print / echo

修改

好的,肯定不是空白案例!

可能最好的方法是将图像创建移动到不同的php脚本中,例如graph_image.php,然后在你希望图形执行某些操作的位置

<img src="graph_image.php?name=<?php print $_GET['name'];" />

您可以通过将创建数组的顶部和大部分代码中的所有代码或作为参数发送的任何代码移动到随后创建图像的函数来执行此操作。