Avatar billede monarq Praktikant
13. april 2000 - 23:55 Der er 25 kommentarer og
1 løsning

Parameteroverførsel til main() fra form på html-side.

Jeg har forgæves forsøgt at hente inputtet fra formen:

<HTML>
<HEAD>
    <TITLE>test</TITLE>
</HEAD>
<BODY>
<FORM  ACTION="/cgi-bin/se_log.exe" METHOD="GET">
    <INPUT TYPE="text" NAME="number" SIZE="10" MAXLENGTH="10">
    <INPUT TYPE="submit">
</FORM>
</BODY>
</HTML>

med C-scriptet:

#include <iostream.h>
void main(int tal, char *talx[])
{
  if(tal>1) cout << "\n" << talx[1] << endl;                    //  udskriver input.
  else cout << "\n" <<tal <<" Forkert Kald" << endl;      //  udskriver Forkert Kald hvis ingen input.
}

- hvor tal er antal input og talx er selve inputtet.
Det ser ud som om at scriptet kun ser ét input da kaldet ser således ud ved intastning af tallet 5 i formen:

.../se_log.exe?number=5/

Outputtet er altid ”Forkert Kald” uanset hvad jeg giver af input.
Jeg bruger VC++.
Har I en løsning på problemet ? ?
Avatar billede kh@ingenioer Nybegynder
14. april 2000 - 14:14 #1
Tag lige og kig på CGI igen, jeg mener ikke at CGI sender data som program parametre - jeg kan bare ikke huske hvordan det så gør det?
Jeg er ikke helt sikker!
Avatar billede monarq Praktikant
14. april 2000 - 15:38 #2
Jeg har set andre Cpp-scripts, der har samme main-kald og som virker, men i disse scripts kan man ikke se headerfilen, hvor guldkornene er.
Avatar billede ultik Nybegynder
17. april 2000 - 10:47 #3
Jeg mener altså også at CGI sender data igennem det der hedder standard in.... Og jeg mener også at hvis man skal bruge den syntaks ovenfor, så SKAL man vist bruge argc og argv,,,,,,,,, Jeg tror nok de er keywords, men her må jeg nok sige mig knap så sikker !
Avatar billede monarq Praktikant
18. april 2000 - 16:02 #4
Tak for budet ultik, men selv med argc og argv er fejlen stadig den samme.
Se evt. scriptet i funktion på: http://212.10.18.88/testlog.html
Avatar billede roadkill Nybegynder
19. april 2000 - 13:13 #5
Hvis du har et program på formen

int main(int argc, char **argv)

så er argv[0] altid programmets navn. Da en HTML form appender alle argumenter til det kaldte script med et ? og så argumenterne som navn1=værdi1&navn2=værdi2&..., så vil du altid få alle dine form-argumenter med i argv[0] - med mindre, du kan snyde formen til at sætte mellemrum ind, så den istedet for at kalde
/cgi-bin/se_log.exe?number=1
kalder
/cgi-bin/se_log.exe number=1
I det sidste tilfælde vil argv[1]=number=1
Avatar billede roadkill Nybegynder
19. april 2000 - 13:14 #6
Til ultik:

Generelt, så er argv og argc altså IKKE keywords, men bare parametre til main-funktionen (det eneste, der er navngivet på forhånd er main!) Du kunne kalde dem a og b eller tal og talx og resultatet ville blive det samme.
Avatar billede monarq Praktikant
19. april 2000 - 15:14 #7
Til roadkill.

Som jeg har forstået på dig, ville formens indhold komme med i kaldet, hvis kildekoden ser ud som følger:

#include <iostream.h>

void main(int argc, char *argv[])
{
    cout << "\n" << argv[0] << endl;
}

Dette er dog ikke tilfældet.
Se evt. resultatet på ovenstående url.

-skriv endelig hvis du har andre bud.
Avatar billede ultik Nybegynder
19. april 2000 - 15:20 #8
roadkill -> ok ! det var jeg ikke klar over.
Avatar billede roadkill Nybegynder
19. april 2000 - 20:21 #9
Okay, jeg tog fejl. Men dit problem er stadig, at FORMen tror, den skal angive parametrene til dit script ved at appende ? og navn=værdi til scriptes navn, inden det køres. Det virker for php3-scripts og perl-ditto, men ikke for en exe-fil!

Hvis du skriver se_log.php3?number=1, så fatter php3-scriptet, at du vil sætte number=1. Hvis du vil gøre det samme til en exe fil, så skal du skrive
se_log.exe number=1 (el. lignende.) Problemet er altså, at FORMen tror, din cgi kan tage argumenter ligesom alle andre cgi'er. Hvodden du får den til at gøre det rigtigt, aner jeg dog ikke...

Avatar billede roadkill Nybegynder
19. april 2000 - 20:35 #10
En Bilka-løsning.

Istedet for at bruge /cgi-bin/se_log.exe som ACTION i din form, brug istedet dette PHP3-script:

<?php
EscapeShellCmd("/cgi-bin/se_log.exe $number"); // kan udvides til at tage alle argumenter, du vil bruge
?>

Grimt, men effektivt:
Avatar billede monarq Praktikant
21. april 2000 - 19:05 #11
roadkill->
Scriptet har hele tiden virket ved en alm. dosprompt med "filnavn.exe parameter1" men ikke når det kører fra serveren - det er det, der er problemet.

PHP3 kender jeg ikke meget til og her ikke hensigten forløbig. Først skal C-scriptet virke.
Avatar billede roadkill Nybegynder
21. april 2000 - 20:57 #12
Ja, men det er jo osse det, jeg siger, for hylan!

Når du starter dit C-script fra en DOSpromt, så angiver du parametre ved at skrive dem efter filnavnet, adskilt (fra hinanden og fra filnavnet) af MELLEMRUM. Når du kører et (hvilkensomhelst) script via en HTML FORM, så angives de parametre, der kommer fra FORMen med ? mellem scriptnavn og første parameter og med & mellem resten af parametrene. Det, som mit lille Bilkascript gør er bare at tage argumenterne fra FORMen og kalde C-scriptet på den korrekte måde!
Avatar billede monarq Praktikant
21. april 2000 - 22:13 #13
roadkill->
Jeg troede, at du ville have mig til at benytte et php3-script i stedet for C.

Det ser ud til at være tæt på, men der er stadig en mindre fejl.
I error.log'en skrives fejlen:
Filename is not valid: c:/programmer/apachegroup/apache/htdocs/< -hvilket vel skulle være i mit cgi-dir.

Prøv scriptet på: http://212.10.18.88/testlog1.html
Avatar billede roadkill Nybegynder
22. april 2000 - 10:11 #14
Du skal ikke sætte mit lille script in i ACTION-feltet, men istedet lægge det i cgi-bin som en fil (fx. se_log.php3) og så sætte ACTION=se_log.php3. Så skulle det virke
Avatar billede monarq Praktikant
22. april 2000 - 12:49 #15
roadkill ->
Der er stadig ingen output.

-vender tilbage senere i dag med detaljer - se evt. http://212.10.18.88/testlog2.html
Avatar billede monarq Praktikant
23. april 2000 - 00:03 #16

Detaljer...

* * * se_log.php3 * * *

<html>
<body>
<?php
EscapeShellCmd("/cgi-bin/se_log.exe $number")
?>
</body>
</html>

* * * se_log.exe * * *

#include <iostream.h>

void main(int argc, char *argv[])
{

    if(argc>1) cout << "\n" << argv[1] << endl;
    else cout << "\nForkert kald" << endl;
    cout << "\nSes dette er scriptet kaldt" << endl;
}

******************
Som det kan ses på http://212.10.18.88/testlog2.html virker scriptet stadig ikke - damn.
- hva' så?
Avatar billede roadkill Nybegynder
23. april 2000 - 00:04 #17
Prøv at tilføje følgende linie inden EscapeShellCmd :

echo("Executing /cgi-bin/se_log.exe $number");

Så skulle du helst få linien skrevet ud, når du submitter...

Og prøv så for øvrigt lige at ændre METHOD="post" til METHOD="get"... Jeg er ikke sikker, men jeg tror ikke, det kan virke med post...
Avatar billede monarq Praktikant
23. april 2000 - 00:14 #18
Så er method ændret -jeg havde dog også selv prøvet både med post og get.

php-filen ser nu ud som følger:

<html>
<body>
<?php
echo("Executing /cgi-bin/se_log.exe $number");
EscapeShellCmd("/cgi-bin/se_log.exe $number");
?>
</body>
</html>

------------
variablen udskrives nu.

Avatar billede roadkill Nybegynder
23. april 2000 - 10:29 #19
Ja, undskyld, det er jo mig, der er en idiot! Selvfølgelig virker dette ikke - når du fyrer se_log.exe af fra et PHP3-program, så udføres det godt nok - men output fra det bliver jo ikke præsenteret på HTML-siden. Hvad kan jeg sige, jeg var vist lidt distret... Okay, jeg har ET forslag tilbage, og så opgiver jeg. Problemet her er som sagt, at dit C-script udføres indefra PHP3-scriptet. Prøv istedet dette:

<html>
<body>
<script>
<?php
echo("location.href=\"/cgi-bin/se_log.exe $number\";\n");
?>
</script>
</body>
</html>

Dette PHP3-script laver et JavaScript, som flytter browserens lokation... Jeg vil ikke garantere, at det virker, da jeg ikke har mulighed for at teste det selv - og fordi jeg er lidt usikker på, hvad browseren gør ved det 'hængende' parameterargument. Hvis det her ikke virker, så gi'r jeg op.
Avatar billede roadkill Nybegynder
23. april 2000 - 11:05 #20
Og for øvrigt er der en lille ting, der undrer mig: Jeg har prøvet at køre dit se_log.exe script direkte i min browser (ved at skrive http://212.10.18.88/cgi-bin/se_log.exe) og jeg får bare en Save As... prompt op, hvilket jo er, hvad browseren gør, når den fil, man peger på, ikke har en extension, som webserveren ved, hvad den skal gøre ved... fx .zip, .bat eller måske .exe, hvis webserveren ikke er sat op til at køre executables som scripts!
Avatar billede monarq Praktikant
23. april 2000 - 11:22 #21
Hvis jeg klikker på det link du har skrevet får jeg ikke save as.. men:

Forkert kald

Ses dette er scriptet kaldt

hvis du skriver: http://212.10.18.88/testlog.html

køres scriptet også.
Avatar billede monarq Praktikant
23. april 2000 - 11:29 #22
Resultatet af
echo("location.href=\"/cgi-bin/se_log.exe $number\";\n");
ses på http://212.10.18.88/testlog2.html

- hvilket desværre heller ikke vil fungere.
->roadkill - tak for din ihærdighed.
Avatar billede roadkill Nybegynder
23. april 2000 - 13:28 #23
Jeg får Save as-popup'pen, når jeg bruger Netscape - og 'forkert kald', hvis jeg bruger MSIE... Mærkeligt... Jeg tror ikke, din webserver er helt korrekt sat op... Eller osse er Netscape bare smådum. Gider du ikke lige lave om, så se_log.exe udskriver argc og argv[0..argc].... Så vil jeg lige prøve at lege lidt med lortet...
Avatar billede monarq Praktikant
24. april 2000 - 00:24 #24
Serveren skulle nu afvikle exe-scripts på serveren, også ved Netscape - forhåbentligt.

Cpp-scriptet ser nu ud som følger:

#include <iostream.h>

void main(int argc, char *argv[])
{
    // Antal ord.
    cout << "\nargc: " << argc << endl;
   
    // Navn på eksekverbar fil.
    cout << "\nargv[0]: " << argv[0] << endl;

    // Hvis appendede parametre, udskriv da.
    if(argc>1) cout << "\nargv[1]: " << argv[1] << endl;
    else cout << "\nIngen parametre i argv[1]." << endl;
   
    // Udskriv altid.
    cout << "\nSes dette er scriptet kaldt" << endl;
}

Jeg går ud fra, at det var det du mente.
Avatar billede tuxen Nybegynder
24. april 2000 - 18:38 #25
Ved Kald af et C prog via CGI, skal der læses fra standardin Cin. Dette kan Gøres ved både Post og Get.
Hvis du bruger GET, kan du ligeledes rekvirere en miljø variabel der indeholder din querystring (Number=4&bla=john), det gøres med
Getenv("QUERY_STRING"), så kan du selv parse den. Del den i par ved & tegn og navn - værdi ved = tegn. Husk at blanktegn er blevet til + tegn, de skal laves om.
Venlig hilsen Thue Tuxen
Avatar billede monarq Praktikant
24. april 2000 - 19:31 #26
Det var lækkert - nu virker det.
resultatet kan ses på:
http://212.10.18.88/testlog.html

**Cpp-kildekode*************************

#include <iostream.h>
#include <stdlib.h>

void main()
{
    char *udskriv;

    udskriv = getenv("QUERY_STRING");
   
    if( udskriv != NULL ) cout << "\nVariable er: " << udskriv << endl;

    cout << "\nscriptet kaldt.";

}

****************************************
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester