[PHP] relatieve verwijzing TE relatief

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ik werk aan een systeem waar verschillende bestanden naar elkaar kunnen verwijzen. Dit zijn bestanden van verschillende typen dus heb ik een structuur aangebracht:

root
- do_
    do_login.php
    do_logout.php
    etc...
- func_
    func_getcomments.php
    func_geteditor.php
    etc...
- ini_
    ini_config.php
- use_
    use_mysqlconnect.php
index.php
login.php


Ik wil nu dat deze allemaal ini_/ini_config.php inladen. Daarvoor dacht ik deze code te kunne gebruiken:
PHP:
1
require_once('../ini_/ini_config.php');


Echter loop ik nu tegen het probleem aan dat al deze bestanden ge-required door andere bestanden en dat index.php ook van deze codes gebruikt maakt. en dan kan klopt het relative pad niet meer. (index.php bevind zich in een ander pad dan func_geteditor.php)

Nu is mijn vraag hoe los ik dit op?

- Ik weet nooit zeker hoe he bestand heet wat de include uitvoert. Het systeem moet vaker ingezet worden dus het kan maar zo zijn dat jantje index.php type3.php noemt o.i.d.

- Er moet altijd verwezen worden naar het correcte pad ("/home/(...)/public_html/sitenaam"), maar dit exacte pad weten we niet. dit wordt gedefineerd in ini_config.php

- Het systeem moet meerdere malen ingezet kunnen worden. Een absoluut pad kan dus niet zomaar.

Weet iemand een oplossing?

Acties:
  • 0 Henk 'm!

  • Megamind
  • Registratie: Augustus 2002
  • Laatst online: 10-09 22:45
Er zijn manieren om je root op te halen.

Zoek maar eens in phpinfo(), of je kan ook getcwd gebruiken.

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

index.php includet alles wat je hebben moet, toch? Maak in dat geval alle includes in aparte bestanden relatief aan index.php. :)

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

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

Je zou in elke directory een bestand genaamd root.php kunnen zetten, met daarin een relatieve verwijzing naar de root. In 1 level diep zet je bijvoorbeeld het bestand root.php met als inhoud:
PHP:
1
define('ROOT', '../');

En in een subdirectory daarvan ook een bestand root.php met als inhoud:
PHP:
1
define('ROOT', '../../');

In de root zelf kun je ook zo'n bestand zetten, die zou deze inhoud krijgen:
PHP:
1
define('ROOT', './');

Aan het begin van elk script zet je dan simpelweg:
PHP:
1
include('root.php');

Dan weet de rest van het script waar hij de root moet vinden. Vanuit een willekeurige directory kan een script dan simpelweg bijvoorbeeld doen:
PHP:
1
require_once(ROOT.'ini_/ini_config.php');

Het werkt prima, maar zelf gebruik ik het nooit. Ik heb deze oplossing ooit eens ergens op het net zien staan en vond hem wel leuk bedacht.

[ Voor 8% gewijzigd door Bergen op 03-06-2009 02:04 ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Als je vanuit index.php include('inc/a.php'); doet, en in a.php wil je b.php includen die óók in de inc-map staat, dan moet je alsnog zo includen voor zover ik weet: include('inc/b.php');

Includes zijn, tenzij het recentelijk veranderd is, relatief aan je huidige working directory, en je working directory is gelijk aan de directory van je entry-level script. In dit geval waarschijnlijk index.php.

Zoals ik al zei: al je includes (ook includes ín includes) relatief maken aan de map waarin je entry level script staat en het probleem zou opgelost moeten zijn. :)

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

  • Bergen
  • Registratie: Maart 2001
  • Laatst online: 07-09 11:44

Bergen

Spellingscontroleur

NMe schreef op woensdag 03 juni 2009 @ 02:31:
Includes zijn, tenzij het recentelijk veranderd is, relatief aan je huidige working directory, en je working directory is gelijk aan de directory van je entry-level script. In dit geval waarschijnlijk index.php.
Klopt, is nog steeds zo. PHP zal echter wel in meerdere directories zoeken om de include. Stel je hebt deze bestanden:
PHP: index.php
1
include('inc/a.php');

PHP: inc/a.php
1
include('b.php');

PHP: b.php
1
echo 'hoi';

Dan werkt dat. PHP zal in de huidige werkdirectory (de root) zoeken om b.php en die includen. Maar als je b verplaatst naar inc/ werkt het nog steeds. Als je in zowel de root als in inc/ een bestand b.php hebt staan, pakt hij degene in de root.

Acties:
  • 0 Henk 'm!

Verwijderd

Bergen schreef op woensdag 03 juni 2009 @ 02:02:

Het werkt prima, maar zelf gebruik ik het nooit. Ik heb deze oplossing ooit eens ergens op het net zien staan en vond hem wel leuk bedacht.
Ik vind hem niet zo handig. Het is beter om in elk PHP bestand dat een entry point kan zijn éénmalig een initialisatiescript te includen, en wel op de volgende manier:
PHP:
1
require_once ( dirname ( __FILE__ ) . '/../../bootstrap.php' );

En in dat script definieer je de basisdirectory. Bij alle andere keren dat je include of require gebruikt, prefix je het pad met de basisdirectory. Zo gebruik je overal absolute paden, en hoef je maar op één plaats de basisdirectory te gebruiken. En dit werkt ongeacht hoe bijvoorbeeld include_path is ingesteld. In jouw voorbeeld kan een brakke instelling nog roet in het eten gooien.

Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Vind alle aangedragen opties niet zo geweldig eigenlijk, waarom niet gewoon de functie gebruiken die daarvoor gemaakt is?

set_include_path()

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


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Grijze Vos schreef op woensdag 03 juni 2009 @ 08:47:
Vind alle aangedragen opties niet zo geweldig eigenlijk, waarom niet gewoon de functie gebruiken die daarvoor gemaakt is?

set_include_path()
Bijvoorbeeld omdat je verschillende paden hebt waarvanuit je wil includen? In het CMS waar we hier mee werken is er een /system/classes map, maar ook een /system/site/classes. De eerste bevat globale classes gebruikt in het CMS, de tweede bevat site-specifieke classes. Het enige wat je dan kan doet is je include path instellen op de rootfolder, maar daar staat sowieso al de index-file, wat betekent dat je het niet zo goed niet kan instellen. :)

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

  • Cartman!
  • Registratie: April 2000
  • Niet online
NMe, je kunt meerdere paden meegeven aan set_include_path() ;)

Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Dan zit je weer met gezeik wanneer de bestanden dezelfde filename hebben. :P

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

  • Cartman!
  • Registratie: April 2000
  • Niet online
Is geen probleem met goede namespacing anders, nooit last van gehad :)

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
[b]NMe schreef op woensdag 03 juni 2009 @ 02:31
Includes zijn, tenzij het recentelijk veranderd is, relatief aan je huidige working directory, en je working directory is gelijk aan de directory van je entry-level script. In dit geval waarschijnlijk index.php.)
Helaas kan index.php een include (bijvoorbeeld een type functie (func_) opvragen die een map hoger staat. Ook kunnen deze items (functies) zelf weer een functie opvragen. Je zit dus met meerdere WD's

Ik vind de oplossing van Bergen persoonlijk de beste, ik ga daar maar eens naar kijken denk ik momenteel gebruik ik deze hele lelijke fix:

if(!is_dir('ini_'))
chdir('../');


EDIT: dan heb ik nog een vraagje, ik maak gebruik van headers om bij do_ bestanden door te verwijzen naar een bestand die gegeven is in $return_string. deze heb ik het liefst ook vanuit de root utgevoerd, maar deze schijnen chdir te negeren?

[ Voor 15% gewijzigd door Verwijderd op 03-06-2009 13:22 . Reden: nog een vraag ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

Verwijderd schreef op woensdag 03 juni 2009 @ 13:07:
[...]

Helaas kan index.php een include (bijvoorbeeld een type functie (func_) opvragen die een map hoger staat. Ook kunnen deze items (functies) zelf weer een functie opvragen. Je zit dus met meerdere WD's
Nee, want al je includes kunnen daardoor relatief zijn aan index.php. Een include in een include in een include in een include uit index.php is nog steeds relatief aan het pad van index.php.

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

Verwijderd

Topicstarter
dan hebben we nog altijd het type do_ dat zelfstandig opereert en ook in een andere map zit;) ik heb het bovendien met wat quickfixes nu opgelost. het kan nog wat netter maar in ieder geval het werkt.

bedank allen.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ik heb deze feature van PHP echt nooit begrepen. Wat doet de current working dir er in hemelsnaam toe als je een file include :?. Compleet zinloze feature die voor meer kopzorgen zorgt dan voordelen.

Anyway...
NMe schreef op woensdag 03 juni 2009 @ 10:44:
[...]

Bijvoorbeeld omdat je verschillende paden hebt waarvanuit je wil includen? In het CMS waar we hier mee werken is er een /system/classes map, maar ook een /system/site/classes. De eerste bevat globale classes gebruikt in het CMS, de tweede bevat site-specifieke classes.
Dus stel je de common root in vanwaaruit je alles include
Het enige wat je dan kan doet is je include path instellen op de rootfolder
Dat zeg ik ;)
maar daar staat sowieso al de index-file, wat betekent dat je het niet zo goed niet kan instellen. :)
Que? Wat doet het bestaan van de index file in die dir er toe?

[ Voor 4% gewijzigd door .oisyn op 03-06-2009 15:10 ]

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.


Acties:
  • 0 Henk 'm!

  • skabouter
  • Registratie: Oktober 2000
  • Laatst online: 20-08 08:55

skabouter

Skabouter

Ik doe het zelf op deze manier;

index.php:
PHP:
1
2
define('PATH', dirname(__FILE__).DIRECTORY_SEPARATOR);
set_include_path(PATH);


Bestand waarin ik een ander bestand wil includen:
PHP:
1
require_once(PATH.$required_file_name);


Op die manier weet ik zeker dat ik begin vanaf de root van mijn applicatie en dat het bestand dat ik wil includen ook daadwerkelijk het exacte bestand is dat ik nodig heb!

[ Dislect ]


Acties:
  • 0 Henk 'm!

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

NMe

Quia Ego Sic Dico.

.oisyn schreef op woensdag 03 juni 2009 @ 15:08:
Ik heb deze feature van PHP echt nooit begrepen. Wat doet de current working dir er in hemelsnaam toe als je een file include :?. Compleet zinloze feature die voor meer kopzorgen zorgt dan voordelen.
Eensch.
Anyway...

[...]

Dus stel je de common root in vanwaaruit je alles include

[...]

Dat zeg ik ;)

[...]

Que? Wat doet het bestaan van de index file in die dir er toe?
By default wordt er toch al gekeken naar het pad van het entry point script. Door het path te setten op de dir waarin index.php staat doe je alleen wat aan de precendece van naar welke dirs als eerste wordt gekeken. Verandert aan de uiteindelijke werking waarschijnlijk niets. :)

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

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah op die fiets. Dat klopt, maar dat faalt dus zodra je entry points hebt in verschillende dirs die een common codebase gebruiken. Daarom prefereer ik ook de methode die Cheatah hanteert.

[ Voor 17% gewijzigd door .oisyn op 03-06-2009 15:35 ]

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