PHP Gleichwertiger Ersatz für PHP-Code?

M

Mr. Snoot

Gast
Hio,

meine Seite sieht so aus, dass das Grundgerüst (gesamtes Layout) eine PHP-Datei bildet, in die dann die jeweiligen Inhalte eingebunden werden.

Die Inhalte sind im Grunde einfache HTML-Dateien (nur Text, Bilder u.ä.). Da Suchbegriffe, die der Besucher zuvor auf der Seite gesucht hat hervorgehoben werden sollen, habe ich das ganze bisher so gelöst:
PHP:
  $bereich = $_GET['bereich'];
  $datei = "$bereich/themen/$thema.php";

  $einlesen = file_get_contents($datei);
Danach folgt noch eine Funktion die Wort für Wort überprüft, ob der Suchbegriff mit dem eingelesenen Text übereinstimmt, um ihn ggf. hervorzuheben (das funktioniert alles wunderbar).


So, nun hätte ich in den Inhalten neben dem Text, Bildern usw. aber auch PHP-Code. Dieser wird aber nicht geparsed, wenn ich die Datei auf diese Weise einlese, weshalb ich eine Alternative für obiges Script gesucht habe.

Gefunden habe ich nun folgendes:
PHP:
  $bereich = $_GET['bereich'];
  $datei = "$bereich/themen/$thema.php";

  ob_start();
  require_once($datei);
  $einlesen = ob_get_contents();
  ob_end_clean();
Es funktioniert soweit ich sehe auch alles und der PHP-Code wird korrekt interpretiert.

Nur stellt sich mir die Frage, ob ich den obigen Code durch den neuen problemlos ersetzen kann, oder ob es dadurch zu Problemen kommen könnte, die ich beim Testen bisher nicht feststellen kann!?
 
Dein Code ist sehr unsicher. Dadurch ist es möglich, schadhaften PHP-Code einzubinden.

Wozu brauchst Du die ob_-Funktionen? Sind IMO nicht notwendig.

Ich schlage dir folgendes vor:

PHP:
if ($_GET['bereich'] != '' && $thema != '') {

	$_file = strip_tags($_GET['bereich']) . '/themen/' . $thema . '.php';

        // WENN DIE DATEI EXISTIERT
	if (file_exists($_file)) {

		include_once ($_file);

        // FEHLER BEI NICHT EXISTENTER DATEI
	} else {

		echo '404';
	}

}

Sollte die Variable $thema ebenfalls über $_GET befüllt werden, sollte auch hier strip_tags stattfinden.
Anstatt require_once würde ich auch auf include_once() zurück greifen, da hier nur im Fehlerfalle ein warning anstatt eines fatal errors zurückgegeben wird.
 
Zuletzt bearbeitet:
warum includest du die Datei nicht dann funzt es :D

PHP:
<?php
if(isset($_GET['fd']) && isset($_GET['seite']) && file_exists($_GET['fd']."/".$_GET['seite'].".php"))
{
include ($_GET['fd']."/".$_GET['seite'].".php");
 }else if(isset($_GET['seite']) && file_exists($_GET['seite'].".php"))
{
 include ($_GET['seite'].".php");
  }else if (empty($_GET['seite']))
{
 include("main.php");
 }else
{
 echo "Fehler 404, die angegebene Seite existiert nicht.";
 }
?>

EDIT: ahh war einer schneller als ich :D
 
Ich kann die Datei nicht einfach so einbinden, wegen der Suchbegriffs-Geschichte. Die Datei muss als Wort für Wort eingelesen werden, damit ich danach noch die Markierung für den Suchbegiff setzen kann.

Bin leider nicht so fit in PHP, hab mir das zweite Script nur ergooglet.

Für $_GET['bereich'] und $_GET['thema'] habe ich weiter oben festgelegte Werte, die 'bereich' und 'thema' sein dürfen, sonst wird das Script eh abgebrochen.
 
Nein, das läuft ja schon alles.

Ich brauche jetzt nur etwas, um die Inhalte einzulesen, so dass aber auch der PHP-Code in diesen Inhalten geparsed wird. Bisher habe ich das eben mit
PHP:
$einlesen = file_get_contents($datei);
gemacht, aber damit wird der Code ignoriert. Darum das zweite Script.
 
Wenn du die Inhalte via
include($filepath);
einbindest wird der PHP-Inhalt geparst. Alternativ auch require.
 
Solange es funktioniert kannst du das natürlich benutzen. Elegant finde ich die Lösung aber irgendwie nicht.

Ist denn der PHP-Code in den includierten Dateien oft in HTML-Code verschachtelt?
Also z.b. sowas:

PHP:
<td>bla <?php echo... ?> </td>

Oder ist das schön getrennt?
Wenn ja, würde ich vorschlagen den HTML-Output direkt in der Datei jeweils durch folgenden Code jagst:

PHP:
preg_replace('/(' . $suche . ')/i', '<span class="highlight">$1</span>', $str);
 
Ist mehr oder weniger getrennt (mit paar Ausnahmen).

Der Code um den Suchbegriff hervorzuheben sieht dann so aus:
PHP:
$einlesen = preg_replace("/((<[^>]*)|$search_str)/ie", '"\2"=="\1"? "\1":"<span class=\"suchbegriff\">\1</span>"', $einlesen);
(damit keine Wörter innerhalt eines Tags - <a href="suchbegriff/index.php">...</a> - ersetzt werden)
 
Zurück
Oben