webForumDet fria alternativet

Anropa PHP från en extern fil

12 svar · 826 visningar · startad av haider

haiderMedlem sedan jan. 2003956 inlägg
#1

Jag har för närvarande en fil som heter global.php
Där jag behöver den så läser jag in så här

<?
require_once('./global.php');
?>

Förresten, eftersom jag ändå nämner ovanstående rad; finns det andra sätt att skriva ovanstående på?
Hur gör jag om filen finns en mapp under eller två mappar under och jag vill slippa köra med ../ eller ../../, måste jag använda den absoluta sökvägen (den långa som pekar till mappen där webbplatsen finns lagrad hos webhotellet)?

För att använda mig av funktioner som finns i global.php kan jag skriva tex:

<?PHP
$lagerstatus = $item_data['ID']['in_stock'];

switch($lagerstatus){
kod kod kod
}
?>

$item_data är något jag får från global.php och den enda unika parametern är "ID".
Men jag vill gärna slippa skriva hela paketet ovan (det är långt mer kod än vad jag använder i exemplet) utan något kortfattat genom att återanvända samma kodsnutt som jag stoppar in i global.php.
Skapar jag då en funktion enligt följande exempel?

**function lagerstatus($id) {

och här klistrar jag in
$lagerstatus = $item_data['ID']['in_stock'];

switch($lagerstatus){
kod kod kod
}

.. och hur gör jag i så fall så att jag byter ut 'ID' ovan mot $id?

}**

Och där jag vill anropa funktionen, skriver jag då bara något sådant?

<?lagerstatus('ID');?>

Hoppas någon kan peka mig mot rätt håll.
Det här är nog mitt tredje PHP tillfälle så jag är rätt orutinerad :r

GunnarDMedlem sedan juni 20014 290 inlägg
#2

Svar på den första:

Du kan skriva så här:

require_once($_SERVER["DOCUMENT_ROOT"]."/global.php");

Då kommer du åt filen oavsett var du står, $_SERVER["DOCUMENT_ROOT"] innehåller alltid sökvägen till din "root" map.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#3

Vissa (t.ex. Wordpress och andra CMS) kör:

dir(__file__) . "/global.php";

Dock osäker på vad som är skillnad på det och det som Gunnar skriver ovan (om det överhuvudtaget är någon skillnad).

haiderMedlem sedan jan. 2003956 inlägg
#4

Tack båda.
I väntan på att någon förklarar Mickes förslag undrar jag angående Gunnars; jag antar från att just denna webbplatsens rotmapp. Ska testa på det.
Är det något som servern specificerar eller är det något inbyggt i PHP språket?

Och så hoppas jag på att någon kan ge mig en viss inblick i function-frågan :)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#5

Om du skapar en tom fil och lägger det här i den:

<?php
phpinfo();
?>

Ladda upp den på server som "phpinfo.php" och surfa in på den.
Du kommer då se en sektion som heter något i stil med "Apache environmet variables".

Där kommer du hitta Gunnars förslag DOCUMENT_ROOT och du kommer även se den fysiska sökvägen, alltså vilket värde den har.

Ta bort phpinfo.php när du kollat färdigt.

MickeA.comMedlem sedan feb. 20034 441 inlägg
#6

Du kan ju även testa att lägga det här i en fil:

echo $_SERVER['DOCUMENT_ROOT'] . "<br />\n";
echo dir(__file__);

Så ser du vilken (om det är) skillnad på dom två.

haiderMedlem sedan jan. 2003956 inlägg
#7

Tack för tipset om phpinfo, den var väldigt givande. Där kunde jag se en mängd miljövariabler som jag säkert kan ha nytta av i andra fall.
Fast dir(_file_); gav mig inget så jag kör vidare med document_root eftersom det är en spikad miljövariabel och inte kan bli fel.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#8

$_SERVER['DOCUMENT_ROOT'] ska du inte använda. Den pekar till en plats definierad i php's config-filer och behöver inte alls ha något att göra med aktiva filen. I bästa fall får du ut din baskatalog, men inte vilken underkatalog din fil eventuellt ligger i. I värsta fall får du en katalog som ligger någon helt annanstans på servern. Detta är iböand sant på UNIX-servrar som har en huvudsida, men tillåter användare att lägga filer i public_html. dirname($_SERVER['PHP_SELF']) ligger närmare det du vill åt.

dir(_file_) är också fel då dir returnerar ett objekt av typen Directory. Det du vill ha i det fallet är dirname(_file_). dirname däremot tar namnet på en fil och returnerar vilken katalog den ligger i.

$_SERVER['PHP_SELF'] talat om namnet på den ursprungliga filen som användaren anropade, oavsett om man läser variabeln från en annan fil som är inkluderad och ligger någon annanstans. _file_ anger däremot namnet på den just nu aktiva filen.

include(dirname(__file__) . '/katalog/' . 'fil.php');
include(dirname(__file__) . '/' . 'fil2.php');

...är alltså troligen vad du vill använda.

Skillnaden på require och include är att require kastar ett fel och stoppar laddningen av sidan om filen du försöker inkludera inte går att ladda. include skapar bara en varning och fortsätter ladda. Om du lägger till _once på slutet så beter sig funktionen så att den inte laddar en fil en andra gång om den redan är laddad. Vanligtvis bör du köra require_once.

För övrigt, varför vill du undvika att använda .. ? Vad du bör göra är att från alla sidor inkludera en "global.php". I den global.php kan du inkludera andra filer med hjälp av dirname(_file_) som jag visade ovan. Alternativt om du behöver inkludera filer på andra ställen, gör det till en vana att inkludera global.php överst i alla filer som användare kan anropa och spara dirname(_file_) i en variabel. Denna variabel använder du sedan på andra ställen när det behövs.

Om lagerdatat verkligen är lagrat som du säger bör det räcka att göra så här:

$item_data[$id]['in_stock'];

Nästan, du kan skriva så här:

<?= lagerstatus('ID') ?>

Men möjligheten att skriva <? istälelt för <?PHP för att påbörja ett PHP-block är ibland avstängd på webservrar, så du gör bättre i att använda <?PHP-notationen.

<?PHP echo lagerstatus('ID'); ?>

Notera att exempel 1 inte har ett semikolon, medan exempel 2 har det.
I båda fallen måste funktionen returnera ett värde mha return. (Undvik att använda echo inuti funktioner som "gör" saker eftersom det lätt blir rörigt och saker skrivs ut där de inte ska skrivas ut)

MickeA.comMedlem sedan feb. 20034 441 inlägg
#9

Hoppsan, jag menade hela tiden

include(dirname(__file__) . '/katalog/' . 'fil.php');
include(dirname(__file__) . '/' . 'fil2.php');

Men hade visst lite bråttom.

GunnarDMedlem sedan juni 20014 290 inlägg
#10

nitro2k01 skrev:

$_SERVER['DOCUMENT_ROOT'] ska du inte använda. Den pekar till en plats definierad i php's config-filer och behöver inte alls ha något att göra med aktiva filen. I bästa fall får du ut din baskatalog, men inte vilken underkatalog din fil eventuellt ligger i. I värsta fall får du en katalog som ligger någon helt annanstans på servern. Detta är iböand sant på UNIX-servrar som har en huvudsida, men tillåter användare att lägga filer i public_html. dirname($_SERVER['PHP_SELF']) ligger närmare det du vill åt.

Håller inte med där:

$_SERVER['PHP_SELF'] innehåller sökvägen och filnamnet till filen som körs.

www.php.net skrev:

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. The _FILE_ constant contains the full path and filename of the current (i.e. included) file. If PHP is running as a command-line processor this variable contains the script name since PHP 4.3.0. Previously it was not available.

Vilket inte ger något efterson include/require vill ha hela sökvägen till filen från rooten i filsystemet.

$_SERVER['DOCUMENT_ROOT'] är den man skall använda, har använt den på många platser och den har alltid pekat på webplatsens dokumentroot.

www.php.net skrev:

The document root directory under which the current script is executing, as defined in the server's configuration file.

Skriver man include($_SERVER['DOCUMENT_ROOT']."/config.php") så kommer man åt config filen oavset var man befinner sig på sin webplats (i rooten eller subkataloger).

nitro2k01 skrev:

För övrigt, varför vill du undvika att använda .. ?

Är väll rätt självklart, man slipper hålla koll på hur många nivåer ner i subkataloger man befinner sig. Har man nått som alltid pekar på rooten så kan man utgå därifrån.

nitro2k01Medlem sedan aug. 20039 342 inlägg
#11

GunnarD skrev:

Håller inte med där:

$_SERVER['PHP_SELF'] innehåller sökvägen och filnamnet till filen som körs.

Vilket inte ger något efterson include/require vill ha hela sökvägen till filen från rooten i filsystemet.

Ja, och det beskrev jag också i inlägget. Därav användandet av dirname för att få ut katalognamnet. Det är inte $_SERVER['PHP_SELF'] som haider bör använda, men det är ett möjligt alternativ som säkert har ett användningsområde.

GunnarD skrev:

$_SERVER['DOCUMENT_ROOT'] är den man skall använda, har använt den på många platser och den har alltid pekat på webplatsens dokumentroot.

Problement är att det på vissa delade servrar inte pekar på din egen dokumentroot, utan $_SERVER['DOCUMENT_ROOT'] har samma värde för alla användare. Visserligen har nog de flesta webbhotell inte confat sina servrar så, men vill man göra sin applikation portabel bör man undvika $_SERVER['DOCUMENT_ROOT'] för att slippa eventuella framtida trubbel. Det är typiskt en sån sak som man kan banka huvudet i väggen för innan man fattar vad felet är.

GunnarD skrev:

Skriver man include($_SERVER['DOCUMENT_ROOT']."/config.php") så kommer man åt config filen oavset var man befinner sig på sin webplats (i rooten eller subkataloger).

Är väll rätt självklart, man slipper hålla koll på hur många nivåer ner i subkataloger man befinner sig. Har man nått som alltid pekar på rooten så kan man utgå därifrån.

Läs det som står efter det du citerade i mitt originalinlägg. Förtydligande: Metoden som jag föreslår, som också verkar populär bland flera vanliga PHP-applikationer, är att först ha en fil som man inkluderar från alla sidor. Då måste man visserligen träffa rätt med relativa sökvägar en gång per användarkatalog/fil. Men när man väl har kommit så långt har man en "fast punkt" i katalogstrukturen att utgå ifrån. Exempel från Wordpress' wp-config.php:

define('ABSPATH', dirname(__FILE__).'/');

Detta definierar en sökväg som man kan utgå ifrån vid alla framtida includes, i vilken fil includen än ligger. (Detta förutsatt att filen som innehåller raden ovan är det första man inkluderar överallt.) Exempel, från raden under i wp-config.php:

require_once(ABSPATH.'wp-settings.php');

Fördelen med att göra så istället för att använda $_SERVER['DOCUMENT_ROOT'], även om denna pekar rätt, är att ens applikation bara använder relativa sökvägar som är internt konsistenta. Alltså kan man flytta hela applikationen från den absoluta webrooten till en underkatalog utan att redigera någon kod.

GunnarDMedlem sedan juni 20014 290 inlägg
#12

nitro2k01 skrev:

Fördelen med att göra så istället för att använda $_SERVER['DOCUMENT_ROOT'], om denna pekar rätt, är att ens applikation bara använder relativa sökvägar som är internt konsistenta. Alltså kan man flytta hela applikationen från den absoluta webrooten till en underkatalog utan att redigera någon kod.

Då har jag väll haft tur som alltid fått det att fungera :)

haiderMedlem sedan jan. 2003956 inlägg
#13

require_once($_SERVER["DOCUMENT_ROOT"] funkade bra för mig
Om inte annat kan man dubbelkolla document_root i förväg för att se att det inte blir fel - det vill säga om variabeln visar sig peka mot någon annanstans.

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