[PHP] Zien vanaf welke pagina functie wordt aangeroepen

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Volgens mij worden alle losse php bestanden op het moment dat het script wordt uitgevoerd door de php interpreter onder elkaar gezet en is er geen sprake meer van losse bestanden. Maar ik kan het fout hebben, en stel daarom voor de zekerheid de volgende vraag:

Is het mogelijk om, zonder een extra parameter mee te geven, te zien vanuit welk php bestand een functie wordt aangeroepen?

Een voorbeeld:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
// common.inc
function foo() {
  if ($calling_page == 'dit.php') {
    return 'functie aangeroepen vanaf dit.php!';
  }
  else if ($calling_page == 'dat.php') {
    return 'functie aangeroepen vanaf dat.php!';
  }
}

// dit.php
include_once('common.inc');
echo foo();

// dat.php
include_once('common.inc');
echo foo();

Als ik het script "dit.php" run, zou de output 'functie aangeroepen vanaf dit.php!' moeten zijn. In het andere geval (dat.php) zou de output 'functie aangeroepen vanaf dat.php!' moeten zijn.

Nogmaals, ik weet dat je eenvoudig een extra parameter in de functie foo() zou kunnen stoppen om de pagina waarvan geroepen wordt te bepalen, maar ik vraag me af of het ook automatisch kan. Ik kon via Google niets vinden, maar misschien heeft iemand hier al eens over hetzelfde nagedacht?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

__FILE__? Sorry, PHP_SELF dus.

[ Voor 60% gewijzigd door NMe op 09-04-2006 21:43 ]

'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!

  • Robtimus
  • Registratie: November 2002
  • Laatst online: 15-06 11:31

Robtimus

me Robtimus no like you

Probeer eens $_SERVER["PHP_SELF"]:
The filename of the currently executing script, relative to the document root. For instance, $_SERVER['PHP_SELF'] in a script at the address http://example.com/test.php/foo.bar would be /test.php/foo.bar.
Ik weet alleen niet of hij de PHP pagina uit de adresbalk haalt of echt de fysieke file. In het laatste geval heb je hier niets aan.

More than meets the eye
There is no I in TEAM... but there is ME
system specs


Acties:
  • 0 Henk 'm!

  • [BoSS]
  • Registratie: Maart 2000
  • Laatst online: 15-06 15:15

[BoSS]

Geen woorden maar daden!

Gebruik makend van de informatie in server-variabelen:
PHP:
1
2
3
4
5
6
7
8
function foo() {
  if ($_SERVER["REQUEST_URI"] == 'dit.php') {
    return 'functie aangeroepen vanaf dit.php!';
  }
  else if ($_SERVER["REQUEST_URI"] == 'dat.php') {
    return 'functie aangeroepen vanaf dat.php!';
  }
}

[ Voor 14% gewijzigd door [BoSS] op 09-04-2006 21:44 ]

20x 170 Wp (Solar Frontier) op ZZO / 54 graden


Acties:
  • 0 Henk 'm!

  • TheLunatic
  • Registratie: April 2001
  • Laatst online: 25-02 08:57

TheLunatic

Ouwe boxen.

B_O_S_S schreef op zondag 09 april 2006 @ 21:43:
Gebruik makend van de informatie in server-variabelen:
PHP:
1
2
3
4
5
6
7
8
function foo() {
  if ($_SERVER["REQUEST_URI"] == 'dit.php') {
    return 'functie aangeroepen vanaf dit.php!';
  }
  else if ($_SERVER["REQUEST_URI"] == 'dat.php') {
    return 'functie aangeroepen vanaf dat.php!';
  }
}
Rrrright. How about:
PHP:
1
2
3
function foo() {
  return "functie aangeroepen vanaf " . $_SERVER["REQUEST_URI"];
}


? ;)

Mother, will they like this song?


Acties:
  • 0 Henk 'm!

  • [BoSS]
  • Registratie: Maart 2000
  • Laatst online: 15-06 15:15

[BoSS]

Geen woorden maar daden!

Uiteraard gaat dat in dit simpele geval goed, maar de topicstarter heeft aangegeven dat hij andere handelingen wil uitvoeren aan de hand van de pagina waar de request vandaan komt. Vandaar deze oplossing. Maar ik moet eerlijk zeggen dat dit wel ruikt naar een scriptrequest, het gebruik van $_SERVER moet toch wel bekend zijn als je met PHP overweg kan?

20x 170 Wp (Solar Frontier) op ZZO / 54 graden


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

Een scriptrequest is dit niet echt, maar inderdaad, PHP_SELF en de rest van het $_SERVER-array moet bij elke PHP-scripter toch wel aardig bekend zijn. Hier was met een beetje moeite best uit te komen zonder een topic op GoT. :)

'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!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 11-06 00:38

NMe

Quia Ego Sic Dico.

En weer open in overleg. Reveller bedoelde net iets anders, en dat zal hij zodra hij hier langskomt vast wel even uit de doeken willen doen. :)

'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!

Anoniem: 26306

Met debug_backtrace kan het wel. Maar dat wil je echt niet buiten debug-code gebruiken. Dan is er gewoon iets mis met je ontwerp.

Acties:
  • 0 Henk 'm!

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Zoals -NMe- al aangaf is het topic weer open na overleg. Mijn vraag was onvolledig en hier is de toevoeging die ik ook naar -NMe- stuurde:
Misschien ben ik in mijn TS niet duidelijk geweest. Het probleem is als volgt: elke request naar mijn website wordt mbv. mod_rewrite afgehandeld door index.php. Bijvoorbeeld: site.com/groenten/winter/witlof/30 wordt index.php?groenten/winter/witlof/30. Via een database check kijk ik wat voor type content groenten/winter/witlof is. In dit geval is dat een artikel. Ik include dan vervolgens artikel.inc. In artikel.inc roep ik de functie foo() aan.

Het probleem is dat PHP_SELF of elke andere $_SERVER variabele index.php als requestende pagina geeft. Mijn vraag was of ik automatisch kon herleiden vanaf welke include de request gemaakt wordt.
Iemand een idee?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Acties:
  • 0 Henk 'm!

  • eborn
  • Registratie: April 2000
  • Laatst online: 12-06 18:46

Acties:
  • 0 Henk 'm!

Anoniem: 26306

Slecht ontwerp dus.
Wat je beter had kunnen doen, is een (abstracte) class of interface maken met een of andere functie die je aan wilt kunnen roepen. Vervolgens maak je voor verschillende soorten inhoud verschillende classes aan die die class extenden (of interface implementeren). Bij een request maak je een instantie van de juiste class aan en voila.

In je commin.inc hoef je dan alleen maar die methode foo() aan te roepen. Dan zoekt een object zelf verder wel uit wat er nog moet gebeuren.

Acties:
  • 0 Henk 'm!

  • user109731
  • Registratie: Maart 2004
  • Niet online
Of zoiets in je include zetten:

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<?php
// common.inc 
// wil je je script private houden hier common.inc.php van maken

function foo() { 
  $included_files = get_included_files();
  $calling_page = basename($included_files[0]);

  if ($calling_page == 'dit.php') { 
    return 'functie aangeroepen vanaf dit.php!'; 
  } 
  else if ($calling_page == 'dat.php') { 
    return 'functie aangeroepen vanaf dat.php!'; 
  } 
} 
?>

Toelichting: het aanroepende bestand is volgens mij altijd het eerste element in de includes-array. Mogelijk pas vanaf PHP5, weet ik niet zeker.

[ Voor 95% gewijzigd door user109731 op 10-04-2006 19:28 . Reden: code wat uitgebreid :) ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Grote prutser schreef op maandag 10 april 2006 @ 19:05:
Of zoiets in je include zetten:

<snip>

Toelichting: het aanroepende bestand is volgens mij altijd het eerste element in de includes-array. Mogelijk pas vanaf PHP5, weet ik niet zeker.
Dat zijn van die undocumented "features" waar je echt ver vanaf wilt blijven als programmeur..

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • JHS
  • Registratie: Augustus 2003
  • Laatst online: 09-06 06:07

JHS

Splitting the thaum.

Reveller: Er moet dus article.inc uitkomen? Zoja, zet gewoon bij het bepalen van de include een constante op die waarde :) . Zoiets:

PHP:
1
2
3
4
5
6
7
8
9
10
include_file($request) {
  /* Do some processing, ends with $type, i.e. article or something like that, 
       then */
  define("REQUEST_TYPE", $type);
  require_once("includes/".$type.".inc");
  /* Or */
  $include_file = $type.".inc"
  define("REQUEST_INCLUDE", $include_file);
  require_once($include_file);
}


Maar eerlijkgezegd denk ik dat * Anoniem: 26306 gelijk heeft, en dat dit nogal tekenen zijn van een niet optimaal ontwerp :) .

Grote Prutser: "Wil je je script private houden hier common.inc.php van maken." En wat nu als je php engine op de een of andere manier uitvalt :) ? In mijn ogen moet je gewoon zo veel mogelijk buiten de webroot zetten, en dan maakt de extentie verder niet zo veel uit.

DM!

Pagina: 1