Ein Include Probem

Liebe/-r Experte/-in,
nach lögerer Programmierabstinenz habe ich ein altes Projekt mal wieder rausgekramt. Anscheined habe ich in der Zwischenzeit alles verlernt. :wink:

Also ich habe ich eigendlich 3 simple Dateien.
index.php
includes/header.php
includes/formula.php

In der index.php wird die header.php included
und im header die formula.php
In der formular.php sollen einige Testausgaben erfolgen.
Aus irgendeinem Grund kommt da nichts raus.
Also zu Testzwecken aus der formua.php alles raus und nur ein dummes echo „Welt“;

Warum wird das ganze auf der index.php nicht angezeigt?

index.php 1. Zeile

<?php include('includes/header.php');...
-- header.php Zeile 1-3 <?php
echo "Haus"; include('./formula.php'); ... -- formula.php komplett <?php echo "Welt"; ?>

Haus wird ausgegeben. Welt nicht?!

Das kuriose an der Geschichte:
Schicke ich das Formular auf der index.php ab (greift auf Funktionen aus der formular.php zu), meckert er, dass die funktionx nicht gefunden wurde. Stelle ich die Orginal formular wieder her, meckert er nicht, die Funktion wird ausgeführt, aber es werden keinerlei Ausgaben angezeigt. Auch nicht im Quelltext versteckt.
Also ist der Pfad korrekt.

Danke für eure Mühe.
Oliver

Hi

also rein programmiertechnisch ist das alles korrekt. Sollte die index.php irgendwo aufgerufen werden (entweder durch formular oder manuell über URL) sind im Quelltext die ersten beiden Ausgaben „HausWelt“ die kommen. Kommen sie nicht wird die index nicht aufgerufen.

Das ist das was ich dir sagen kann anhand der Infos die du mir gegeben hast. Woran es genau liegt, kann ich dir so nicht sagen, dazu bräuchte ich mehr code (am besten die ganzen Dateien).
Du solltest mal checken ob du auch die richtige index.php lädst. Wäre möglich dass du versehentlich eine andere lädst (du könntest falls du auf einem entfernten Webserver arbeitest vergessen haben die Datei hochzuladen).

Diese „funktionx“ von der du sprichst, wo wird die gecallt und wo im code befindet sich die funktions-deklaration?
du siehst… mit mehr code wäre alles leichter :wink:

VG

Hi,
das ging schnell. Waow. Danke.
Der Witz ist:
Zur Fehlereigrenzung habe ich alles rausgeworfen.
Also das war der ganze Code.

index:
sdvsvdsvvayavyv

<?php include('includes/headers.php');?>

header:

<?php echo "Haus";
include('./formula.php'); ?\> formula: <?php echo "Maus";
?\> ### Der Webserver ist ein xampp. Und die Index wird aufgerufen, da ich nun testweise einfach mal Zeichen vor dem php eingegeben habe. Relaod und die werden angezeigt. Ausgabe: sdvsvdsvvayavyv Haus. Oder liegts an der Verschachtelung? Aber kan doch auch nicht, weil include heisst doch eigendlich wie reingeschrieben...

ich glaub ich weiß worans liegt. deine formula.php liegt im include-ordner. sie muss aber im directory der index.php liegen oder du musst mit include(„includes/formula.php“); includen, weil:

beim parsen der index.php wird (wie du vermutet hast)

sdvsvdsvvayavyv

<?php include('includes/headers.php');?>

ersetzt mit

sdvsvdsvvayavyv

<?php echo "Haus";
include('./formula.php'); ?\> d.h. DAS würde in der index.php stehen. der der php-server würde also im hauptverzeichnis nach der formula.php suchen

Mistverdammt. Ja das wars. Danke sehr.
Aber wieso zum Teuel hat der die Funktionen ausgeührt.? Nun ja egal. Dafürbinich ein Fan von www.
Super fettes Dankeschön!

Wenn ich dir noch ein paar Profi-Tipps mit auf den Weg geben darf:

1.) Benutze error_reporting(E_ALL);
error reporting mit E_ALL meckert wegen jeder Kleinigkeit. Für den PHP-Einsteiger mag das zwar nervig sein, aber dafür wird man auf mögliche Fehlerquellen hingewiesen. Korrigiert man die bemängelten Dinge, vermeidet man schonmal die meisten Fehler

2.) Benutze PHP-Debugging
Mithilfe von XDebug (was du am PHP-Server installieren musst) kannst du deinen Code wie in anderen Programmiersprachen debuggen (also während der Ausführung anhalten, Schritt für Schritt durchgehen und in Variablen während der Verarbeitung reinschauen). Damit findet man jeden noch so fiesen Fehler und muss nicht millionen echos einbauen. Ich für meinen Teil wöllte nicht ohne entwickeln. Damit das funktioniert, brauchst du auch einen Editor der XDebug unterstützt (z.B. eclipse). Ich benutze phpDesigner6 (gibt aber schon Version 8). Da ists noch leichter einzurichten und alles speziell auf Webentwicklung mit PHP ausgerichtet.

3.) Erstelle dir Programmierrichtlinien nach denen du entwickelst.
Damit findest du dich schneller zurecht wenn dus erstmal verinnerlicht hast. Das kann Ordnerstrukturen beinhalten (wie organisierst du deine Files; Namenskonventionen), Code-Einrückungen, Funktionsnamen, Variablennamen oder Kommentare. Regeln könnten sein „Jede Funktion bekommt ein beschreibenden Kommentar“ „Der Kommentar muss zuerst geschrieben werden, dann erst die Funktion“, „Sämtliche eingehende Variablen (GET, POST, COOKIE) müssen vor der Verwendung geprüft werden“. Das erfodert etwas Disziplin, aber mir persönlich hilft es sauberer und auch sicherer zu programmieren

4.) benutze var_dump() zum testweisen ausgeben (anstelle von echo)
var_dump zeigt auch inhalte von arrays und objekten an (schön formatiert zur besseren übersicht)

Viel Erfolg noch bei deinen Projekten
Wenn was ist, kannst gern wieder fragen

VG

bei mir funktioniert die Ausgabe.

allerdings in meiner testumgebung funktioniert folgender include nicht:

include(’./formula.php’);

sondern erst wenn ich ihn relativiere:

include(‚formula.php‘);

alternativ könnte man auch folgendes schreiben:

include(dirname(__FILE__).’/formula.php’);

ansonsten sollten alle ausgaben angezeigt werden.

Hallo,
Kurze Antwort
Du musst beim Includen immer von dem Pfad der Datei ausgehen, die als allererste aufgerufen wurde.
Heißt Du hast die index.php die im / aufgerufen wird. Dieser Pfad ist aktuell für alle anderen includeten Dateien, es sei denn du änderst den Pfad.

Wenn die index.php aufgerufen und darin die /includes/… aufgerufen wird, dann muss ein Include in der includeten Datei AUCH mit dem „includes“ -Pfad ausgehen, da der aktuelle Pfad der ist, in der sich die index.php befindet.

In der header.php gehst du jedoch davon aus, du wärest bereits im includes -Verzeichnis.
Also einfach anstatt
include(’./formula.php’);
machst du
include(‚includes/formula.php‘);

Probiers aus :wink:

Sehr geehrter Herr Oliver Eikel,

ich denke, das Problem liegt am Ort des Aufrufs.

Entweder schreiben Sie in INDEX.PHP eine weitere Zeile
mit dem Inhalt :

include(‚includes/formula.php‘);

und rufen formula.php direkt auf

ODER

Sie schreiben in der HEADER.PHP eine Funktion mit Rückgabewert mit der Sie den Inhalt von FORMULA.PHP an
das übergeordnete Programm zurückgeben.

Beispiel (Codierung von FORMULA.PHP) :

$welt = ‚Welt‘;
return($welt); (Rückgabe nach HEADER.PHP)

In der HEADER.PHP müsste dann ebenfalls ein RETURN stehen.

In der INDEX.PHP könnte man dann schreiben :

echo $welt;

Das Problem bei Ihnen ist aber auch, dass die INDEX.PHP
keinen Rückgabewert von HEADER.PHP erwartet.

Also eine Funktion schreiben, die einen Rückgabewert erzeugt.

Eine weitere recht geschickte Möglichkeit ist, in der
INDEX.PHP eine GLOBALE Variable zu definieren (gilt in
allen Unterprogrammen bzw. Includes)) und diese dann in FORMULA.PHP zu füllen.

Ich hoffe, dass ich Ihnen damit geholfen habe.

Mit freundlichen Grüßen

cowboy_herby

Liebe/-r Experte/-in,
nach lögerer Programmierabstinenz habe ich ein altes Projekt
mal wieder rausgekramt. Anscheined habe ich in der
Zwischenzeit alles verlernt. :wink:

Also ich habe ich eigendlich 3 simple Dateien.
index.php
includes/header.php
includes/formula.php

In der index.php wird die header.php included
und im header die formula.php
In der formular.php sollen einige Testausgaben erfolgen.
Aus irgendeinem Grund kommt da nichts raus.
Also zu Testzwecken aus der formua.php alles raus und nur ein
dummes echo „Welt“;

Warum wird das ganze auf der index.php nicht angezeigt?

index.php 1. Zeile

<?php include('includes/header.php');...
-- header.php Zeile 1-3 <?php
echo "Haus"; include('./formula.php'); ... -- formula.php komplett <?php echo "Welt"; ?>

Haus wird ausgegeben. Welt nicht?!

Welche php-Version?

Was gibt
error_reporting(E_ALL); # erste Zeile index.php und
include(‚datei‘) or die (print_r(error_get_last()); aus?

Hallo,
danke für die superschnelle Antwort!
Jau, as wars, verflixt.
Klar muss der Pfad entsprechend der index.php angegeben werden.
Wobei es mir nicht logisch erscheint. Weil zuerstwird doch die Datei formula in die header included.
Und erst dann die erweiterte header in die index.
Oder wird wirklich nur die index abgearbeitet?!

Jo,Mist das wars.
Danke für die superschnelle Antwort!
Wobei es mir nicht logisch erscheint. Weil zuerst wird doch die Datei formula in die header included.
Und erst dann die erweiterte header in die index.
Oder wird wirklich nur die index abgearbeitet?!

Danke für die schnlle Antwort.
Jep, das wars…
Wobei es mir nicht logisch erscheint. Weil zuerstwird doch die Datei formula in die header included.
Und erst dann die erweiterte header in die index.
Oder wird wirklich nur die index abgearbeitet?!

Hallo,
danke für die superschnelle Antwort.
Lag an der Pfadangabe, Mist verflixter.

Wobei es mir nicht logisch erscheint. Weil zuerstwird doch die Datei formula in die header included.
Und erst dann die erweiterte header in die index.
Oder wird wirklich nur die index abgearbeitet?!
Die Lösung war die Erweiterung des indlude in der header um den kompletten Pfad.

Also include(„includes/formula“), statt include(„formula“)

Hallo Oliver,
das Problem ist, dass Includes wie Copy&amp:stuck_out_tongue_winking_eye:aste funktionieren. Den „kuriosen“ Teil habe ich nicht vollständig verstanden, bin mir aber relativ sicher, dass der Pfad eben nicht stimmt.

Sobald header.php im Hauptverzeichnis eingebettet wird zeigen relative Pfad erstmal wieder aufs Hauptverzeichnis. Wenn Du dann dort Dateien aus „includes/“ verwenden willst, musst Du wieder das Verzeichnis voranstellen.
Das ist dann lästig, wenn Du header.php in verschiedenen Ebenen verwenden willst. Dann musst Du statt relativer Pfade auf absolute Angaben zurückgreifen.

Ich hoffe das konnte das Problem lösen und Verständnis für die internen Vorgänge schaffen. Ansonsten kann ich nahezu uneingeschränkt dazu raten require() bzw. require_once() an Stelle von include() zu verwenden. Da bricht das Skript dann immer mit einer Fehlermeldung ab, wenn die Datei nicht vorhanden ist.

Gruß Jens

Wobei es mir nicht logisch erscheint. Weil zuerstwird doch die
Datei formula in die header included.
Und erst dann die erweiterte header in die index.
Oder wird wirklich nur die index abgearbeitet?!

Es wird die index abgearbeitet. Was in der Index includet ist, braucht bei weiteren includes den Pfad zur Index.

Nummer:smiley:atei:[inhalt]
1:/htdocs/index:[include ./inc/foo;]
2:/htdocs/inc/foo:[include bar;]

Also steht in index nach 1:
/htdocs/index.php:[include bar;]

bar nicht unter /htdocs === Problem…

erst wird die index.php verarbeitet. daher muss der include zu der header.php mit vollem pfad gemacht werden. wenn die header.php included wird, wird allerdings jeder include in der header datei relativ zu der header.php datei selbst gesehen und nicht zur index.php.

dirname(__FILE__) gibt auch immer den pfad der aktuellen Datei zurück, d.h. index.php hat einen anderen wert für dirname(__FILE__), als header.php und formula.php, die den selben wert zurückliefern würden, auch wenn sie von der index.php aus included werden.

aus meiner Sicht gibt es zwei Möglichkeiten

<?php include('includes/formular.php');?>

oder

<?php include('../formular.php');?>

einz von beiden sollte klappen.

index.php 1. Zeile

OK. Danke!