Page 1 of 1
Graphing problem
Posted: Sun Aug 07, 2005 6:57 am
by hannahd
Hello,
A php script that draws a graph is giving this error message.
Fatal error: Unsupported operand types in /home/hannahd/public_html/leaguetablegraph.php on line 217
The script works on my computer, and it worked a few months ago on the server.
I have commented out the header code at the top of the page so that it outputs the error instead of just an empty image.
Could this be because a new version of PHP has been installed on the server and contains a bug, or have I done something wrong?
code
Posted: Sun Aug 07, 2005 6:59 am
by hannahd
This is my PHP code
Code: Select all
//header("Content-type: image/jpeg");
class LineGraph {
var $title = "";
var $blnreverse = false;
var $blnautoyscale = true;
var $blnshowplotmarks = true;
var $xstartpos = 80;
var $ystartpos = null;
var $unitsize = 20;
var $plotgapwidth = 15;
var $plotmarkwidth = 5;
var $plotmarkheight = 5;
var $topyscalepos = 0;
var $bottomyscalepos = 0;
var $im = null;
var $ydata = null;
var $labels = null;
var $plotmarkwidth = 5;
var $plotmarkheight = 5;
var $defaultcolor = null;
var $linecolor = null;
var $plotmarkcolor = null;
var $labelscolor = null;
var $imagewidth = null;
var $imageheight = null;
var $titlecolor = null;
function LineGraph($width, $height) {
$this->im = ImageCreate($width,$height);
$this->imagewidth = ImageSX($this->im);
$this->imageheight = ImageSY($this->im);
$this->ystartpos = $this->getImageHeight() - 80;
$bgcolor = ImageColorAllocate($this->im,255,128,128);
$this->defaultcolor = ImageColorAllocate($this->im, 0,0,0);
$this->linecolor = $this->defaultcolor;
$this->plotmarkcolor = $this->defaultcolor;
$this->labelscolor = $this->defaultcolor;
}
function getImageWidth() {
return $this->imagewidth;
}
function getImageHeight() {
return $this->imageheight;
}
function setYData($data) {
$this->ydata = $data;
$this->plotgapwidth = round(($this->getImageWidth() - $this->xstartpos) / (count($this->ydata)));
if($this->blnautoyscale) {
$this->setMinimumValue();
$this->setMaximumValue();
}
}
function setYScale($min, $max) {
$this->blnautoyscale = false;
if(!$this->blnreverse) {
$this->topyscalepos = $max;
$this->bottomyscalepos = $min;
}
else {
$this->topyscalepos = $min;
$this->bottomyscalepos = $max;
}
}
function setMinimumValue() {
$yvalues = $this->ydata;
sort($yvalues);
if(!$this->blnreverse) {
$this->bottomyscalepos = $yvalues[0];
}
else {
$this->bottomyscalepos = $yvalues[count($yvalues)-1];
}
}
function setMaximumValue() {
$yvalues = $this->ydata;
sort($yvalues);
if(!$this->blnreverse) {
$this->topyscalepos = $yvalues[count($yvalues)-1];
}
else {
$this->topyscalepos = $yvalues[0];
}
}
function drawYScale() {
$ypos = $this->ystartpos;
if(!$this->blnreverse) {
for($i=$this->bottomyscalepos; $i<=$this->topyscalepos; $i++) {
$ypos-=$this->unitsize;
ImageString($this->im, 1, 40, $ypos, $i, $this->defaultcolor);
}
}
else {
for($i=$this->bottomyscalepos; $i>=$this->topyscalepos; $i--) {
$ypos-=$this->unitsize;
ImageString($this->im, 1, 40, $ypos, $i, $this->defaultcolor);
}
}
}
function setReverseYScale($toggle) {
$this->blnreverse = $toggle;
if(!$this->blnautoyscale) {
$this->setYScale(1,24);
}
}
function setLineColor($color) {
$this->linecolor = $color;
}
function setPlotMarkColor($color) {
$this->plotmarkcolor = $color;
}
function setPlotMarkSize($width, $height) {
$this->plotmarkwidth = $width;
$this->plotmarkheight = $height;
}
function showPlotMarks($toggle) {
$this->blnshowplotmarks = $toggle;
}
function setLabels($labels) {
$this->labels = $labels;
}
function setLabelsColor($color) {
$this->labelscolor = $color;
}
function setTitle($title) {
$this->title = $title;
}
function setTitleColor($color) {
$this->titlecolor = $color;
}
function plotData() {
$currxpos = $this->xstartpos;
if($this->blnreverse) {
$firstploty = $this->ystartpos - $this->unitsize;
for($i=0; $i<count($this->ydata); $i++) {
$ypos = $firstploty - ($this->bottomyscalepos - $this->ydata[$i]) * $this->unitsize;
if($i < count($this->ydata)-1) {
$nextypos = $firstploty - ($this->bottomyscalepos - $this->ydata[$i+1]) * $this->unitsize;
ImageLine($this->im, $currxpos, $ypos, ($currxpos+$this->plotgapwidth), $nextypos, $this->linecolor);
}
if($this->blnshowplotmarks) {
ImageArc($this->im, $currxpos,$ypos, $this->plotmarkwidth,$this->plotmarkheight,0,360,$this->plotmarkcolor);
ImageFilltoBorder($this->im, $currxpos, $ypos, $this->plotmarkcolor, $this->plotmarkcolor);
}
$currxpos+=$this->plotgapwidth;
}
}
else {
for($i=0; $i<count($this->ydata); $i++) {
$ypos = $this->ystartpos - ($this->ydata[$i]*$this->unitsize);
if($i < count($this->ydata)-1) {
$nextypos = $this->ystartpos - ($this->ydata[$i+1]*$this->unitsize);
ImageLine($this->im, $currxpos, $ypos, ($currxpos+$this->plotgapwidth), $nextypos, $this->linecolor);
}
if($this->blnshowplotmarks) {
ImageArc($this->im, $currxpos,$ypos, $this->plotmarkwidth,$this->plotmarkheight,0,360,$this->plotmarkcolor);
ImageFilltoBorder($this->im, $currxpos, $ypos, $this->plotmarkcolor, $this->plotmarkcolor);
}
$currxpos+=$this->plotgapwidth;
}
}
}
function drawGraph() {
if(is_Null($this->ydata)) {
$warning = "Unable to draw graph as no data has been supplied.";
ImageString($this->im, 8,10,20,$warning, $this->defaultcolor);
}
else {
$this->drawYScale();
$this->plotData();
$this->drawLabels();
$this->drawTitle();
}
ImageJpeg($this->im);
ImageDestroy($this-im);
}
function drawTitle() {
ImageString($this->im, 8, 100, 10, $this->title, $this->titlecolor);
}
function drawLabels() {
$currxpos = $this->xstartpos - $this->plotmarkwidth;
for($i=0; $i<count($this->labels); $i++) {
if($this->labels[$i]->show) {
ImageStringup($this->im, 8,$currxpos,$this->getImageHeight()-5,$this->labels[$i]->text, $this->labelscolor);
}
$currxpos+=$this->plotgapwidth;
}
}
}
class Label {
var $text;
var $show = true;
function Label($text, $show) {
$this->text = $text;
$this->show = $show;
}
}
code (continued)
Posted: Sun Aug 07, 2005 7:00 am
by hannahd
Code: Select all
include("connectinfo.php");
$sql = "SELECT leaguepos, MONTHNAME(matchdate) from results
INNER JOIN fixtures ON fixtures.id = results.matchid
where leaguepos!=0 ORDER BY matchdate";
$res = mysql_query($sql) or die(mysql_error());
while($row = mysql_fetch_array($res)) {
$ydata[] = $row[0];
$matchdates[] = $row[1];
}
$lastmonth = "";
for($i=0; $i<count($ydata); $i++) {
$currmonth = $matchdates[$i];
if($currmonth==$lastmonth) {
$labels[] = new Label("", false);
}
else {
$labels[] = new Label($currmonth, true);
$lastmonth = $currmonth;
}
}
$linegraph = new LineGraph(600,600);
$titlecolor = ImageColorAllocate($linegraph->im, 255,255,255);
$labelscolor = ImageColorAllocate($linegraph->im, 128,0,128);
$plotmarkcolor = ImageColorAllocate($linegraph->im, 255,0,0);
$linegraph->setYData($ydata);
$linegraph->setReverseYScale(true);
$linegraph->setYScale(1,24);
$linegraph->setPlotMarkSize(6,6);
$linegraph->setPlotMarkColor($plotmarkcolor);
$linegraph->showPlotMarks(true);
$linegraph->setLabels($labels);
$linegraph->setTitleColor($titlecolor);
$linegraph->setTitle("Coca-Cola League One progress 2005-06");
$linegraph->setLabelsColor($labelscolor);
$linegraph->drawGraph();
?>
Thank you for your help
the page can be found here
http://www.forzaforest.net/leaguetablegraph.php
Hannah
Posted: Sun Aug 07, 2005 7:07 am
by s.dot
Please use the [ php ] and [ /php ] tags to display your code. It makes it much easier to read.

Posted: Sun Aug 07, 2005 7:11 am
by hannahd
scrotaye wrote:Please use the [ php ] and [ /php ] tags to display your code. It makes it much easier to read.

Sorry, I am a newbie.

Posted: Sun Aug 07, 2005 7:49 am
by feyd
it's your code that's at fault:
line 217:
you're using a subtraction, not an object dereference.
Posted: Sun Aug 07, 2005 8:54 am
by hannahd
feyd wrote:it's your code that's at fault:
line 217:
you're using a subtraction, not an object dereference.
I thought too this might be the problem and corrected it, but still it won't produce the image, even though it does on my PC.
Thanks for your help.

Posted: Sun Aug 07, 2005 9:05 am
by hannahd
I think I may have solved the problem. I think the browser may have been
caching an old image that was not correctly built by the faulty script. When
I attached a query string to the image link, it worked!
Thanks again for your help
Just one thing though, the image refused to display when I used an include to import the connection parameters, and only worked when I put the settings into the page itself.
Posted: Sun Aug 07, 2005 9:10 am
by feyd
you may have some extra character output in that include. Any extraneous bytes getting added to the stream will corrupt the image, typically..