webForumDet fria alternativet

include "/mapp/fil.php"

10 svar · 455 visningar · startad av silfver

silfverMedlem sedan apr. 200312 679 inlägg
#1

Hejsan

Varför kan man skriva t.ex.

<link rel="stylesheet" href="/css/index.css" type="text/css">

Men inte

require "/includes/top.php";

Det jag syftar på är sökvägen. När man skriver /css/ så går den ju till roten och letar efter css-mappen. Men varför kan man inte göra samma sak när det gäller php? Funkar det inte för att den går för långt bak i kataloghanteringen? Hade vart smidigt att använda sig av /mapp/fil.php i stället för att behöva skriva ../mapp/fil.php och ännu jobbigare om den ligger djupt: ../../mapp/fil.php

Finns det någon lösning?

Mvh
silfver

PeeerMedlem sedan mars 20025 907 inlägg
#2

Det gör det väl visst?
Frågan är vad det är som du räknar som root? På en windowsburk är "/" ex. C: eller D: och på en *nix-burk så är / just / (dvs inte /usr/silfver/public_html)

SPiNMedlem sedan mars 20007 896 inlägg
#3

Ta en titt på http://se.php.net/manual/en/ini.sect.path-directory.php#ini.include-path så blir du nog lite klarare på hur det fungerar.

PHP använder färdiga sökvägar där den ska leta efter inkluderings-filer. Du kan ändra din 'include_path' så att den söker i mappen ovanför också, genom att slänga in ett ';..' i slutet, eller alternativt ':..' om du kör Linux/UNIX.
Typ:

<?php
ini_set( 'include_path', '.;..;c:\\php\\includes' );
// alt.
ini_set( 'include_path', '.:..:/php/includes' );
?>
silfverMedlem sedan apr. 200312 679 inlägg
#4

Peeer skrev:

Det gör det väl visst?
Frågan är vad det är som du räknar som root? På en windowsburk är "/" ex. C: eller D: och på en *nix-burk så är / just / (dvs inte /usr/silfver/public_html)

Så här ser det ut när jag försöker:

Warning: main(): Unable to access /includes/top.php in /mnt/home/silfver/www.silfver.se/test/test.php on line 2

Warning: main(/includes/top.php): failed to open stream: No such file or directory in /mnt/home/silfver/www.silfver.se/test/test.php on line 2

Fatal error: main(): Failed opening required '/includes/top.php' (include_path='.:/usr/local/lib/php') in /mnt/home/silfver/www.silfver.se/test/test.php on line 2

silfverMedlem sedan apr. 200312 679 inlägg
#5

SPiN skrev:

<?php
ini_set( 'include_path', '.;..;c:\\php\\includes' );
// alt.
ini_set( 'include_path', '.:..:/php/includes' );
?>

Tackar, nu funkar det ju! :) Koden ser lite mer komplicerad ut dock. :e

<?php
ini_set( 'include_path', '.:..:/includes/top.php' );
?>

r/ Hur ska jag göra om jag vill använda "require" i stället? För jag vill inte att sidan ska funka om den inte hittar filen.

SPiNMedlem sedan mars 20007 896 inlägg
#6

Det ska fungera för require också.

silfverMedlem sedan apr. 200312 679 inlägg
#7

SPiN skrev:

Det ska fungera för require också.

Hur ska jag göra då? Trodde det funkade, men trög som jag är så såg jag inte att CSS:en inte låg med.

http://www.silfver.se/test/ har jag skrivit:

<?php
ini_set( 'include_path', '.:..:/includes/top.php' );
?>

<p>test</p>

<?php
ini_set( 'include_path', '.:..:/includes/bottom.php' );
?>

Är det fel sådär? Eller hur ska jag göra? Ingen css kommer med, eller ingen html-kod...

GunnarDMedlem sedan juni 20014 290 inlägg
#8

Re: include "/mapp/fil.php"

silfver skrev:

Hejsan

Varför kan man skriva t.ex.

<link rel="stylesheet" href="/css/index.css" type="text/css">

Men inte

require "/includes/top.php";

Därför att den första går från "webrooten" men include() och require() går från filsystemets root.

Detta innebär att om dina sidor ligger i /www/domain.se/htdocs så kommer den första att hämta /www/domain/htdocs/css/index.css medans den andra hämtar /includes/top.php

För att få det enklare så brukar jag skriva så här när jag kör include() eller require():

<?php include($_SERVER["DOCUMENT_ROOT"]."/includes/top.php"); ?>

Då hämtas /www.domain.se/htdocs/inculdes/top.php

silfverMedlem sedan apr. 200312 679 inlägg
#9

Re: Re: include "/mapp/fil.php"

GunnarD skrev:

<?php include($_SERVER["DOCUMENT_ROOT"]."/includes/top.php"); ?>

Det där ser bättre ut. Funkar prima hittills. Tackar.

SPiNMedlem sedan mars 20007 896 inlägg
#10

I mitt exempel så sätter jag om variabeln 'include_path' i php.ini att peka på katalogen ovanför. Det är alltså inte så att filen inkluderas med den kodraden, du måste fortfarande använda require() för att inkludera filen.

<?php
ini_set( 'include_path', '.:..:\php\includes' );

require( "dinfil.php" );

Nu kommer alltså PHP söka efter filen 'dinfil.php' i aktuell katalog, katalogen ovanför samt i katalogen \php\includes.

Du kan även ändra direkt i php.ini istället för att i varje PHP-dokument ange ett ini_set-anrop, genom att öppna filen i valfri texteditor och ändra raden med 'ini_set' till önskade kataloger.

GunnarD's exempel är ett alternativ om du orkar skriva så mycket varje gång du ska inkludera något. ;)

silfverMedlem sedan apr. 200312 679 inlägg
#11

SPiN skrev:

I mitt exempel så sätter jag om variabeln 'include_path' i php.ini att peka på katalogen ovanför. Det är alltså inte så att filen inkluderas med den kodraden, du måste fortfarande använda require() för att inkludera filen.

<?php
ini_set( 'include_path', '.:..:\php\includes' );

require( "dinfil.php" );

Nu kommer alltså PHP söka efter filen 'dinfil.php' i aktuell katalog, katalogen ovanför samt i katalogen \php\includes.

Du kan även ändra direkt i php.ini istället för att i varje PHP-dokument ange ett ini_set-anrop, genom att öppna filen i valfri texteditor och ändra raden med 'ini_set' till önskade kataloger.

GunnarD's exempel är ett alternativ om du orkar skriva så mycket varje gång du ska inkludera något. ;)

Jag har ju inte en egen server, så jag kan inte ändra i php.ini. Men din kod kanske funkar ändå? Men eftersom jag knappt förstår mig på php så kör jag på gunnars exempel. Lätt och bra. :e

133 ms totalt · 3 externa anrop · v20260731065814-full.3ab8d573
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)