login  Naam:   Wachtwoord: 
Registreer je!
 Forum

[GDLib] Afbeelding bevat fouten

Offline Frederic - 06/04/2005 14:05 (laatste wijziging 06/04/2005 14:05)
Avatar van FredericPHP ver gevorderde Ik wil graag een grafiekje maken, met onderstaand script:
Standaard waren dit de gegevens:
  1. <? $hoofdarray = array(
  2. "1-1" => 45,
  3. "2-1" => 35,
  4. "3-1" => 42,
  5. "4-1" => 46,
  6. "5-1" => 51,
  7. "6-1" => 49,
  8. "7-1" => 33,
  9. "8-1" => 39,
  10. "9-1" => 40,
  11. "10-1" => 34
  12. ); ?>

Maar die heb ik toen vervangen door
  1. <? $hoofdarray = array(
  2. $sql = mysql_query("SELECT * FROM site_database_grootte");
  3. while($rij = mysql_fetch_assoc($sql))
  4. {
  5. $datum = $rij['datum'];
  6. $grootte = $rij['grootte'];
  7.  
  8. $datum => $grootte
  9. }
  10. );?>

In mijn database zit dit:
  1. id datum grootte (INT)
  2. 1 2005-04-05 2000
  3. 2 2005-04-05 2057
  4. 3 2005-04-05 2057

Maar toch krijg ik 'afbeelding kan niet worden getoont omdat er fouten inzitten'. Dit is het script:
  1. <?php
  2. $titel = "Grootte MySQL";
  3.  
  4. // array op deze manier genereren $hoofdarray = array(x-as => y-as)
  5. // bv:
  6. $sql = MySQL_query("SELECT * FROM site_database_grootte");
  7. while( $rij = mysql_fetch_assoc( $sql ) ) {
  8. $datum = $rij['datum'];
  9. $grootte = $rij['grootte'];
  10. $hoofdarray = array($datum => $grootte);
  11. }
  12. $gebied_breedte = 400; // grootte van de grafiek zelf (zonder randen)
  13. $gebied_hoogte = 200; // hoogte van de grafiek zelf (zonder randen)
  14. $rand_links = 20; // de breedte van de linker rand (hou rekening met de lengte van de waardes die op de y-as komen, in toekomst misschien automatisch)
  15. $rand_rechts = 10; // de breedte van de rechter rand
  16. $rand_onder = 40; // de rand onder de grafiek (hou rekening met de lengte van de waardes die op de x-as komen, in toekomst misschien automatisch)
  17. $rand_boven = 30; // de rand boven (hou rekening met de titel die hier in komt)
  18. $hor_lijnen = 4; // het aantal verdelingen van de y-as
  19. $hor_raster = TRUE; // horizontale lijnen zichtbaar?
  20. $ver_lijnen = 10; // het aantal verdelingen van de x-as
  21. $ver_raster = FALSE; // verticale lijnen zichtbaar?
  22. $grafiek_titel = $titel; // de titel van de grafiek
  23.  
  24. header("Content-type: image/png");
  25.  
  26. if(function_exists("ImageCreateTrueColor"))
  27. {
  28. $plaatje = ImageCreateTrueColor(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
  29. }
  30. else
  31. {
  32. $plaatje = ImageCreate(($gebied_breedte + $rand_rechts + $rand_links), ($gebied_hoogte + $rand_onder + $rand_boven));
  33. }
  34.  
  35. $zwart = ImageColorAllocate($plaatje, 000, 000, 000);
  36. $wit = ImageColorAllocate($plaatje, 255, 255, 255);
  37. $grijs = ImageColorAllocate($plaatje, 225, 225, 225);
  38. $lijn = ImageColorAllocate($plaatje, 000, 000, 255); // blauwe grafieklijn
  39.  
  40. imagefill($plaatje,1,1,$wit);
  41. // zwarte rand of niet:
  42. //imagefilledrectangle($plaatje, 1, 1, ($gebied_breedte + $rand_rechts + $rand_links - 2), ($gebied_hoogte + $rand_onder + $rand_boven -2), $wit); //
  43.  
  44.  
  45. imagefilledrectangle($plaatje, ($rand_links + 1), ($rand_boven + 1), ($rand_links + $gebied_breedte - 1), ($rand_boven + $gebied_hoogte -1), $grijs);
  46.  
  47. $hoogste = 1;
  48. foreach($hoofdarray as $key => $value)if($value > $hoogste)$hoogste = $value;
  49.  
  50. $style=array($zwart, $zwart, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT, IMG_COLOR_TRANSPARENT );
  51. imagesetstyle($plaatje,$style);
  52.  
  53. $waarde = 1;
  54. for($y = $rand_boven;$y < ($gebied_hoogte + $rand_boven + 1);$y += ($gebied_hoogte / $hor_lijnen))
  55. {
  56. $align = $rand_links - 3 - strlen(round($hoogste * $waarde)) * 5;
  57. imagestring($plaatje, 2, $align, $y - 7 , round($hoogste * $waarde), $zwart);
  58. if($hor_raster)imageline($plaatje, $rand_links, $y, ($rand_links + $gebied_breedte), $y, IMG_COLOR_STYLED);
  59. $waarde -= (1 / $hor_lijnen);
  60. }
  61. $aantal = count($hoofdarray);
  62. $interval = $gebied_breedte / ($aantal - 1);
  63. $yinterval = $gebied_hoogte / $hoogste;
  64. $x = $rand_links;
  65. $coords = array();
  66. $ticker = 0;
  67. $numdates = round($aantal / $ver_lijnen);
  68. if($numdates < 1)$numdates = 1;
  69. foreach($hoofdarray as $xas => $yas)
  70. {
  71.  
  72. $coords[$ticker]["x"] = round($x);
  73. $coords[$ticker]["y"] = ($rand_boven + $gebied_hoogte) - (round($yas * $yinterval));
  74.  
  75. if($ticker / $numdates == round($ticker / $numdates) || $ticker == 0 || $ticker == $aantal-1)
  76. {
  77. $align = ($gebied_hoogte + $rand_boven) + (strlen($xas) * 5) + 5;
  78. imagestringup($plaatje, 2 , round($x) - 7 , $align, $xas ,$zwart);
  79. if($ver_raster)imageline($plaatje, round($x) , $rand_boven , round($x) , ($rand_boven + $gebied_hoogte), IMG_COLOR_STYLED);
  80. }
  81.  
  82. $x += $interval;
  83. $ticker++;
  84. }
  85. for($a = 0;$a < count($coords)-1;$a++)
  86. {
  87. imagesmoothline($plaatje, $coords[$a]["x"] , $coords[$a]["y"] , $coords[$a+1]["x"] , $coords[$a+1]["y"], $lijn);
  88. }
  89.  
  90. imagerectangle($plaatje, $rand_links, $rand_boven, ($rand_links + $gebied_breedte), ($rand_boven + $gebied_hoogte), $zwart);
  91.  
  92. imagestring($plaatje, 4 , ((($rand_links + $rand_rechts + $gebied_breedte) / 2) - ((strlen($grafiek_titel) / 2) * 8)) , ($rand_boven / 2) - 8 , $grafiek_titel , $zwart);
  93.  
  94. ImagePNG($plaatje);
  95. ImageDestroy($plaatje);
  96.  
  97.  
  98.  
  99. // functie voor de anti-aliasing van de grafieklijn (van php.net)
  100. function imagesmoothline ( $image , $x1 , $y1 , $x2 , $y2 , $color )
  101. {
  102. $colors = imagecolorsforindex ( $image , $color );
  103. if ( $x1 == $x2 )
  104. {
  105. imageline ( $image , $x1 , $y1 , $x2 , $y2 , $color ); // Vertical line
  106. }
  107. else
  108. {
  109. $m = ( $y2 - $y1 ) / ( $x2 - $x1 );
  110. $b = $y1 - $m * $x1;
  111. if ( abs ( $m ) <= 1 )
  112. {
  113. $x = min ( $x1 , $x2 );
  114. $endx = max ( $x1 , $x2 );
  115. while ( $x <= $endx )
  116. {
  117. $y = $m * $x + $b;
  118. $y == floor ( $y ) ? $ya = 1 : $ya = $y - floor ( $y );
  119. $yb = ceil ( $y ) - $y;
  120. $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , floor ( $y ) ) );
  121. $tempcolors['red'] = $tempcolors['red'] * $ya + $colors['red'] * $yb;
  122. $tempcolors['green'] = $tempcolors['green'] * $ya + $colors['green'] * $yb;
  123. $tempcolors['blue'] = $tempcolors['blue'] * $ya + $colors['blue'] * $yb;
  124. if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
  125. imagesetpixel ( $image , $x , floor ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
  126. $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , $x , ceil ( $y ) ) );
  127. $tempcolors['red'] = $tempcolors['red'] * $yb + $colors['red'] * $ya;
  128. $tempcolors['green'] = $tempcolors['green'] * $yb + $colors['green'] * $ya;
  129. $tempcolors['blue'] = $tempcolors['blue'] * $yb + $colors['blue'] * $ya;
  130. if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
  131. imagesetpixel ( $image , $x , ceil ( $y ) , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
  132. $x ++;
  133. }
  134. }
  135. else
  136. {
  137. $y = min ( $y1 , $y2 );
  138. $endy = max ( $y1 , $y2 );
  139. while ( $y <= $endy )
  140. {
  141. $x = ( $y - $b ) / $m;
  142. $x == floor ( $x ) ? $xa = 1 : $xa = $x - floor ( $x );
  143. $xb = ceil ( $x ) - $x;
  144. $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , floor ( $x ) , $y ) );
  145. $tempcolors['red'] = $tempcolors['red'] * $xa + $colors['red'] * $xb;
  146. $tempcolors['green'] = $tempcolors['green'] * $xa + $colors['green'] * $xb;
  147. $tempcolors['blue'] = $tempcolors['blue'] * $xa + $colors['blue'] * $xb;
  148. if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
  149. imagesetpixel ( $image , floor ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
  150. $tempcolors = imagecolorsforindex ( $image , imagecolorat ( $image , ceil ( $x ) , $y ) );
  151. $tempcolors['red'] = $tempcolors['red'] * $xb + $colors['red'] * $xa;
  152. $tempcolors['green'] = $tempcolors['green'] * $xb + $colors['green'] * $xa;
  153. $tempcolors['blue'] = $tempcolors['blue'] * $xb + $colors['blue'] * $xa;
  154. if ( imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) == -1 ) imagecolorallocate ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] );
  155. imagesetpixel ( $image , ceil ( $x ) , $y , imagecolorexact ( $image , $tempcolors['red'] , $tempcolors['green'] , $tempcolors['blue'] ) );
  156. $y ++;
  157. }
  158. }
  159. }
  160. }
  161.  
  162. ?>

Als ik de gewone (basis) array gebruik werkt het wel, dus diep in het script kan de fout niet zitten?

13 antwoorden

Gesponsorde links
Offline NCube - 06/04/2005 14:22
Avatar van NCube HTML beginner
  1. <? $hoofdarray = array(
  2. $sql = mysql_query("SELECT * FROM site_database_grootte");
  3. while($rij = mysql_fetch_assoc($sql))
  4. {
  5. $datum = $rij['datum'];
  6. $grootte = $rij['grootte'];
  7.  
  8. $datum => $grootte
  9. }
  10. );?>

is ook fout
gebruik:
  1. <? $hoofdarray = array();
  2. $sql = mysql_query("SELECT * FROM site_database_grootte");
  3. while($rij = mysql_fetch_assoc($sql)){
  4. $hoofdarray[$rij['datum']]=$rij['grootte'];
  5. }
  6. ?>
Offline Frederic - 06/04/2005 14:27
Avatar van Frederic PHP ver gevorderde Hmm, nog steeds

Citaat:
De afbeelding “....” kan niet vertoond worden, omdat ze fouten bevat.
Offline Fenrir - 06/04/2005 14:30
Avatar van Fenrir PHP expert dit:
  1. header("Content-type: image/png");
(op r. 24) moet je weghalen, dan zie je de php-errors.
Offline Frederic - 06/04/2005 14:37
Avatar van Frederic PHP ver gevorderde Dan krijg ik dit:
http://www.fadetolife.be/Test/grafiek.php 
Offline Fenrir - 06/04/2005 14:52 (laatste wijziging 06/04/2005 14:56)
Avatar van Fenrir PHP expert O, dan weet ik het niet.
Ik krijg dan errors ertussen, maar hier dus niet.

Misschien heb je boven of onder de <?php en ?> een lege regel staan?

EDIT:

zet er eens error_reporting(E_STRICT); boven (of error_reporting(E_ALL); voor oudere phpversies)
Offline Thomas - 06/04/2005 14:55
Avatar van Thomas Moderator Misschien is dit een browser-specifiek probleem ?
Staan er toevallig spaties of enters buiten PHP-blokken, dat werkt doorgaans niet lekker als je ook headers gebruikt ?

Probeer eens bij het maken van plaatjes en dergelijke 'or die("foutmelding...");' te zetten anders, misschien dat je er op die manier achter komt wat er mis gaat.
Offline Frederic - 06/04/2005 17:14
Avatar van Frederic PHP ver gevorderde Hmm, nu krijg ik toch wel een error:

Warning: Division by zero

In dit blok:

  1. $aantal = count($hoofdarray);
  2. $interval = $gebied_breedte / ($aantal - 1);
  3. $yinterval = $gebied_hoogte / $hoogste;

Dus er is iets fout met het array?
Offline mellowmood - 06/04/2005 17:30 (laatste wijziging 06/04/2005 17:31)
Avatar van mellowmood Nieuw lid ja gaat het op regel 2 verkeerd of op regel 3 in

  1. $aantal = count($hoofdarray);
  2. $interval = $gebied_breedte / ($aantal - 1);
  3. $yinterval = $gebied_hoogte / $hoogste;


je script geeft namelijk
Warning: Division by zero in /usr/local/psa/home/vhosts/fadetolife.be/httpdocs/Test/grafiek.php on line 86

Dus is niet genoeg uit te halen
Offline Frederic - 06/04/2005 17:36 (laatste wijziging 06/04/2005 17:37)
Avatar van Frederic PHP ver gevorderde Jah ik zei al, m'n array klopt niet, maar
  1. <? $hoofdarray = array();
  2. $sql = mysql_query("SELECT * FROM site_database_grootte");
  3. while($rij = mysql_fetch_assoc($sql)){
  4. $hoofdarray[$rij['datum']]=$rij['grootte'];
  5. } ?>

Moet normaal toch zoiets opleveren:
  1. <?
  2. //werkende array
  3. $hoofdarray = array(
  4. "1-1" => 45,
  5. "2-1" => 35,
  6. "3-1" => 42,
  7. "4-1" => 46,
  8. "5-1" => 51,
  9. "6-1" => 49,
  10. "7-1" => 33,
  11. "8-1" => 39,
  12. "9-1" => 40,
  13. "10-1" => 34
  14. ); ?>

?
Offline Fenrir - 06/04/2005 17:58 (laatste wijziging 06/04/2005 18:04)
Avatar van Fenrir PHP expert Er kunnen 2 dingen verkeerd zijn:

1. $aantal == 1
2. $hoogste == 0

of allebei natuurlijk.

Print in een echo de waarden van deze variabelen eens uit, dan zie je wat er fout is.

En probeer eens print_r() op je arrays.
Offline Frederic - 06/04/2005 20:03
Avatar van Frederic PHP ver gevorderde Als ik print_r doe krijg ik:

Citaat:
Array ( [2005-02-14] => 2057 [2005-02-15] => 2078 [2005-02-16] => 2090 )
Offline Fenrir - 06/04/2005 21:46
Avatar van Fenrir PHP expert zet eens bovenaan:
ob_start();
en boven ImagePNG($plaatje):
ob_end_clean();
Offline Frederic - 06/04/2005 21:53
Avatar van Frederic PHP ver gevorderde voila en bij deze werkt het Zomaar ineens Had niks gewijzigd, gewoon print_r weggehaald
Thanks iedereen
Gesponsorde links
Dit onderwerp is gesloten.
Actieve forumberichten
© 2002-2024 Sitemasters.be - Regels - Laadtijd: 0.345s