Skillnaden mellan require() och require_once()?

Tråden skapades och har fått 11 svar. Det senaste inlägget skrevs .
1

Jag undrar om någon vet vad skillnaden är mellan require("filnamn.php") och require_once("filnamn.php")? Framförallt vad skillnaden är i praktiken, snarare än i teorin... om det nu är någon jättekunnig som svarar...

  • Medlem
  • Kalmar
  • 2004-01-15 14:00

Om det finns risk att samma fil blir inkluderad flera ggr. så kan du förhindra detta genom att använda require_once (det finns ju tillfällen, även om det inte är vanligt...)

Tack för svaret. Men kan det skada? Eller är det bara dålig effektivitet?

Jag har en webbplats som fungerar med require_once(); fint i skarpt läge men inte på lokala Apache/PHP (som följer med i Panther). Ändrar jag däremot till require(); så fungera samma sidor utmärkt i den lokala miljön. Jag vill kunna köra samma kod i bägge miljöerna. Så om det inte "skadar" (förutom att det är osnyggt) att det råkar bli samma fil som inkluderas mer än en gång gör jag nog det.

Faktum är att man har skitstor nytta av include_once (och require_once).

Om man, som jag, försöker lägga så mkt som möjligt som funktioner i egna includefiler, så kan det vara så att en funktion, som t ex skapar SQL-strängar, behöver inkludera en annan funktion som validierar strängar enl ett visst mönster. Om denna fil har inkluderats i huvudfilen som inkluderar funktionen som genererar sql-strängarna kommer man få problem.

include_once och require_once förhindrar detta.

Scooter har du någon teori om varför dte inte funkar på min Panther-installation då? På webhotellet fungerar det finemang. Är det en gammal unken PHP-variant i OSX Panther?

  • Oregistrerad
  • 2004-01-23 14:22

require_once finns i PHP från och med version 4.0.1pl2.

Du kan kolla vilken version av PHP du har installerad i Panther genom att skriva "php -i" i terminalen.

Exakt hur yttrar sig problemen du har? Får du ett felmeddelande? Kommer inte sidan upp alls? Kommer sidna upp men ser inte ut som den ska?

Vad är det för typ av sida du gör? Vad är det du inkluderar med include och include_once?

Tjena. Jag tror jag fått kläm på vad skillnaden är. Att om man kör inquire_once inkluderas filen bara en gång oavsett hur "ofta" den rekvireras på samma sida. Med require inkluderas den "slaviskt" utan "intelligens" s a s.

Sidan jag körde (som gav problem) rekvirerade en filen som kopplar upp mot en mysql databas. I det fallet var problemet att ingen kopplingen gjordes mer än första gången och sidan gav beskedet "couldn't connect to database". Jag har nu insett att just den kombination jag kör är olämplig för require_once eftersom det inte enbart är anslutnings-strängen som ska inkluderas som variabel, utan även själva kommandot "koppla upp nu". Om inkluderingen bara sker en gång blir det ju fel, om "koppla upp dig nu och ställ en SQL-fråga" ska göras flera gånger under exekveringen. Då är det ju logiskt att det blir fel.

Det är som
fil: print.php
echo "hej";

fil: skriv2ggr.php
require_once ("print.php");
require_once ("print.php");

Om man exekverar skriv2ggr.php kommer det bara att skrivas ut "hej" en gång.

Så om man vill utföra någonting och inte bara ladda en funktion eller variabel-värde, är det troligtvis olämpligt med require_once.

Egentligen borde jag ju förstås programmera om så att jag gör en funktion som kopplar upp mot databasen, en funktion som tar SQL-satsen som argument. Då skulle det räcka med require_once. Men med nuvarande konstruktion bör jag alltså köra require() eller include().

Det konstiga är dock att det funkar i skarpt läge med multipla require_once, men inte i min lokala utvecklingsmiljö. Där måste jag köra require() i nuläget. Kanske är min lokala PHP nyare än den på webbhotellet...

tja, detta om detta

Citat:

Skrevs ursprungligen av Leander Lindahl
Scooter har du någon teori om varför dte inte funkar på min Panther-installation då? På webhotellet fungerar det finemang. Är det en gammal unken PHP-variant i OSX Panther?

Ledsen jag inte har svarat - får inte mail när någon gör inlägg i en bevakad diskussion

Messa mig om du fortfarande har problem...

För att få reda på eventuella skillnader i hur php är konfigurerat så gör en php-sida som bara innehåller koden:

<?

phpinfo();

?>

så får du se en detaljerad beskrivning över hur php är konfigurerat. Jämför hur det ser ut på din hem-maskin och servern så kanske du hittar vad som skiljer dem åt.

  • Medlem
  • Stockholm
  • 2004-01-24 11:52
Citat:

Skrevs ursprungligen av Leander Lindahl
Tjena. Jag tror jag fått kläm på vad skillnaden är. Att om man kör inquire_once inkluderas filen bara en gång oavsett hur "ofta" den rekvireras på samma sida. Med require inkluderas den "slaviskt" utan "intelligens" s a s.

Sidan jag körde (som gav problem) rekvirerade en filen som kopplar upp mot en mysql databas. I det fallet var problemet att ingen kopplingen gjordes mer än första gången och sidan gav beskedet "couldn't connect to database". Jag har nu insett att just den kombination jag kör är olämplig för require_once eftersom det inte enbart är anslutnings-strängen som ska inkluderas som variabel, utan även själva kommandot "koppla upp nu". Om inkluderingen bara sker en gång blir det ju fel, om "koppla upp dig nu och ställ en SQL-fråga" ska göras flera gånger under exekveringen. Då är det ju logiskt att det blir fel.

Så om man vill utföra någonting och inte bara ladda en funktion eller variabel-värde, är det troligtvis olämpligt med require_once.

Egentligen borde jag ju förstås programmera om så att jag gör en funktion som kopplar upp mot databasen, en funktion som tar SQL-satsen som argument. Då skulle det räcka med require_once. Men med nuvarande konstruktion bör jag alltså köra require() eller include().

Hmm.

Själv kör jag med require("db_start.inc") och require("db_stop.inc") .. vet inte om det är den bästa metoden.

Förut så lade jag "start" överst på sidan och "stop" längst ner på sidan så hade man alltid en öppen koppling.... numera så lägger jag "start" när jag vill göra sql-kommandon och så kör jag "stop" direkt efteråt och om det behövs längre ner hos en annan inkluderad fil (tex require("guestbook.php")) så får guestbook.php ha require("db_start.inc") också....
Någon sa till mig att det är bättre att skriva sina sidor så istället för att öppna kopplingen högst upp på sidan och stänga den längst ner på sidan...

vad säger ni?

ps. du borde slopa require_once("db_start") prylen eftersom det inte SKA fungera , om jag tänker rätt. Din lokala miljö beter sig så som jag skulle anse korrekt...

Jag stänger och öppnar uppkopplingen för varje anrop, har för mig att jag läst att det är lika bra eftersom tiden att koppla upp sig är väldigt liten och man inte vill "låsa upp" databasen som kanske har ett begränsat antal samtidiga uppkopplingar.

Hur man inkluderar filer och så kan man göra lite hur som helst, huvudsaken är nog att lösenord och övriga uppkopplingsuppgifter sparas på ett enda ställe så man slipper gå igenom alla filer då man byter databasserver.

Jag använder mig av ett databasabstraktionslager som heter ADODB http://php.weblogs.com/ADODB som gör att alla databaser (mysql, mssql, oracle, postgresql) får ett enheligt användande så att när man senare vill byta databas så kan man göra det utan att skriva om någon kod.

Sedan har jag i en fil med användbara funktioner som heter functions.php som varje huvud-php-fil inkluderar med require_once('sökvägtill/functions.php'); Bland funktionerna finns en som heter makeDatabaseConnection(); som returnerar en öppen ADODB-koppling som sedan används där den ska och sedan stängs.

För det mesta så kapslar jag in alla databaskommandon så att de returnerar arrayer av objekt som jag själv skapat istället för att returnera ett vanligt databas-resultset ända upp till GUIt.

1
Bevaka tråden