[PHP] str_replace() liefert 1 zurück

tucow

*****
20 April 2006
41
0
Mahlzeit,

ich entwickel zur Zeit eine neue Intranet Anwendung für die IT Abteilung unseres Unternehmens.
Jedoch stehe ich gerade vor einem Problem, welches mir so noch nie untergekommen ist.
Ich habe das Design der Maske mit Div Tags gelöst, da es später noch Dynamisch werden soll und sich jeder Benutzer seine Arbeitsumgebung individuell gestalten kann/soll.

Nun habe ich ein Div Tag in welchem der Inhalt erscheinen soll, das ganze ist in einem Template gespeichert und nun wird die "Variable" [Inhalt] im Template durch ein Script mit dem wahren Inhalt ersetzt.
Dies löste ich mit str_replace()
PHP:
$foo2  = str_replace("[Inhalt]", include("./includes/action.inc.php"), $foo1);
jedoch liefert diese Zeile nur eine "1" an der gewünschten stelle zurück, der restliche Inhalt wir am Anfang der Seite angezeigt, direkt hinter dem Body Tag.

an der action.inc.php kann es meiner Ansicht nach nicht liegen, denn es hat bisher in allen Scripten gut funktioniert.

Zur Sicherheit hier mal die action.inc.php:
PHP:
<?php
if(!isset($_REQUEST["page"])) {
	include("./templates/non.tpl");
} elseif ($_REQUEST["page"] == "dbu") {
	include("./user.php");
} elseif ($_REQUEST["page"] == "show") {
	include("./show.php");
} elseif ($_REQUEST["page"] == "vis") {
	include("./visitor.php");
} elseif ($_REQUEST["page"] == "tra") {
	include("./trashcan.php");
} elseif ($_REQUEST["page"] == "sup") {
	include("./supporter.php");
}
?>

Komischerweise wird alles andere durch str_replace() richtig ersetzt.
Habt Ihr eine Idee?



Gruß,
Andreas
 
ist ja auch totaler quatsch was du da machst... str_replace erwartet nen string oder nen array als 2ten parameter und was leifert include zurück? true oder false... was php durch das typcasting zum string zu 1 oder 0 wird.
 
Also 1 ist true.. und in diesem Fall erfolgreich.
Aber,.. der liest ja dann den ganzen Quellcode ein.. und .. o_O Sorry, aber ich würd versuchen das anders zu lösen...
 
Danke, Ihr habt mir gerade den Wald vor lauter Bäumen auf einen Baum reduziert.

Habt Ihr eine Idee wie ich es lösen könnte?
Ich hab momentan irgendwie eine Blockade im Kopf, sonst wär mir der Fehler sicher auch schon aufgefallen auf de Ihr mich hingewiesen habt.
 
*edit* ok man sollte nicht immer die hälfte lesen...
PHP:
ob_start();
include('./includes/action.inc.php');
$temp = ob_get_contents();
ob_end_clean();

str_replace(...,$temp...);
das script wird ausgeführt hat zugriff auf die ressourcen des aufrufenden scriptes, und die ausgabe wird durch str_replace gejagt.
 
Zuletzt bearbeitet:
Es funktioniert.. Geil, danke Dir!

Kannst Du mir vielleicht kurz die Funktionsweise erklären?
Damit ich es nicht nur blind verwende sondern auch weiß es später in anderen Scripten zu verwenden.

Meine "Theorie":
Alles zwischen ob_start() und ob_end_clean() wird ausgeführt, wird jedoch nicht angezeigt, include ist klar und ob_get_contents() schiebt lles in die angegebene Variable.

Ist das so in etwas richtig?


edit: man sollte richtig lesen, Du hast es ja schon grob erklärt unter dem Code, danke.
 
hrm die erklärung die ich abgegeben hab ist ein wenig aus dem zusammhang gerissen... hatte anfangs 3 lösungswege gepostet. das was du aber geschreiben hast beschreibt die funktion recht treffend... ob_* sind output buffer funktionen. ob_start aktiviert den ausgabe buffer... also alles was ne ausgabe erzeugt wird erstmal zwischen gespeichert. mit ob_get_contents() kannst du dir den aktuellen inahlt zurückgeben lassen und mit ob_end_clean(), sagst du buffer beenden und löschen. somit wird das was include(...) ausgibt in eine variable geschreiben und danach kann man diesen manipulieren wie man will.
 
OT: da ich auch am PHP lernen bin verfolge ich das hier immer. Nur nochmal zum checken.. Also das ganze holt alles in nen buffer bis was bis zu $var = ob_get_contents(); geschieht (ob includen, echo, print oder was auch immer ausgegeben wird) und setzt es in $var.. Danach wird der buffer mit ob_end_clean(); geleert (aber nicht die $var mit dem inhalt des Buffers).. Und erst dann kann man alles mit str_replace() untersuchen..
RICHTIG? 8)
 
Standard ist, dass jede Ausgabe direkt an vom Server an den Browser weitergeleitet wird, will man das aber nicht verwendet man einen Output Buffer (Ausgabe-Puffer). Der Server sendet nicht mehr direkt an den Browser weiter, sondert speichert die Ausgabe erstmal im Memory zwischen, bis er den Befehl bekommt die Ausgabe zu senden:
Diesen Befehl bekommt er automatisch wenn der PHP-Script fertig ist ODER man löst ihn mit ob_flush() bzw. ob_end_flush() manuell aus.
Der Ausgabe-Puffer wird mit Hilfe von ob_start() innerhalb eines Scriptes aktiviert. Jede Ausgabe kommt dann in den Puffer. Diesen Puffer kann man sich mit ob_get_contents() in eine Variable holen um mit ihm weiter zu arbeiten (z. B. str_replace drüber laufen lassen). Zu beachten ist dabei nur, dass der Puffer immer noch die bisher gemachten Ausgaben enthält, wird der Script also jetzt beendet, dann wird der Puffer an den Browser gesendet. Das wollen wir in diesem Fall aber gar nicht. Wir wollen ja eine modifizierte Variante der Ausgabe ausgeben, daher wird der Puffer mit ob_end_clean() gelöscht und deaktiviert. Ab diesem Funktionsaufruf geht die Ausgabe also wieder direkt an den Browser. Das Ergebnis ist also, dass wir verhindert haben, dass die Ausgabe die durch die Includedatei erfolgt wäre nicht an den Browser geschickt haben, sondern quasi in eine Variable umgeleitet haben.

btw: Auch wenn die Manual zu ob_start() anderes Vermuten lässt, die Funktion hat sehr wohl die Möglichkeit einen Parameter zu empfangen, so dass man quasi vollautomatisch vor der Ausgabe an den Browser nochmal die Ausgabe manipulieren kann, dass führt jetzt allerdings ein bisschen weit, siehe daher dazu die User-Kommentare im Manual.

@php: ob_get_contents() holt also nix in den Puffer hinein sondern holt es da heraus. Und ob_end_clean() löscht den Inhalt des Buffers, aber nicht den Inhalt der Variable, weil die Variable ja nur eine Kopie des Inhaltes des Puffers zum Zeitpunkt des Aufrufes von ob_get_contents() hat. Andernfalls wäre es ja ein Pointer/Reference auf den den Puffer. Du kannst die str_replace() Sachen auch noch vor dem ob_end_clean() machen, du musst halt nur beachten, dass jede Ausgabe die vor dem deaktivieren des Puffers gemacht wird im Puffer landet, bevor du also das Ergebnis von str_replace ausgibst solltest du den Puffer beenden (oder wenigstens leeren).

@tucow: Sei dir aber bewusst, dass das eine Art Notlösung ist. Viel besser wäre es, wenn deine Includedatei gleich ihre „Ausgabe“ in eine Variable erledigt oder du gar mit dem Rückgabewert einer Funktion/Methode arbeitest.
Wenn der Inhalt von der Includedatei sogar statisch ist (was ich in dem Fall hier jetzt aber nicht glaube und ZeroCCC sicher in seiner 1. Version vorgeschlagen hatte), dann solltest du dir file_get_contents() ansehen.

Hoffe mit diesem (langen) Post konnte ich alle Klarheiten restlos beseitigen ;)
 
btw: Auch wenn die Manual zu ob_start() anderes Vermuten lässt, die Funktion hat sehr wohl die Möglichkeit einen Parameter zu empfangen, so dass man quasi vollautomatisch vor der Ausgabe an den Browser nochmal die Ausgabe manipulieren kann, dass führt jetzt allerdings ein bisschen weit, siehe daher dazu die User-Kommentare im Manual.
Bevor die Kommentare anguckt werden, würde ich die Sprache der Doku eher auf englisch stellen, denn dort werden die optionalen Parameter von ob_start() ziemlich gut erklärt. ;)