[PHP] formulier posten naar andere server, $_POST is leeg

Pagina: 1
Acties:
  • 140 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
Ik zit met het volgende probleem.

Ik heb een scriptje gemaakt, werkt goed, echter alleen op een linux server. De host die ik gebruik zit echter met een windows systeem, waar bepaalde functies niet beschikbaar zijn in PHP.

Nu heb ik het scriptje lopen op de linux server en include ik het in een script dat op de windows server draait.
Nu is het zo dat het eerste scriptje goed geinclude wordt (is ook niet meer dan een simpel formpje).
Vanuit die form submit ik naar een 2e form. dit werkt direct op de linux bak goed, echter, als ik het doe dmv een include worden de POST gegevens niet meegestuurd.

dmv
PHP:
1
echo $_POST['naam'];

probeer ik te kijken of de postgegevens wel op het 2e form aankomen, dat gebeurt echter niet.

Wat ik me afvraag is of het mogelijk is om de gegevens dmv $_POST over te sturen naar een andere server dan degene waarvan het script wordt opgevraagd.

Het script geeft alleen wat info terug adhv de ingevoerde waarde, verder zitten er geen complexe bewerkingen achter.

Naam.php
PHP:
1
2
3
4
5
<?

include ("http://urlvandeserver/naam.php");

?>


Naam2.php

PHP:
1
2
3
4
5
<?

include ("http://urlvandeserver/naam.php2");

?>


Dit zijn de scripts zoals ze op de windows server staan.

Iemand een idee hoe ik die info toch kan oppikken.

ik heb al geprobeerd dmv een $_GET te werken, maar dat wil hij ook niet pikken en ik stuur liever de gegevens niet in de URL mee.
Ik heb ook zitten denken aan sessies, maar gezien die op een server worden opgeslagen en ik met 2 servers zit is dat ook geen optie.

Acties:
  • 0 Henk 'm!

  • rb338
  • Registratie: Januari 2001
  • Laatst online: 05-01 12:58
Is dit niet wat?

edit: nee is niks :+

edit2:
Als jij zo'n php script include vanaf een andere server krijg je toch ook gewoon de geparsete (vaag woord) code terug?
Dan zou je zo'n constructie kunnen proberen:

script.php op de linux server, schrijft POST data weg naar 'n file of database
script2.php op de linux server, haalt die POST data op en poept 'm uit als plain text, bv. waarde1;waarde2;waarde3

script3.php op de Windows server haalt script2.php op en doet er wat mee.

edit3:
Of je laat script2.php hidden form values uitpoepen en include die in script3.php tussen je <form> en </form> :)

[ Voor 104% gewijzigd door rb338 op 18-05-2005 14:18 ]


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

Hoe zit je form-tag in elkaar in HTML? Wat krijg je te zien als je op de pagina waarnaar je verzendt een print_r($_POST) doet? Doe je geen gekke dingen met unset()?

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
die site geeft hier een time-out :(

Acties:
  • 0 Henk 'm!

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 21:47

Creepy

Tactical Espionage Splatterer

Als ik je goed begrijp wil je POST variabelen gana benaderen in een remote geinlude scripts?

Variabelen in het script waarin de include ook staat werken niet in het geinclude scripts als dat
geinclude script NIET lokaal staat.

met een include('blaat.php') gaat het prima werken, echter met een include('http://www.andereserver.nl/blaat.php') niet. PHP geeft niet automagische alle varabialen door naar die andere server ;)

Iets wat overigens prima staat uitgelegd in de documentatie van PHP en ook hier al eens voorbij is gekomen. De enige optie is om met GET params te gaan werken.
Van http://nl3.php.net/manual/nl/function.include.php
If the include()ed file is called via HTTP using the fopen wrappers, and if the target server interprets the target file as PHP code, variables may be passed to the include()ed file using an URL request string as used with HTTP GET. This is not strictly speaking the same thing as include()ing the file and having it inherit the parent file's variable scope; the script is actually being run on the remote server and the result is then being included into the local script.

[ Voor 5% gewijzigd door Creepy op 18-05-2005 14:17 ]

"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


Acties:
  • 0 Henk 'm!

  • Blorgg
  • Registratie: Juni 2001
  • Niet online
Dat is niet helemaal waar. Je kan ook prima posten naar een andere server hoor :)
POST heeft als(klein) voordeel dat er geen ingevoerde gegevens in de history van je browser blijven staan. Denk aan username/password combos.

Maar zoals je aangeeft werken includes alleen voor lokale bestanden. Dus ik denk dat TS zn scripts een beetje aan zal moeten gaan passen zodat alles wat nodig is om de POST(of GET) data te verwerken aanwezig is op de andere server.

[ Voor 19% gewijzigd door Blorgg op 18-05-2005 14:21 ]


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
-NMe- schreef op woensdag 18 mei 2005 @ 14:14:
Hoe zit je form-tag in elkaar in HTML? Wat krijg je te zien als je op de pagina waarnaar je verzendt een print_r($_POST) doet? Doe je geen gekke dingen met unset()?
PHP:
1
2
3
4
5
6
7
<FORM METHOD="POST" ACTION="naam2.php">

<INPUT TYPE="text" NAME="naam">

<INPUT TYPE="submit">

</FORM>


zoals je ziet is dit zo'n beetje het meest eenvoudige formpje dat je kunt bedenken. doe dus verder niets met unset.

als ik in naam2.php echter een print_r($POST) doe krijg ik dit terug:
Array ( [naam] => blaat )

dat komt verder overeen met wat ik invul.

echter, de $_POST wordt verder niet meer meegenomen in de file op de linux server.
als ik hier een print_r($_POST) krijgi k enkel array () mee.

Dus het lijkt alsof de gegevens niet in het geinclude script terecht komen (en afaik moet dat wel werken).

Acties:
  • 0 Henk 'm!

  • rb338
  • Registratie: Januari 2001
  • Laatst online: 05-01 12:58
Heb hierboven mijn post aangepast trouwens, volgens mij is dat gewoon de oplossing ;)

Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
rb338 schreef op woensdag 18 mei 2005 @ 14:25:
Heb hierboven mijn post aangepast trouwens, volgens mij is dat gewoon de oplossing ;)
Ik zie eerlijk gezegd niet hoe ik het hiermee kan oplossen. Ik moet toch op een manier de gegevens van het ene script zien te posten naar het andere. Door het als plaintext neer te plempen kom ik er niet mee verder denk ik.

Ik zal eens proberen dmv een get info mee te sturen met het include script.

Acties:
  • 0 Henk 'm!

  • JochemK
  • Registratie: Maart 2003
  • Laatst online: 20-09 15:34
Kun je niet gewoon de action naar de linux bak laten verwijzen of heb ik je nou verkeerd begrepen?

Acties:
  • 0 Henk 'm!

  • GX
  • Registratie: Augustus 2000
  • Laatst online: 14-05 09:40

GX

Nee.

Doe voor de grap eens var_dump(get_defined_vars()); in je te laden bestand en kijk eens of uberhaupt $_POST, $_REQUEST of $_GET bestaat (ik heb immers geen idee hoe antiek je PHP versie is).

Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
kingjotte schreef op woensdag 18 mei 2005 @ 14:30:
Kun je niet gewoon de action naar de linux bak laten verwijzen of heb ik je nou verkeerd begrepen?
nope, dat is geen oplossing, omdat het op 1 en hetzelfde adres moet blijven (vanuit de gebruiker gezien). Dus die hoeft niet te weten dat het script op een andere server draait.

het lijkt nu te werken.
wat ik gedaan heb is:

PHP:
1
2
3
4
5
6
7
<?

$naam = $_POST['naam'];

include ("http://andereserver/blaat.php?naam=$naam");

?>


de reden dat mijn $_GET net niet werkte is omdat ik het direct probeerde (dus meesturen met de URL naar de windows server en dan door het script op laten vragen op de linux bak, ofwel, exact zelfde gezever als met de $_POST manier.

* TERW_DAN gaat weer even verder testen.

Acties:
  • 0 Henk 'm!

  • rb338
  • Registratie: Januari 2001
  • Laatst online: 05-01 12:58
Nou, volgens mij zit het zo.

Het script op je Windows bak wil dus iets van je linux bak hebben. Dat doe jij met een include. Zoals hierboven al wordt gezegd, wordt een remote php script (die op je linux bak dus) gewoon eerst geparsed en dan pas naar jouw Windows bak gestuurd.

Dat ie het parsed voordat je Windows bak het krijgt is natuurlijk geen probleem, echter kan je dan niet meer met de POST variable werken. Wat je dus kan doen is een scriptje aanmaken op de linux doos die je POST variabelen oppikt en omzet naar text die jouw Windows bak wel te zien kan krijgen.

Dus als script1.php op je linux bak $_POST['bla'] moet doorgeven aan script3.php op je Windows bak, laat je script1.php die POST data ergens wegschrijven en maak je script2.php aan die dat weer ophaalt en omzet naar bijvoorbeeld <input type="hidden" name="bla" value="bleh">. Als je dan script2.php include op je Windows bak krijg je gewoon direct de html code met alle POST data.

Toegegeven, dit is een érg omslachtige manier, maar wees blij dat het niet anders kan :)

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Er zijn een aantal manieren om dit simpel op te lossen:
- meegeven als GET-data (al eerder genoemd)
- meegeven als POST-data (zelf een functie include_with_postdata() maken die zelf via fsockopen() de pagina ophaalt)
- de te includen pagina een andere extensie geven (bijvoorbeeld index.txt), en zorgen dmv .htaccess dat hij alleen opgehaald mag worden van de server waarop je normale script draait ivm veiligheid)

Die laatste mogelijkheid valt af voor jou, want dan wordt hij op de bak geparset waar juist die functies ontbreken.

[ Voor 13% gewijzigd door GlowMouse op 18-05-2005 14:46 ]


Acties:
  • 0 Henk 'm!

  • TERW_DAN
  • Registratie: Juni 2001
  • Niet online

TERW_DAN

Met een hamer past alles.

Topicstarter
rb338 schreef op woensdag 18 mei 2005 @ 14:39:
Nou, volgens mij zit het zo.

Het script op je Windows bak wil dus iets van je linux bak hebben. Dat doe jij met een include. Zoals hierboven al wordt gezegd, wordt een remote php script (die op je linux bak dus) gewoon eerst geparsed en dan pas naar jouw Windows bak gestuurd.

Dat ie het parsed voordat je Windows bak het krijgt is natuurlijk geen probleem, echter kan je dan niet meer met de POST variable werken. Wat je dus kan doen is een scriptje aanmaken op de linux doos die je POST variabelen oppikt en omzet naar text die jouw Windows bak wel te zien kan krijgen.

Dus als script1.php op je linux bak $_POST['bla'] moet doorgeven aan script3.php op je Windows bak, laat je script1.php die POST data ergens wegschrijven en maak je script2.php aan die dat weer ophaalt en omzet naar bijvoorbeeld <input type="hidden" name="bla" value="bleh">. Als je dan script2.php include op je Windows bak krijg je gewoon direct de html code met alle POST data.

Toegegeven, dit is een érg omslachtige manier, maar wees blij dat het niet anders kan :)
Maar dan zit je dus met het probleem dat je geen $_POST kan doorgeven naar de linuxbak (tenminste, niet zonder een $_GET te gebruiken).
Want met een hidden field blijft het natuurlijk een $_POST die hij doorgeeft.
GlowMouse schreef op woensdag 18 mei 2005 @ 14:44:
Er zijn een aantal manieren om dit simpel op te lossen:
- meegeven als GET-data (al eerder genoemd)
[...]
- meegeven als POST-data (zelf een functie include_with_postdata() maken die zelf via fsockopen() de pagina ophaalt)
[...]
- de te includen pagina een andere extensie geven (bijvoorbeeld index.txt), en zorgen dmv .htaccess dat hij alleen opgehaald mag worden van de server waarop je normale script draait ivm veiligheid)

Die laatste mogelijkheid valt af voor jou, want dan wordt hij op de bak geparset waar juist die functies ontbreken.
precies, die laatste mogelijkheid valt af (anders had ik dat bestandje gelijk wel op de windows bak gezet, ik kan vanaf hier op beide servers komen namelijk.

Acties:
  • 0 Henk 'm!

  • GlowMouse
  • Registratie: November 2002
  • Niet online
Even een functie gemaakt en half getest. Let op dat hij ook echt alle post data meestuurt. Misschien zit er iets bij wat je liever niet mee wilt sturen.
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
function include_with_postdata($url) {
    $body = false;
    $postdata = '';
    $buffer = '';
    $url = parse_url($url);

    // Alle te posten data verzamelen
    foreach($_POST as $post_key => $post_data) {
        $postdata .= $post_key . '=' . $post_data . '&';
    }

    // Laatste ampersand weghalen
    $postdata = substr($postdata,0,-1);


    // Bereid request voor
    $out  = 'POST ' . $url['path'] . '?' . $url['query'] . " HTTP/1.0\r\n";
    $out .= 'Host: ' . $url['host'] . "\r\n";
    $out .= 'Content-Type: application/x-www-form-urlencoded' . "\r\n";
    $out .= 'Content-Length: ' . strlen($postdata) . "\r\n\r\n";
    $out .= $postdata;

    // Maak verbinding, en haal de zut op
    $fp = fsockopen($url['host'],80);
    fwrite($fp, $out);
    while (!feof($fp)) {
        $s = fgets($fp, 1024);
        if ($body) {
            $buffer .= $s;
        }
        elseif($s == "\r\n") {
            $body = true;
        }
    }
    fclose($fp);
    return $buffer;
}
Pagina: 1