anpera.net

anpera.net

experimental server @home
Aktuelle Zeit: Mo 16 Jun, 2025 14:25

Alle Zeiten sind UTC + 1 Stunde




Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 
Autor Nachricht
 Betreff des Beitrags: Require oder include?
BeitragVerfasst: Mi 23 Aug, 2006 14:27 
Offline
Großmeister
Großmeister
Benutzeravatar

Registriert: Fr 06 Jan, 2006 01:33
Beiträge: 459
Wohnort: Simmern
Geschlecht: Männlich
LoGD: http://www.morpheus-lotgd.de
Folgendes Beispiel:

ich habe 8 Dateien, in jeder Datei werden Variablen gebraucht, die für diese Datei gelten, gleichzeitig benötigen die anderen 8 aber auch einige dieser Werte.
Ich beabsichtige, diesen ganzen Variablenwust in eine eigene Datei aus zu lagern, nur binde ich die dann ein mit require oder mit include?
Die Abfrage dieser Variablen erfolgt an verschiedenen Stellen im Script, sollte also immer verfügbar sein. Ich habe in einem Tutorial nachgelesen, das ansonsten recht gut ist, aber daraus geht, irgendwie, der genaue Unterschied der beiden nicht hervor, wobei das dort angeführte Beispiel nur für include war und sich auf eine Header Grafik bezog, die von allen Seiten genutzt wird... :???:

_________________
Ich bin das Land, meine Augen sind der Himmel, meine Glieder die Bäume, ich bin der Fels, die Wassertiefe. Ich bin nicht hier, um die Natur zu beherrschen oder sie auszubeuten. Ich bin selbst Natur.

(Hopi)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi 23 Aug, 2006 16:25 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Require und Include sind inzwischen das gleiche. Es gab mal frühe PHP4-Versionen, bei denen bei einem "Require" die Datei immer eingebunden wurde, egal ob es auch sowas gewesen war:
[php]if(false) {
Require 'blub.php';
}[/php]

Aber die Fehlerbehandlung von Include und Require ist etwas anders. Require heisst ja, wie du sicher weisst, "Benötigen" auf Deutsch. Und genau da liegt der Unterschied.
Sagen wir mal, du bindest mit inlcude eine Datei ein und diese gibt es nicht (Verschrieben zum Beispiel). Dann wird die Datei, logischerweise, nicht eingebunden, dafür aber wird eine Warnung ausgegeben, das Script läuft weiter.
Wenn du Require nimmst, und die Datei gibt es nicht, dann sieht es etwas anders aus: Die Datei wird nicht eingebunden, es wird ein "Fatal Error" ausgegeben und der Rest des Scriptes wird nicht mehr ausgewertet. Nützlich, wenn du Funktionen in einer externen Datei hast.

Deshalb:
Ist eine Datei für den Programmablauf essentiel, so nimmst du am besten Require.
Ist sie nicht essentiel (Zum Beispiel die Einbindung des headers um auf dein Beispiel zurück zu kommen), so nimmt man am besten Include. Gibt es die Datei nicht (Versehentlich gelöscht, verschrieben), so funktioniert das ganze trotzdem noch.

Für dein Problem: "benötigen" sagt schon alles: Require();


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Mi 23 Aug, 2006 17:20 
Offline
Großmeister
Großmeister
Benutzeravatar

Registriert: Fr 06 Jan, 2006 01:33
Beiträge: 459
Wohnort: Simmern
Geschlecht: Männlich
LoGD: http://www.morpheus-lotgd.de
Thx Elli, die Übersetzung war mir im Grunde schon klar, nur war ich nicht so ganz im Klaren darüber, was nun am besten zu verwenden sei, wobei ich aber auch mehr zu require tendiert habe, was ich nun verwenden werde, denn den Wust von Variablen kann sonst kein Mensch bändigen :D

_________________
Ich bin das Land, meine Augen sind der Himmel, meine Glieder die Bäume, ich bin der Fels, die Wassertiefe. Ich bin nicht hier, um die Natur zu beherrschen oder sie auszubeuten. Ich bin selbst Natur.

(Hopi)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 08:54 
Offline
Profi
Profi
Benutzeravatar

Registriert: Do 29 Dez, 2005 16:50
Beiträge: 178
Wohnort: Pinneberg
Sorry Elli, aber da muss ich korrigieren:
Nehmen wir mal an wir haben die Datein 1.php, 2.php ... 10.php
Nun wollen wir alle diese Datei mittels einer Schleife einbinden:
[php]<?
for ($i=1;$i<11;$i++){
require($i.'.php');
}
?>[/php]
Dieses Script würde alle 10 Datein einbinden und zwar bei jedem Durchlauf eine.

[php]<?
for ($i=1;$i<11;$i++){
include($i.'.php');
}
?>[/php]
Jetzt wird plötzlich nurnoch die erste Datei eingebunden, und zwar 10 mal.

Warum?
Der grundlegende Unterschied zwischen include() und require() ist der dass include sich selbst durch den Inhalt der einzubindenden Datei ersetzt, require hingegen führt nur den enthaltenen Code aus, verändert aber nichts an dem aufrufenden Script.

Bei den Fehlermeldungen stimmt aber soweit alles, ein Fehler bei include() lässt das Script mit einem Fehler abbrechen, ein Fehler bei require erzeugt nur eine Fehlermeldung dass die Datei nicht gefunden werden konnte und jetzt im Script weitergemacht wird. 8)

EDIT:
Sorry, der Fehler wurde bereits in PHP Version 3 behoben :pein:

_________________
LoGD-Server ist zwar weg aber jetzt kommt das nächste Projekt, mehr dazu auch Hier


Zuletzt geändert von Kakerlake am Mi 30 Aug, 2006 08:06, insgesamt 1-mal geändert.

Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 16:30 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Tut mir leid. Woher nimmst du diese Informationen?
Ich berufe mich auf das PHP-Manual. Und das schreibt:

Zitat:
include()

Die include() Anweisung bindet die angegebene Datei ein und wertet diese aus.

Die untenstehende Dokumentation gilt ebenso für require(). Diese beiden Konstrukte sind in jeder Hinsicht gleichwertig mit der einen Ausnahme: der Umgang mit Fehlern. include() erzeugt ein Warning während require() in einem Fatal Error endet. Mit anderen Worten, verwenden Sie require(), wenn Sie möchten, dass eine fehlende Datei die Ausführung ihres Skripts beendet. include() verhält sich anders, ihr Skript wird weiterhin ausgeführt. Stellen Sie außerdem sicher, dass Sie einen gültigen include_path gesetzt haben. Beachten Sie, dass eine Parse Error in einer Datei, die mit require eingebunden wurde, die Ausführung ihre Skripts nicht unterbricht.


Und weiterhin (Bei require):
Zitat:
Anmerkung: Für frühere Versionen als PHP 4.0.2 gilt folgendes: require() wird immer versuchen die Zieldatei zu lesen, selbst wenn die Zeile in der die Anweisung steht, nie ausgeführt wird. Eine bedingte Anweisung hat keine Auswirkungen auf require(). Wenn jedoch die Zeile in der require() steht, nie ausgeführt wird, wird auch der Code der Zieldatei nie ausgeführt werden. Ähnliches gilt für Schleifenstrukturen, diese beeinflussen das Verhalten von require() nicht. Obwohl der Code, der in der Zieldatei enthalten ist, zur Schleife gehört, wird require() selbst nur einmal ausgeführt.


Auf Englisch:
Zitat:
The documentation below also applies to require(). The two constructs are identical in every way except how they handle failure. include() produces a Warning while require() results in a Fatal Error. In other words, use require() if you want a missing file to halt processing of the page. include() does not behave this way, the script will continue regardless. Be sure to have an appropriate include_path setting as well. Be warned that parse error in included file doesn't cause processing halting in PHP versions prior to PHP 4.3.5. Since this version, it does.


Zitat:
Note: Prior to PHP 4.0.2, the following applies: require() will always attempt to read the target file, even if the line it's on never executes. The conditional statement won't affect require(). However, if the line on which the require() occurs is not executed, neither will any of the code in the target file be executed. Similarly, looping structures do not affect the behaviour of require(). Although the code contained in the target file is still subject to the loop, the require() itself happens only once.



Ich liege im Recht. :P


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 20:37 
Offline
Großmeister
Großmeister
Benutzeravatar

Registriert: Fr 06 Jan, 2006 01:33
Beiträge: 459
Wohnort: Simmern
Geschlecht: Männlich
LoGD: http://www.morpheus-lotgd.de
Noch mal ab von dem Problem, was ich besser nehme (ich habe mich für require entschieden), habe ich ein kleines Problem:

In der Datei preise.php, die ich für alle Dateien benötige, werden nur Variablen festgesetzt. In der setnewday.php wird ein Wert berechnet,
$this->bbcode_second_pass_code('', '
// Holzhandel by Morpheus
// Holzpreis am Tag

$date = getsetting('gamedate','0000-01-01');
$date = explode('-',$date);
$monat = $date[1];

if (($monat ==01) || ($monat ==02) || ($monat ==03) || ($monat == 10) || ($monat == 11) || ($monat == 12)) {
srand ((double)microtime()*1000000);
$preis= rand(40,100);
savesetting("holzpreis",$preis);
}
if (($monat ==04) || ($monat ==05) || ($monat ==06) || ($monat ==07) || ($monat ==08) || ($monat ==09)) {
srand ((double)microtime()*1000000);
$preis= rand(10,80);
savesetting("holzpreis",$preis);
}

// Holzhandel Ende
')

der, ganz oben in der preise.php, abgefragt wird
$this->bbcode_second_pass_code('', '
$hopr=$settings['holzpreis'];
')
Alle weiteren, festgelegten Variablen, über 100, basieren auf diesem Wert.
Ich Habe 2 der Module, die diese Datei nutzen sollen, berits fertig und wollte nun testen, ob das Ganze funzt, doch wenn ich eines der beiden betrette, habe ich die berühmte weiße Seite, auf der meine Werte der Vitalinfo stehen, der Link zur Source und der Link zu Anfragen.
Setze ich nun ein // vor das
$this->bbcode_second_pass_code('', '
require "preise.php";
')
dan erscheint ganz normal der Beginn des Moduls. Welche Struktur muß die eingebundene Datei haben?
Zuerst hatt eich rein ein herunterschreiben der Variablen, dann habich vor die erste ein
$this->bbcode_second_pass_code('', '
if ($_GET['op']==""){
')
gesetzt und unten wieder geschloßen, egal, was ich versuche, es erscheint die berühmte Seite, sobald ich die // wieder entferne...

Um zu verdeutlichen, was ich meine, hier der Beginn der Datei...
$this->bbcode_second_pass_code('', '
<?php
/*
Idee und Umsetzung
Morpheus für www.morpheus-lotgd.de.vu
Mail to morpheus@magic.ms
Gewidmet meiner über alles geliebten Blume
Gehört zum Handelssystem und wird zwingend benötigt. In diesem Modul werden die Grundpreise ermittelt für die Handelswaren. Wenn weitere dazu kommen, werden ihre Preise auch hier ermittelt
*/
require_once "common.php";
checkday();
$acctid=$session[user][acctid];
$sql = "SELECT * FROM handelslager WHERE ownerid='$acctid'";
$result = db_query($sql);
$row = db_fetch_assoc($result);
// H O L Z

// Der allgemeine Holzpreis, errechnet in der setnewday.php
$hopr=$settings['holzpreis']; //Preis für Holz in der Hauptstadt & allgemeiner Holzpreis

// Werte der Spielers
$haho=$row[holz]; //Wieviel Holz der Spieler hat
$habr=$row[brett]; //Wieviel Bretter der Spieler hat
$lafrho=(1000-$row[inhalth]); //freie Lagerkapazität Holzlager

// Grundpreise Holz, Bretter, Sägen und Transport
$saegepreis=($hopr/4); //Kosten für das Sägen von Holz zu Brettern
$hopr=$settings['holzpreis']; //Preis für Holz in der Hauptstadt
$brettpreis=($hopr+10); //Preis für Bretter in der Hauptstadt
$holzhof=($hopr/2); //Preise für Holz auf dem Hof
$hoprinsel=($hopr+15); //Grundholzpreis Inselkontinent
$brprinsel=($brettpreis+15); //Grundbrettpreis Inselkontinent
$haho1=($haho/10); //Umrechnung von Holz in 10'er Einheiten
$habr1=($habr/10); //Umrechnung von Brettern in 10'er Einheiten
$lafrh=($lafrho/10); //Umrechnung des Lagers auf 10'er Einheiten
$bretthof=($brettpreis/2); //Preise für Bretter auf dem Hof
$ekholzhof=(($hopr/2)+($hopr/5)); //Einkaufspreis für Holz auf dem Hof
$ekbretthof=(($brettpreis/2)+($brettpreis/5)); //Einkaufspreis für Bretter auf dem Hof
$tk=($hopr/5); //Grundtransportkosten

// Preis für die Städte
$ekhosi=($ekholzhof+5); //Einkaufsreis für Holz in der Hauptstadt
$ekbresi=($ekbretthof+8); //Einkaufsreis für Bretter in der Hauptstadt
$tkbsi=($tk+5); //Transportkosten Bretter nach Simahr
$hpno=($hopr+6); //Holzpreis in Nollopa
$bpno=($brettpreis+4); //Brettpreis Nollopa
$tkbno=($tk+5); //Transportkosten von Brettern nach Nollopa
$hphhey=($hoprinsel+15); //Holzpreis im Handelshafen Eytgim
$bphhey=$brprinsel; //Brettpreis im Handelshafen Eytgim
$ekhhhey=($hphhey+5); //Holzeinkaufspreis im Handelshafen Eytgim
$ekbhhey=($bphhey+5); //Bretteinkaufspreis im Handelshafen Eytgim
$tkhhhey=($tk+10); //Transportkosten von Holz zum Handelshafen Eytgim
$tkbhhey=($tk+20); //Transportkosten von Brettern zum Handelshafen Eytgim
$hpne=($hoprinsel+15); //Holzpreis in Necron
$bpne=$brprinsel; //Brettpreis in Necron
$tkhne=($tk+10); //Transportkosten von Holz nach Necron
$tkbne=($tk+20); //Transportkosten von Brettern nach Necron
$hpar=($hoprinsel+10); //Holzpreis in Artep
$bpar=($brprinsel+5); //Brettpreis Artep
$tkhar=($tk+10); //Transportkosten von Holz nach Artep
$tkbar=($tk+20); //Transportkosten von Brettern nach Artep
$bpey=($brprinsel+10); //Brettpreis Eythgim
$tkhey=($tk+15); //Transportkosten von Holz nach Eythgim
$tkbey=($tk+25); //Transportkosten von Brettern nach Eythgim

// H O L Z E N D E
...')

P.S.: Leerzeichen oben und unten wurden vonmir enfernt, denn das war das Erste, was mir einfiel...

_________________
Ich bin das Land, meine Augen sind der Himmel, meine Glieder die Bäume, ich bin der Fels, die Wassertiefe. Ich bin nicht hier, um die Natur zu beherrschen oder sie auszubeuten. Ich bin selbst Natur.

(Hopi)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 20:54 
Offline
Marquis Pherae
Marquis Pherae

Registriert: Mi 09 Feb, 2005 16:01
Beiträge: 3925
Wohnort: Basel
Geschlecht: Männlich
Auch die Absätze entfernt? Alle Steuerzeichen (ASCII < 32 glaube ich) tun sowas.. ^^

Dann würde ich prüfen, ob du keine Warnungen, Strings mit echo/print/print_r etc. ausgibst.


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 20:57 
Offline
Großmeister
Großmeister
Benutzeravatar

Registriert: Fr 06 Jan, 2006 01:33
Beiträge: 459
Wohnort: Simmern
Geschlecht: Männlich
LoGD: http://www.morpheus-lotgd.de
Ich hab alles sowei durch gesehen, Fehler, die bestanden haben, wurden beseitigt, das einzige ist eben die weiße Seite...ich werde mal alle Absätze raus nehmen und wes nochmal testen, danke für die Antwort.

_________________
Ich bin das Land, meine Augen sind der Himmel, meine Glieder die Bäume, ich bin der Fels, die Wassertiefe. Ich bin nicht hier, um die Natur zu beherrschen oder sie auszubeuten. Ich bin selbst Natur.

(Hopi)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Di 29 Aug, 2006 21:04 
Offline
Großmeister
Großmeister
Benutzeravatar

Registriert: Fr 06 Jan, 2006 01:33
Beiträge: 459
Wohnort: Simmern
Geschlecht: Männlich
LoGD: http://www.morpheus-lotgd.de
Also an den Absätzen lag es mal nicht, die sind alle beseitigt, aber der Fehler bleibt bestehen´und keinerlei Fehlermeldungen...ich habe wieder beide Varianten getestet, mit
$this->bbcode_second_pass_code('', '
if ($_GET['op']==""){
')
und ohne...

_________________
Ich bin das Land, meine Augen sind der Himmel, meine Glieder die Bäume, ich bin der Fels, die Wassertiefe. Ich bin nicht hier, um die Natur zu beherrschen oder sie auszubeuten. Ich bin selbst Natur.

(Hopi)


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 28 Okt, 2006 11:24 
Offline
Lehrling
Lehrling

Registriert: Sa 28 Okt, 2006 00:43
Beiträge: 44
LoGD: http://www.logd.wing-clan.de/
hm...

ich bin mir die Bedeutung dieser zwei Sachen nicht ganz bewusst:

$_GET['op'] und $HTTP_GET_VARS[op]

ABER:

Ich bin mittlerweile hingegangen und habe in meinen z.B. wald-specials alle $_GET['op'] durch $HTTP_GET_VARS[op] ersetzt und siehe da, alle specials laufen auf einmal... ich selber verwende auch nur noch $HTTP_GET_VARS[op]

Richtig, Falsch, Zufall?


Nach oben
 Profil  
Mit Zitat antworten  
 Betreff des Beitrags:
BeitragVerfasst: Sa 28 Okt, 2006 16:07 
Offline
Großmeister
Großmeister

Registriert: Mi 15 Dez, 2004 00:41
Beiträge: 467
Wohnort: München
Falsch, genau umgekehrt wär es richtig.

HTTP_GET_VARS (und alle dergleichen) sind veraltet und nicht mehr zu verwenden, zumal nicht global verfügbar.
Als Ersatz dafür wurden _GET etc. eingeführt, die global sind.

_________________
A bus station is where busses stop. A train station is where trains stop. On my desk there is a workstation...


Nach oben
 Profil  
Mit Zitat antworten  
Beiträge der letzten Zeit anzeigen:  Sortiere nach  
Ein neues Thema erstellen Auf das Thema antworten  [ 11 Beiträge ] 

Alle Zeiten sind UTC + 1 Stunde


Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste


Du darfst keine neuen Themen in diesem Forum erstellen
Du darfst keine Antworten zu Themen in diesem Forum erstellen
Du darfst deine Beiträge in diesem Forum nicht ändern
Du darfst deine Beiträge in diesem Forum nicht löschen
Du darfst keine Dateianhänge in diesem Forum erstellen

Suche nach:
Gehe zu:  
POWERED_BY
Deutsche Übersetzung durch phpBB.de
anpera.net - Impressum