[PHP] HTTP include

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
Na een tijdje zoeken op GoT, kwam ik dit topic tegen, waarin al werd uitgelegd door LuCarD dat het niet mogelijk is om een return value te geven als je een script include via HTTP. De return is namelijk altijd 1 als het script succesvol is ge-include via HTTP.

Mij probleem is dat in de executie van een (moeder-)script een (dochter-)script van een andere server ge-include wordt en als in dit (dochter-)script aan bepaalde voorwaarden niet wordt voldaan, moet de pagina redirected worden (middels header: Location('etc')) naar een andere pagina en beide scripts stoppen met executie. Dit werkt niet, omdat na het redirecten in het (dochter-)script, het 1ste (moeder-)script vrolijk doorgaat met executeren en er een hoop HTML code uitspuugt, wat de browser in de war stuurt. Die() en exit() in het (dochter-)script verandert hier niks aan en ik kan door bovenstaand probleem niet checken op variabelen in het (dochter-)script.
hopelijk niet te verwarrend verhaal :)

Vraag: hoe kan het (moeder-)script gestopt worden te executeren als het ge-include (dochter-)script dit wil?

Acties:
  • 0 Henk 'm!

  • SWfreak
  • Registratie: Juni 2001
  • Niet online
Via een variabele doorgeven dat het moederscript moet stoppen (* SWfreak doet maar een gok)

Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

Misschien verkeerd begrepen maar waarom maak je van je moederscript geen functie, en dan roep je na die include de functie aan. Zo kan je alles retourneren wat je wil.

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Een die in het dochterscript zorgt er natuurlijk alleen maar voor dat de executie op de dochterserver wordt stopgezet. Het moederscript zal rustig verder gaan. Ook een redirect zal alleen maar gelden voor de verbinding tussen moeder en dochter, en zal dus niks uitmaken voor de verbinding tussen moeder en client (surfer dus). Het makkelijkste om ertegenaan te kijken is om het dochterscript als een statisch bestand te zien. Zo ziet het moeder script het namelijk ook. Een redirect zal er zeer waarschijnlijk gewoon voor zorgen dat de redirect pagina wordt geinclude, of de ridirect opdracht (wat helaas niet het gewenste effect zal hebben aangezien de headers waarin dit staat niet worden meegenomen). Om succes of falen aan te geven zou je aan het eind of in de die van het dochterscript een stukje php kunnen laten uitpoepen. Zoiets als:
PHP:
1
die('<?php $succesfull="ONWAAR"?>')

Door deze voor de include op bv waar te initialiseren kun je na de include nagaan of alles wel of niet is gelukt en in je moederscript de benodigde acties ondernemen.

Denk er wel aan dat zodra er output geweest is dit niet meer terug te halen is, tenzij je dit buffert (met ob_start oid)

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
[ash] schreef op 13 March 2003 @ 14:01:
Misschien verkeerd begrepen maar waarom maak je van je moederscript geen functie, en dan roep je na die include de functie aan. Zo kan je alles retourneren wat je wil.
Hmmz... In het dochterscript bij voldoen aan voorwaarden de functie proceed() van het moederscript aanroepen levert dit op:
Call to undefined function: proceed() in 'dochterscript'.

Waarschijnlijk 'kent' het over HTTP included dochterscript de functie proceed() van het moederscript niet :(...

Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
Janoz schreef op 13 maart 2003 @ 14:06:
Een die in het dochterscript zorgt er natuurlijk alleen maar voor dat de executie op de dochterserver wordt stopgezet. Het moederscript zal rustig verder gaan. Ook een redirect zal alleen maar gelden voor de verbinding tussen moeder en dochter, en zal dus niks uitmaken voor de verbinding tussen moeder en client (surfer dus). Het makkelijkste om ertegenaan te kijken is om het dochterscript als een statisch bestand te zien. Zo ziet het moeder script het namelijk ook. Een redirect zal er zeer waarschijnlijk gewoon voor zorgen dat de redirect pagina wordt geinclude, of de ridirect opdracht (wat helaas niet het gewenste effect zal hebben aangezien de headers waarin dit staat niet worden meegenomen). Om succes of falen aan te geven zou je aan het eind of in de die van het dochterscript een stukje php kunnen laten uitpoepen. Zoiets als:
PHP:
1
die('<?php $succesfull="ONWAAR"?>')

Door deze voor de include op bv waar te initialiseren kun je na de include nagaan of alles wel of niet is gelukt en in je moederscript de benodigde acties ondernemen.

Denk er wel aan dat zodra er output geweest is dit niet meer terug te halen is, tenzij je dit buffert (met ob_start oid)
Kan dit wel? De waarde van $succesfull is toch ook niet bekend in het moederscript met het aanroepen van een die() in het dochterscript waarin je die variabele instelt? Het zijn namelijk twee fysiek gescheiden machines waarbij de PHP code van het dochterscript geparsed wordt voordat het geinclude wordt. Dit is het resultaat wat ik nu heb:
Undefined variable: succesfull in 'moederscript'

Wat bedoel je precies met "Denk er wel aan dat zodra er output geweest is dit niet meer terug te halen is, tenzij je dit buffert (met ob_start oid)"? (Voor mij onbekend).

Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 17-09 14:46

TheDane

1.618

in je moederscript zoiets doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// .. do initial stuff

include('dochterscript.inc.php');

$rval = DochterProcess(); // proces uit geinclude dochterscript
// $rval === false als er iets in DochterProcess() misgaat 

if (!$rval) {
 exit; // kappen als rval false is
}

// .. continue met code

Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
TheDane schreef op 13 maart 2003 @ 14:24:
in je moederscript zoiets doen:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
// .. do initial stuff

include('dochterscript.inc.php');

$rval = DochterProcess(); // proces uit geinclude dochterscript
// $rval === false als er iets in DochterProcess() misgaat 

if (!$rval) {
 exit; // kappen als rval false is
}

// .. continue met code
Het aanroepen van DochterProcess() levert helaas geen juiste return op en dus een parse error bij het checken op $rval. Kan DochterProcess() wel aangeroepen worden door het moederscript na de HTTP include?

edit:
oftewel: Fatal error: Call to undefined function: dochterprocess() in 'moederscript'

[ Voor 9% gewijzigd door Ivar op 13-03-2003 14:45 ]


Acties:
  • 0 Henk 'm!

  • [ash]
  • Registratie: Februari 2002
  • Laatst online: 05-04 18:06

[ash]

Cookies :9

a) toon eens (het belangrijke deel van) je dochterscript ??
b) hoe return jij die values ??

Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
moederscript:
PHP:
1
2
3
4
5
6
7
8
9
10
11
    error_reporting(E_ALL);
    $rval = 0;
    session_start();
    include("http://www.URL.nl/authenticate.php?sessid=$sessid");
    $rval = DochterProcess();
    if (!$rval) {
        die();
    } 
    else {
         // continue execution
    **KNIP**


dochterscript:
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
        **KNIP**
    if ($access) {
        // access to the module is denied
        include_once("start_page.inc");
        print paragraph($strAccessDenied);
        print go_back($strGoBack);
        include_once("end_page.inc");
        $val = 0;
        die('<?php $succesfull="ONWAAR"?>');
    }
    else {
        // access to the module is granted
                 **KNIP**
        include("includes/header.inc");
        include("start_page.inc");
        $val = 1;
        die('<?php $succesfull="WAAR"?>');
    }
    }
    
    function DochterProcess() {
        return $val;
    }

    **KNIP**

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Ivar schreef op 13 March 2003 @ 14:22:
[...]

Kan dit wel? De waarde van $succesfull is toch ook niet bekend in het moederscript met het aanroepen van een die() in het dochterscript waarin je die variabele instelt? Het zijn namelijk twee fysiek gescheiden machines waarbij de PHP code van het dochterscript geparsed wordt voordat het geinclude wordt. Dit is het resultaat wat ik nu heb:
Undefined variable: succesfull in 'moederscript'
Daarom zeg ik ook in moederscript initialiseren op WAAR. Het hele punt is juist dat alle code van dochterscript op dochterserver worden uitgevoerd. Precies zoals je zegt. Je krijgt alleen het resultaat terug. Waneer je nu zorgt dat het resultaat bestaat uit php code dan wordt dit resultaat op de moederserver uitgevoerd.
Wat bedoel je precies met "Denk er wel aan dat zodra er output geweest is dit niet meer terug te halen is, tenzij je dit buffert (met ob_start oid)"? (Voor mij onbekend).

Zodra je wat naar je client hebt gestuurd (met echo of door iets wat buiten de <? ?> tags staat kun je dat niet meer 'ongedaan' maken. Als je dus, voordat je erachter komt dat vanalles fout gaat, al een heleboel html verstuurd hebt zal dat altijd boven je foutmelding terecht komen.

------

Bedenk trouwens wel dat sessies slechts op 1 server gelden...

[ Voor 3% gewijzigd door Janoz op 13-03-2003 14:57 ]

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • TheDane
  • Registratie: Oktober 2000
  • Laatst online: 17-09 14:46

TheDane

1.618

Ivar schreef op 13 March 2003 @ 14:33:
[...]

Het aanroepen van DochterProcess() levert helaas geen juiste return op en dus een parse error bij het checken op $rval. Kan DochterProcess() wel aangeroepen worden door het moederscript na de HTTP include?

edit:
oftewel: Fatal error: Call to undefined function: dochterprocess() in 'moederscript'
als er in je include file een functie staat, dan kun je die gewoon aanroepen als de file geinclude is .. dat zou 't probleem niet kunnen zijn volgens mij.

lukt 't includen eigenlijk wel ?
anders zul je 't met een http GET request moeten doen ...
dus socket openen, request sturen, data lezen, en dan kijken wat voor output je krijgt, en die in je moederscript interpreteren

Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

Uitgebreidere reactie op stukje source:

Ten eerste is het natuurlijk onmogelijk om DochterProcess() aan te roepen op deze manier. Zal een mooie boel worden zeg. Dan maak ik ook mijn eigen scriptje waarin ik de parse functie "makeModerator("Janoz")" aanroepen (owh nee, hjoeft niet meer)..

In principe zou het moeten werken door te kijken of succesfull gelijk is aan waar of onwaar. Test trouwens ook ff of het dochterscript wel teruggeeft wat je zou verwachten.

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Janoz
  • Registratie: Oktober 2000
  • Laatst online: 16-09 09:15

Janoz

Moderator Devschuur®

!litemod

TheDane schreef op 13 maart 2003 @ 14:58:
[...]


als er in je include file een functie staat, dan kun je die gewoon aanroepen als de file geinclude is .. dat zou 't probleem niet kunnen zijn volgens mij.
Dit is niet het geval (tenminste, voor zover ik het begrijp). De php wordt namelijk geparsed door de dochterserver en alleen de output van het script wordt in het moederscript ingevoegd.
lukt 't includen eigenlijk wel ?
anders zul je 't met een http GET request moeten doen ...
dus socket openen, request sturen, data lezen, en dan kijken wat voor output je krijgt, en die in je moederscript interpreteren

Ken Thompson's famous line from V6 UNIX is equaly applicable to this post:
'You are not expected to understand this'


Acties:
  • 0 Henk 'm!

  • Ivar
  • Registratie: Februari 2001
  • Laatst online: 20-07-2022
Janoz, heb inderdaad het initialiseren van de var over het hoofd gezien... het lijkt te werken! Ga er nog even mee aan de slag, laat het wel weer weten als het toch niet lukt. Alvast bedankt allemaal.
Pagina: 1