WN

WN (https://www.wn.se/forum/index.php)
-   Serversidans teknologier (https://www.wn.se/forum/forumdisplay.php?f=4)
-   -   php require och sökvägsproblem (https://www.wn.se/forum/showthread.php?t=13942)

andla 2006-05-06 00:13

Måste vara min första post på den här forumavdelningen och det gäller en php fråga.
Frågan gäller relativa sökvägar i en katalog.

Jag har en hemkatalog och en underkatalog. Från hemkatalogen lägger jag till den här satsen.
<?php require("./LinkPageAuto/list.php"); ?>

I underkatalogen där list.php ligger så är skriptet definierat att ha en relativ sökväg och den borde strunta i var ifrån jag inkluderar filen.
Problemet är att den inte struntar i det så jag måste byta följande:
$fd = fopen ("list.txt", "r");
till
$fd = fopen ("./LinkPageAuto/list.txt", "r");

Hur kan man skriva så att skriptet tar hand om detta oavsett varifrån jag inkluderar filen?

tartareandesire 2006-05-06 00:24

Citat:

Originally posted by andla@May 6 2006, 00:13

Måste vara min första post på den här forumavdelningen och det gäller en php fråga.
Frågan gäller relativa sökvägar i en katalog.
Jag har en hemkatalog och en underkatalog. Från hemkatalogen lägger jag till den här satsen.
?php require(./LinkPageAuto/list.php); ?
I underkatalogen där list.php ligger så är skriptet definierat att ha en relativ sökväg och den borde strunta i var ifrån jag inkluderar filen.
Problemet är att den inte struntar i det så jag måste byta följande:
fd = fopen (list.txt, r);
till
fd = fopen (./LinkPageAuto/list.txt, r);
Hur kan man skriva så att skriptet tar hand om detta oavsett varifrån jag inkluderar filen?

När du inkluderar en fil så befinner du dig fortfarande i den katalogen som den filen du inkluderar från finns i. Använd en absolut sökväg i fopen, t.ex. med $_SERVER['DOCUMENT_ROOT'].

andla 2006-05-06 00:41

echo $_SERVER['DOCUMENT_ROOT'];
blir bara '/'

Den verkar inte användas. Vilka andra metoder kan jag testa?

tartareandesire 2006-05-06 01:07

Citat:

Originally posted by andla@May 6 2006, 00:41
echo _SERVER[DOCUMENT_ROOT];
blir bara /
Den verkar inte användas. Vilka andra metoder kan jag testa?

Testa $HTTP_SERVER_VARS istället för $_SERVER.

andla 2006-05-06 12:38

Blir samma sak..

tartareandesire 2006-05-06 12:50

Kör phpinfo och se vad det står där.

Bamse 2006-05-06 13:17

Det här med sökvägar i PHP är en konst i sig att lära sig bemästra :)

Det hela utgår ifrån din cwd (current working directory). Kör du t.ex. index.php och sedan includear som du säger <?php require("./LinkPageAuto/list.php"); ?> så är din cwd /

När det gäller include() och require() söker de först efter filer i din include_path relativt din cwd (kolla vilken din include_path är med ini_get('include_path')). Sedan söker de efter filer i include_path relativt det script som körs (list.php i ditt fall).

Om du kör med ./ eller ../ för den delen kollar den bara relativt efter cwd.

resource fopen ( string filename, string mode [, bool use_include_path [, resource zcontext]] )

fopen() är dock en annan historia. Den kör inte som standard efter include_path alls (letar endast i cwd). Man kan specifiera parametern use_include_path till true så kör den efter include_path också, då kan du lägga till din katalog i include_path så har du löst problemet, det gör du med:

Kod:

$path = '/LinkPageAuto/';
set_include_path(get_include_path() . PATH_SEPARATOR . $path);

En annan lösning är att ge en absolut sökväg till filen i din fopen(). __FILE__ är en konstant som anger filnamnet för scriptet som körs, dirname() kan användas för att plocka ut katalogdelen för det. Då blir det:

Kod:

$fd = fopen (dirname(__FILE__) . "/list.txt", "r");
Hoppas detta rätar ut en del frågetecken!

andla 2006-05-06 13:36

Provad detta och det fungerade fin fint :)
echo __FILE__ ;

Hoppas nu att detta funkar hos de flesta webbhotell som stödjer php. Funderar på att göra små skript i framtiden, skicka upp till några skriptsajter och se till att använda __FILE__ så att andra slipper detta krångel :).
Kanske kan ge några nöjda besökare.

tartareandesire 2006-05-06 14:00

Vet inte vad för webserver du använder? Uppenbarligen finns inte $_SERVER['DOCUMENT_ROOT'] på IIS, finns __FILE__ oavsett webserver?

Använder man en PHP-version som är äldre än PHP 4.0.2 så bör man hur som helst inte använda sig av __FILE__ då den ibland ger en relativ sökväg till filen.

andla 2006-05-06 14:34

Jobbig problem det här :)

Ännu jobbigare att få länkar att lira rätt med skriptet.
Har försökt att skriva här vad jag gör och raderat det för att det finns inget vettigt sätt att förklara problemet med text. *Svettas* :)
Gjorde en lösning hur som helst.
Grundtanken är att använda så lite kod som möjligt i huvudwebbsidan i rotkatalogen och sedan använda olika komponenter i underkataloger.
Om jag t.ex vill ha flera skriptade länklistor så kopierar jag en mapp och gör några små redigeringar i huvudwebbsidan. (med massa problem som följd :))

andla 2006-05-06 15:24

Vet inte om denna är så snygg men det funkar:

Jag sätter en variabel i index.php på huvudwebbsidan:
<?php
$gpath="LinkPageAuto/";
require("./LinkPageAuto/list.php");
$gpath="LinkPageAuto2/";
require("./LinkPageAuto2/list.php");
?>

För varje gång gpath sätt så används detta värde i respektive underkatalog.
Så en länk kan se ut så här i skriptet i underkatalogen:
echo "<a href=\"$gpath$filename?page=$rwd\">&gt&gt</a>
";

eller

Add Link |
View Links




Min fula lösning men har ni något råd för att göra lösningen på ett snyggare sätt?

Bamse 2006-05-06 18:33

Citat:

Originally posted by tartareandesire@May 6 2006, 14:00
Vet inte vad för webserver du använder? Uppenbarligen finns inte $_SERVER['DOCUMENT_ROOT'] på IIS, finns __FILE__ oavsett webserver?

Använder man en PHP-version som är äldre än PHP 4.0.2 så bör man hur som helst inte använda sig av __FILE__ då den ibland ger en relativ sökväg till filen.

Hoppas verkligen ingen använder en PHP-version före 4.0.2 längre eftersom 4.0.1 kom ut 28 juni 2000 :)

Men det finns en lösning för att göra så det funkar i vilket fall; den utmärkta funktionen realpath()
Kör du realpath(__FILE__) får du alltid ut den fulla absoluta sökvägen (även om du redan inputtar den).

__FILE__ finns oavsett webbserver eftersom det är en PHP-konstant. Behöver du DOCUMENT_ROOT under IIS finns där massa code snippets med olika förslag i kommentarerna på följande url:
http://se.php.net/reserved.variables


Angående ditt problem finns där som vanligt många olika lösningar.
En är att köra med mod_rewrite vilket kanske kan vara lite overkill här dock.

En annan är att i filerna du har i katalogerna överst ha:
Kod:

$directory = dirname($_SERVER["REQUEST_URI"]) . "/";
Sedan kan du länka med Links
Lite likt du gör, men genom automatik minskar man risken för typos.

Sedan ska man aldrig glömma den gamla hederliga base href HTML-taggen

andla 2006-05-10 19:44

Tackar för hjälpen.
Kan krypa framåt äntligen :)


Alla tider är GMT +2. Klockan är nu 11:25.

Programvara från: vBulletin® Version 3.8.2
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Svensk översättning av: Anders Pettersson