[PERL CGI] GDGraph grafiek in pagina

Pagina: 1
Acties:

  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Om een rapport te kunnen maken wil ik graag data uit een MySQL database weergeven in een grefiek. HTML grafieken zijn geen optie omdat de plaatjes op moeten worden kunnen geslagen.

Op aanraden van een collega heb ik de Perl modules GD en GDGraph (van CPAN) geinstalleerd en dat werkt prima vanaf de command line interface van linux/unix, er komen mooie PNG plaatjes uit. Nu wil ik echter graag dat deze plaatjes in een HTML pagina te zien zijn.

Met PHP en MySQL heb ik al ervaring, Perl modules zijn echter nieuw voor me. In de handleiding van de GDGraph module staat een heel kort stukje over CGI maar daar heb ik als newbie op Perl gebied niet genoeg aan. Ook heb ik dit kunnen vinden, maar dat programma doet het op de server hier niet (zonder foutmeldingen!).

Kan iemand me helpen om een grafiek van GDGraph weer te geven in een webpagina? Het samenstellen van het source array dat lukt me wel.

There is no place like 127.0.0.1


  • smoking2000
  • Registratie: September 2001
  • Laatst online: 22-08 06:21

smoking2000

DPC-Crew

dpkg-reconfigure reality

Als perl CGi nieuwe voor je is, misschien eerst de graphs genereren en die files in een static HTML page showen?, zolang de file dezelfde naam hebben heb je altijd de meeste uptodate graph op je site

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |


  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Daar had ik zelf ook al aan zitten denken. Het lijkt me dan beter om een file-naam mee te geven aan het Perl script en dan die filenaam ook voor de <IMG> tag te gebruiken. Anders krijg ik problemen met multi-user toegang. Het is namelijk de bedoeling dat een user kan kiezen wat hij uit die database wil zien. Dus eerst moet er in een form e.e.a. ingevuld worden, dat moet uit de database gehaald worden (in een Perl scriptje) en daarvan moet er weer een grafiekje komen wat in een HTML pagina geladen wordt.

Het komt er dus op neer dat je na het klikken op de submit button van het form, je een pagina te zien krijgt met de resultaten in grafiek vorm. Dat zijn twee PHP/HTML pagina's na elkaar met een "uitstapje" naar een Perl script voor het ophalen van de data en het in elkaar zetten van de grefiek.

There is no place like 127.0.0.1


  • smoking2000
  • Registratie: September 2001
  • Laatst online: 22-08 06:21

smoking2000

DPC-Crew

dpkg-reconfigure reality

Oei, zo wordt t wat lastiger, is er geen GD module voor PHP? PHP is namelijk niet echt mijn area of expertise.

| [Folding@Home] Announce: Client monitor voor Linux (fci) | fci-1.8.4 | Fatal Error Group |


  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Er is zeker een GD library voor PHP, die ken ik ook wel (dat zou dus het probleem niet zijn). Maar het is niet mogelijk om de PHP parser die hier draait opnieuw te compileren met die GD library. Dus ben ik aangewezen op Perl modules. Of weet iemand een beter alternatief?

There is no place like 127.0.0.1


Verwijderd

Om eerlijk te zijn begrijp ik het probleem niet helemaal. Volgens mij wil je on the fly een grafiek genereren.


HTML:
1
[img]"/cgi-bin/whoeieenperlscript.pl?5"[/img]

Dit perl script zoekt in de db id 5 op en poept met behulp van GD::Graph een mooi grafiekje uit...

(tip: $ENV{"QUERY_STRING"}, wel ff checken of het een getal is en geen malcious MySQL statement, op deze wijze heb je ook geen CGI module nodig)

Voor documentatie voor perl modules kun je terecht op cpan.org:
http://search.cpan.org/author/MVERB/GDGraph-1.39/Graph.pm
en voor CGI:
http://search.cpan.org/author/JHI/perl-5.8.0/lib/CGI.pm

Goed lezen en dan moet het je allemaal gaan lukken, immers als je PHP beheerst moet Perl ook lukken... ;)

[ Voor 7% gewijzigd door Verwijderd op 25-03-2003 13:45 ]


  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Je hebt het probleem redelijk goed begrepen hoor lennert2002. Ik wil inderdaad on the fly een grafiek maken met gegevens uit een database en die in een HTML pagina zetten. Als de manier die jij aangeeft werkt dan is dat wat mij betreft prima. Ik krijg alleen GDGraph nog niet zo ver dat hij eenplaatje op mijn scherm zet anders dan via de command line interface.
Dit perl script zoekt in de db id 5 op en poept met behulp van GD::Graph een mooi grafiekje uit...
Zo'n script moet ik hebben! Alleen dan met wat meer zoek parameters, maar dat is geen probleem. Zoals ik eerder al typte, heb ik aan die handleiding van GDGraph op CPAN niet genoeg, daar staat maar een heel minimaal stukje. Ik zou graag een stukje voorbeeld code hebben en dan van daaruit verder werken. (Zo heb ik PHP ook geleerd.. ;))

Maar ik ga het gelijk eens proberen.

There is no place like 127.0.0.1


  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Jawel! Hij doet het! Bedankt voor de tip!

code:
1
[img]"cgi-bin/graph.pl?id=5"[/img]


does the trick.

There is no place like 127.0.0.1


  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Mijn grafiekje werkt nu met een array met vaste waarden erin. Ook kan ik inmiddels via de DBI module data uit een MySQL database lezen. Nu nog een combinatie van die twee.

Als ik data via een SELECT query uit de database laat komen dan krijg ik deze niet in de juiste vorm (array) om aan de grafiek generator te voeren. Via $sth->fetchrow_array kan ik per result een array van (in dit geval) drie elementen terug krijgen. Het array dat naar de grafiek generator moet heeft de volgende lay-out:
code:
1
2
3
4
5
my @data = (
                      ["1st","2nd","3rd","4th"],
                      [  2,      3,       2,     1     ],
                      [  3,      4,       5,     3     ]
                    );


Van de database komt per keer dus ["1st",2,3].
Het volgende leek mij het logischte (is dat een woord? :?).
code:
1
2
3
4
5
6
while (@row = $sth->fetchrow_array){
$data[0][$counter] = $row[0];
$data[1][$counter] = $row[1];
$data[2][$counter] = $row[2];
$counter++;
}


Hoe kan ik in Perl een array "90 graden" draaien?

There is no place like 127.0.0.1


Verwijderd

Verwijderd schreef op 25 maart 2003 @ 13:40:
{snip}

(tip: $ENV{"QUERY_STRING"}, wel ff checken of het een getal is en geen malcious MySQL statement, op deze wijze heb je ook geen CGI module nodig)

{snip}
tip 2: run perl met de -T vlag - is taint mode lees ook perldoc perlsec - mijn advies: run al je CGI scripts met taint aan.

  • marcus22
  • Registratie: Juni 2001
  • Laatst online: 21-08 23:45
Er mogen uitraard alleen getallen binnekomen anders kan iemand mijn o, zo kostbare tabletjes leeg gooien!

Tip 2 zal ik even na moeten kijken, ik weet nog niet wat taint is. Maar toch alvast bedankt voor de tips.

Het array heb ik nu eindelijk in de goede vorm door een "tussen array" te gebruiken. Nu is het jammer dat GDGraph de verschillende datasets niet kan groeperen.

There is no place like 127.0.0.1

Pagina: 1