Jump to content
GSForum - Segélyvonal

Tetszõleges könyvtárból másik könyvtár elérése


Lex

Recommended Posts

Lex

Sziasztok!

 

A probléma a következõ:

A weboldalam /log könyvtárában van egy szöveg állomány és egy php progi, ami ebbe a szövegállományba naplóz. A php progit más könyvtárakból include()-olom és a benne lévõ naplozas() fv-t hívom meg. A progiból nem tudom hogyan kellene az fopen-hez a szövegállomány elérési utját megadni, hogy bárhonnan hívom meg, mindig megtalálja a log könyvtárbeli szöveg állományt. Ha a gyökérbõl hivatkozok (/log/allomany.txt), akkor nem mûködik. Ha pl. $_SERVER['DOCUMENT_ROOT'] . "log/allomany.txt" sem ad jó eredményt, bár a saját gépem szerverével mûködik.

Az include-olt progi egy részlete:

$allomany="/log/naplo.txt";
if (! file_exists($allomany) )
   touch($allomany);
$f=fopen($allomany,'a');

Link to comment
Share on other sites

arpsoft

Az include helyett használjál require-t.

Link to comment
Share on other sites

Lex

Ha jól tudom, akkor az az include-tól annyiban különbözik, hogy ha nem találja az includolandó file-t, akkor nem figyelmeztet, hanem kiakad hibával.

PHP Kézikönyv Require()

Vagy nem jól tudom? :?:

PS: Nem az include-dal van bajom, hanem az fopen-nel! Nem ezt értetted félre? Kicsit átfogalmaztam a témaindítót, hogy érthetõbb legyen.

Link to comment
Share on other sites

arpsoft

Nem egészen ez a különbség.

Az include megkeresi a fájlodat és lefuttatja, míg a require úgy dolgozik, mintha ott lenne a kódban az importált függvény.

Link to comment
Share on other sites

Lex

Ezzel nincs is semmi bajom, csak pl. a /munka1 könyvtárban lévõ prog1.php állományba beinkludolom a /log/naplozas.php állományt, de ez ugyebár a /munka1 könyvtárban fut.

Majd pl. a /munka2 könyvtárban lévõ prog2.php állományba is inkludolom a /log/naplozas.php állományt, de ez ugyebár a /munka2 könyvtárban fut.

A naplozas.php állomány mindig más könyvtárban fut, ezért a benne lévõ fopennek nem tudom hogy adjam meg a /log/naplo.txt file elérési útját.

Ezt a hibaüzit adja:

Warning: fopen(): open_basedir restriction in effect. File(/log/belepes.txt) is not within the allowed path(s): (.:/disk/raid2/l/o/logex) in /disk/raid2/l/o/logex/log/naplozas.php on line 20

Warning: fopen(/log/belepes.txt): failed to open stream: Operation not permitted in /disk/raid2/l/o/logex/log/naplozas.php on line 20

Link to comment
Share on other sites

arpsoft

Na ez a require elõnye. Az ott fut, ahol a require van.

Link to comment
Share on other sites

Lex

Az include is a hívó progi könyvtárában fut. Kipróbáltam require-vel.

Ezt köpte rá:

Warning: fopen(belepes.txt): failed to open stream: Permission denied in /disk/raid2/l/o/logex/log/naplozas.php on line 20

Ez azért van, mert a fõkönyvtáram index.php-jába includoltam és oda nincs írási joga. De nem is kell, mert a log könyvtárba kéne írnia.

 

Hagyjuk a require-t és az include-ot. Nem az a hiba.

Az fopen-nél hogyan tudok a gyökértõl hivatkozni egy állományra?

Link to comment
Share on other sites

arpsoft

Van egy ilyen lehetõség: fopen("valami.txt","a+",1)

Ilyenkor a php.ini-ben beállított útvonalon keres.

De megadhatod neki a teljes elérési utat, pl

fopen("http://akarhol/akarmi.txt","a+")

Link to comment
Share on other sites

Lex

A Freeweben nem hiszem, hogy beletúrhatnék a php.ini-be! :D

A teljes elérési út esetén (http://logex.fw.hu/log/naplo.txt) ezt kapom:

Warning: fopen(): URL file-access is disabled in the server configuration

 

Légyszíves ne használj piros színt a hozzászólásodban és ne idézd be az elõtted íródott hozzászólást! <PF>

 

Ha nem szabad idézni, akkor minek hozza be - ha kérem, ha nem - ez a frankó IPB?:pislog:

Link to comment
Share on other sites

arpsoft

Azért, mert válaszolsz. A hozzászólásod alatt ott van az idézet egy másik szövegablakban.

 

Ha a "Szólj hozzá"-ra kattintasz, akkor nem idéz.

Link to comment
Share on other sites

Lex

@arpsoft: OK.

 

Jobb megoldás hiányában egyenlõre az alábbi megoldást alkalmaztam a gyökérkönyvtár megállapítására:

$root=substr($_SERVER['SCRIPT_FILENAME'] , 0, strpos($_SERVER['SCRIPT_FILENAME'], $_SERVER['SCRIPT_NAME']));
if (isset($_SERVER['HTTP_X_FW_USERNAME']))
   $root=$root . '/' . $_SERVER['HTTP_X_FW_USERNAME'];
$root=$root . '/';

Ez mûködik localhost-on és a szerveren is.

Tud valaki egyszerûbbet?

Link to comment
Share on other sites

ocsi

Lehet hogy én olvastam pontatlanul, de miért akarsz minden áron relatív hivatkozást?? Nem ûködik az hogy thotbalasz.fw.hu/log/naplozas/naplo.txt ???( vagy lehet h a freeweb is csinál egy kanyart az abszolút hivatkozásokban mint az srv...)

Link to comment
Share on other sites

arpsoft

Ezért nem tudja:

 

A teljes elérési út esetén (http://logex.fw.hu/log/naplo.txt) ezt kapom:

Warning: fopen(): URL file-access is disabled in the server configuration

Link to comment
Share on other sites

Lex

A Prog.hu-n (ha szabad itt ilyet mondani? :hmm: ) egy kicsit egszerûbb választ már kaptam. A

dirname(__FILE__)

megadja a beinclude-olt állomány eredeti könyvtárát, tehát ez állandó, függetlenül attól, hogy honnan includolom. De ez még mindig nem a gyökér. Tudom, tudom, hogy ebbõl kiszedhetõ, de valahogy nem tudom elképzelni, hogy nincs egy normális, "hivatalos" módszer erre.

Közben még az jutott eszembe, hogy a Linuxban, ~ jellel jelölik a felhasználó home könyvtárát. Kipróbáltam, de sajnos nem mûködik ezzel sem. :zokog:

Link to comment
Share on other sites

arpsoft

Létezik ez a változód?

$REDIRECT_HOMEDIR vagy _SERVER["REDIRECT_HOMEDIR"]

Link to comment
Share on other sites

Lex

Nem. A $_SERVER-t teljesen átnéztem:

PATH_TRANSLATED=SCRIPT_FILENAME= a teljes elérési út a szerver gyökerétõl.

SCRIPT_NAME=REQUEST_URI=PHP_SELF= elérési út a user könyvtárral.

Van még a DOCUMENT_ROOT, de az /home/freeweb/, ami nem jó.

A többi más jellegû.

Link to comment
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...