Toon posts:

[perl] STDIN problemen

Pagina: 1
Acties:

Verwijderd

Topicstarter
Dag mede Tweakers,

Ik ben bezig met een inlog systeem, webbased. Ik heb helaas geen mogelijkheid tot databases of wat fijnere talen als PHP, ik moet het doen met CGI. Helaas heb ik hier nog geen enkele ervaring in.

Zodra ik begin te werken met STDIN (standard input), gaat het fout. Ik krijg Internal Server Errors terug etc. Ik heb gezocht op andere pagina's wat ik fout heb gedaan. Helaas niks kunnen vinden. Google heb ik ook al meerdere malen gebruikt, ook daar geen juist antwoord weten te vinden.

code:
1
2
3
4
5
6
7
#!/usr/bin/local/perl -w

# Start of data

print "Content-type: text/html\n\n";
read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
exit();


Dit is een gedeelte van mijn code. Bij read(); gaat het mis, na testen ben ik er achter gekomen dat dit komt door STDIN. De server keurt deze niet goed. Mijn CGI bestand heeft de CHMOD van 755.

Als iemand een oplossing weet voor dit probleem, kan ik ook weer verder!

Alvast bedankt,

Fred

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:04
Je kunt de 'friendly error messages' in uw browser even afzetten, dan ga je misschien nog wat meer info krijgen over waarom het preceis verkeerd gaat.

https://fgheysels.github.io/


Verwijderd

Over het algemeen is het makkelijker met de CGI module te werken in Perl (niet CGI, CGI is een protocol):

code:
1
2
3
4
5
6
7
#!/usr/bin/local/perl -w
use CGI;

$cgi = CGI->new();

print $cgi->header();
print "Je parameter 'naam' had de waarde: ".$cgi->param("naam");

Zoek even naar de CGI module documentatie :)

(hopelijk klopt de code, ik heb al een tijdje niks met Perl via CGI gedaan).

Verwijderd

Topicstarter
print $cgi->header();
print "Je parameter 'naam' had de waarde: ".$cgi->param("naam");

wat bedeol je hier precies mee?

Verwijderd

Verwijderd schreef op 19 augustus 2002 @ 14:27:
print $cgi->header();
print "Je parameter 'naam' had de waarde: ".$cgi->param("naam");

wat bedeol je hier precies mee?
Met $cgi->header() wordt die Conten-type: text/html\n afgedrukt, dit werkt prettiger.
Met $cgi->param(..) kun je POST en GET variabelen opvragen ?naam=Fred, maar zie hiervoor de CGI.pm documentatie (staat wel op CPAN.org)

edit:
Ik vond hier: http://stein.cshl.org/WWW/software/CGI/ een uitleg over hoe je de module kunt gebruiken

  • Koffie
  • Registratie: Augustus 2000
  • Laatst online: 01-09 17:48

Koffie

Koffiebierbrouwer

Braaimeneer

Is STDIN juist niet voor input vanaf console :?
Oftewel wat zit er _IN_ die STDIN volgens jou ?
Enneuh .. die CGI.pm heb je IMHO niet nodig in deze situatie.
Zo te zien heeft de gebruiker alleen maar beschukking over Perl5, en daar niet al teveel verstand van. Lijkt me niet handig om dan meteen met PM's te gaan vogelen.


wat is de bedoeling van de code in je openingspost ?
Hoe komt hij aan z'n data, wat moet het sciprt doen etc. ?

Braaikamer - Smoke&BBQ


Verwijderd

Topicstarter
alvast bedankt Zef! Ik kan weer vooruit!

Verwijderd

Topicstarter
code:
1
2
3
4
5
6
7
8
9
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $form{$name} = $value;
    }


Dat is mijn code. Het is gewoon simpel van een tutorial site geplukt. Zo kan ik tenminste een beetje handig me ingestuurde variabelen verwerken. Normaal komt alles als een grote string aan, met deze code splitst ie dat op. Dat moet, helaas is CGI niet zo gemakkelijk als PHP die dat automatisch doet.

Volgens mij draait de site op Perl 4 of 5, ik weet dit niet echt zeker.

Zef, een simpel stukje code dat ik van jouw link heb gebruikt, wordt helaas niet geaccepteerd. Hij komt dan weer met een internal server error. Helaas geeft hij bij cgi niet aan welke regel en wat er fout is.

De input komt gewoon van een simpel HTML form.

Verwijderd

Koffie schreef op 19 augustus 2002 @ 14:33:
Is STDIN juist niet voor input vanaf console :?
Oftewel wat zit er _IN_ die STDIN volgens jou ?
POST variabelen komen via STDIN binnen volgens mij dus dat kan wel kloppen.
Enneuh .. die CGI.pm heb je IMHO niet nodig in deze situatie.
Nodig heb je hem nooit, maar het werkt makkelijk dan zelf alle variabelen te parsen.
Zo te zien heeft de gebruiker alleen maar beschukking over Perl5, en daar niet al teveel verstand van. Lijkt me niet handig om dan meteen met PM's te gaan vogelen.
Misschien niet, maar hij hoeft maar een paar commando's te leren denk ik. En wil hij dat inlog systeem maken zal hij toch wat perl moeten leren.

Verwijderd

Verwijderd schreef op 19 augustus 2002 @ 14:42:
code:
1
2
3
4
5
6
7
8
9
if ($ENV{'REQUEST_METHOD'} eq 'POST') {
    read(STDIN, $buffer, $ENV{'CONTENT_LENGTH'});
    @pairs = split(/&/, $buffer);
    foreach $pair (@pairs) {
        ($name, $value) = split(/=/, $pair);
        $value =~ tr/+/ /;
        $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
        $form{$name} = $value;
    }
Daar mist een accolade (} ) aan het eind, dus als dit ECHT de code is die je gebruikt, is het vrij logisch. Even een } toevoegen aan het eind dus.
Zef, een simpel stukje code dat ik van jouw link heb gebruikt, wordt helaas niet geaccepteerd. Hij komt dan weer met een internal server error. Helaas geeft hij bij cgi niet aan welke regel en wat er fout is.
Ik heb het ook niet getest, ik kan het helaas nu ook niet testen.

Verwijderd

Topicstarter
Daar mist een accolade (} ) aan het eind, dus als dit ECHT de code is die je gebruikt, is het vrij logisch. Even een } toevoegen aan het eind dus.
Gheheeh Zef, zo dom bennik nou ook weer niet. Ik heb wel enige programmeer ervaring. Onder dat stukje code komt me verwerking om te checken of username en password correct zijn. Maar zoals ik al zei, het gaat mis bij STDIN. Dus ik mis geen } { ; " $ @ % of weet ik veel wat.

  • Creepy
  • Registratie: Juni 2001
  • Nu online

Creepy

Tactical Espionage Splatterer

Een internal server error is 99 van de 100 keer gewoon een error in je CGI script (in welke taal dan ook).
Probeer je script eens te runnen vanaf de commandline, krijg je wel mooi je errors precies te zien.

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • odysseus
  • Registratie: Augustus 2000
  • Laatst online: 22:56

odysseus

Debian GNU/Linux Sid

Als je de kans hebt dan zou ik inderdaad eens kijken naar de error.log van de Apache-webserver, of je draait het vanaf de command line. Overigens lijkt het gebruik van CGI.pm me hier toch een hoop eenvoudiger. Je zou iets als het volgende kunnen doen:
code:
1
2
3
4
use CGI qw(:standard);
$query = new CGI;
@params = $query->param;
#en dan iets met @names gaan doen.

Leven is het meervoud van lef | In order to make an apple pie from scratch, you must first create the universe.


  • .oisyn
  • Registratie: September 2000
  • Laatst online: 01-09 21:01

.oisyn

Moderator Devschuur®

Demotivational Speaker

topictitel aangepast

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1