• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

str_Replace - Hilfe

Witschi262

Blogger
Hi,
ich würde gerne die str_replace funktion benutzen. Klappt auch ganz gut soweit. Insgesamt möchte ich nämlich bestimmte "Kennzeichen" (in { und } geschrieben) durch einen bestimmten Text in der Datenbank ersetzen.

Folgendes Script:

$sql = "SELECT * FROM `replace`";
$ergebnis = mysql_query($sql)OR die(mysql_error());
while($row = mysql_fetch_object($ergebnis))
{
$name = '{'.$row->name.'}';
$replace = $row->replace;
function replace($buffer)
{
return (str_replace($name, $replace, $buffer));
}
ob_start("replace");
}

Also ohne dem ganzen DB Geschwafel geht alles ganz gut, also ohne die Variable $name und $replace. Sobald ich allerdings den Text aus der DB benutzen möchte, schon nicht mehr.
Hat jemand eine Ahnung wo das Problem liegen könnte?
 
Werbung:
Hallo,

ist das richtig das die funktioin in der DB while schleife drin ist?
PHP Fehlermeldung würde dir oder uns sagen das eine Funktion mit gleichen namen mehr als einmal vorkommt oder meinst nicht :O)

Lagere die einfach mal aus und schalte php error ein :O)

Cheffchen
 
Werbung:
Ich habe dieses Script in einem include eingebunden. Das soll die ganze Website durchkramen und alle Inhalte wie oben genannt aus der Datenbank ersetzen. CMS technisch
 
Werbung:
In der Variable $buffer befindet sich der Inhalt?

Wieso nicht einfacher gestalten? ->

PHP:
while($row = mysql_fetch_object($ergebnis))
{
     $buffer = str_replace('{'.$row->name.'}', $row->replace, $buffer);
}
 
Fatal error: Cannot redeclare replace() (previously declared in /users/witschi262/www/lol/cms/witschcms/cms_top.php:10) in /users/witschi262/www/lol/cms/witschcms/cms_top.php on line 10

Spuckt's mir aus. Aber auch schon davor? Komisch.. Google spuckt zu nix aus.
 
Fatal error: Cannot redeclare replace() (previously declared in /users/witschi262/www/lol/cms/witschcms/cms_top.php:10) in /users/witschi262/www/lol/cms/witschcms/cms_top.php on line 10

Spuckt's mir aus. Aber auch schon davor? Komisch.. Google spuckt zu nix aus.

Wieso entfernst Du die replace()-Funktion nicht einfach und versuchst es mal so, wie ich es in meinem letzten Post vorgeschlagen habe?

Abgesehen davon sagt der Error ja alles aus - du definierst die Funktion 2 mal bzw. bindest Du eine Datei, die diese Funktion beinhaltet mind. 2 mal ein.
 
Werbung:
Das ist ja auch eine Fehlermeldung die Dein Script betrifft. Somit musst Du schauen was die Fehlermeldung in Bezug auf dein Script bedeutet.

Die Meldung "Cannot redeclare replace()" besagt, dass Du offenbar versuchst eine schon vorhandene Funktion nochmal zu deklarieren. Die Funktion ist für mich aktuell nur in deinem ersten Beitrag zu sehen:

PHP:
unction replace($buffer)
      {
      return (str_replace($name, $replace, $buffer));
      }

Ich vermute daher gerade, dass Du irgendwie nochmal eine Funktion namens replace() deklarierst, und zwar in der von der Fehlermeldung angesprochenen Zeile 10 in der o.g. Datei. Also schau nach und prüfe.
 
Eben nicht, dass ist ja das Gruselige. Selbst wenn ich die o.g. Datei auf ca. 2 Zeilen Reduziere kommt der Selbe Error.

In der cms_top.php steht folgendes:
<?php
error_reporting(E_ALL);
include('config.php');
$sql = "SELECT * FROM `replace`";
while($row = mysql_fetch_object($ergebnis))
{
$buffer = str_replace('{'.$row->name.'}', $row->replace, $buffer);
}
?>

P.S.
Warum kann ich die
PHP:
-Tags eigentlich nicht benutzten? Der Text darin enthält nie Absätze.


€:
Okay, Chrome hat mir einfach aus dem Cache Asbach Uralte Teile ausgegeben. Trotzdem funktioniert der Replace Weiterhin nicht. Ich verzweifel langsam. Ich tüftel da schon seid Taegn rum.
 
Zuletzt bearbeitet:
PHP:
<?php
error_reporting(E_ALL);
include('config.php');
$sql = "SELECT * FROM `replace`";
while($row = mysql_fetch_object($ergebnis))
{
$buffer = str_replace('{'.$row->name.'}', $row->replace, $buffer);
}
?>
Wenn es sich hierbei um den gesamten Code handelt und Du nach wie vor die Fehlermeldung (can not redeclare function ...) erhälst, kommt das Problem von der config.php.

​Wie sieht deren Inhalt aus?
 
Werbung:
Hallo,

also das mit der doppelten funktion hatte ich scon am anfang geschrieben.

Kann sein das $buffer immer überschreibst und damit keine ausgabe bekommst.

ändere mal
Code:
$buffer =
in
Code:
$buffer .=

geht das nicht auch einfacher
Code:
[COLOR=#000000][COLOR=#006600][/COLOR][COLOR=#CC0000]'{'[/COLOR][COLOR=#006600].[/COLOR][COLOR=#0000CC]$row[/COLOR][COLOR=#006600]->[/COLOR][COLOR=#0000CC]name[/COLOR][COLOR=#006600].[/COLOR][COLOR=#CC0000]'}'[/COLOR][COLOR=#006600][/COLOR][/COLOR]
so
Code:
[COLOR=#000000][COLOR=#006600][/COLOR][COLOR=#CC0000][/COLOR][COLOR=#006600][/COLOR][COLOR=#0000CC]$row[/COLOR][COLOR=#006600]->[/COLOR][COLOR=#0000CC]name[/COLOR][COLOR=#006600][/COLOR][COLOR=#CC0000][/COLOR][COLOR=#006600][/COLOR][/COLOR]
Cheffchen
 
ändere mal
Code:
$buffer =
in
Code:
$buffer .=
Falsch.

geht das nicht auch einfacher
Code:
[COLOR=#000000][COLOR=#CC0000]'{'[/COLOR][COLOR=#006600].[/COLOR][COLOR=#0000CC]$row[/COLOR][COLOR=#006600]->[/COLOR][COLOR=#0000CC]name[/COLOR][COLOR=#006600].[/COLOR][COLOR=#CC0000]'}'[/COLOR][/COLOR]
so
Code:
[COLOR=#000000][COLOR=#0000CC]$row[/COLOR][COLOR=#006600]->[/COLOR][COLOR=#0000CC]name[/COLOR][/COLOR]
Er definiert im Inhalt Platzhalter der Form {<platzhalter-name>} - die geschweiften Klammern kann er also nicht weglassen.
 
Ich verstehe diese Codezeile aber z.B auch überhaupt nicht.
Warum benutze ich zwei mal $buffer? Wo ist der denn nun überhaupt? Ich habe dann versucht über ob_Start($buffer); etwas zu erzeugen - klappte auch nicht. Wenn ich $buffer ausgeben möchte, bekomme ich nichts. Wenn ich als Test mal selbst 'Apfel' als $row->name definiere und selbiges für Birne, geht es nicht.

Da hier leider auch keiner so richtig Lösung weiß, könnte ich doch alle Dateien mal zum Download stellen, und einer von euch kann man drüber gucken?


TipTos Post vor Chefchens habe ich ganz übersehen - Moment ;)
@TipTop:
Ich habe die cms_top mittlerweile gelöscht und deren Inhalt in die config.php geschrieben. Erschien für mich plausibler, da ich die config.php so oder so einbinde. Der Inhalt ist der Aufbau der Datenbankverbindung und eben der "Replace-Code".

$sql = "SELECT * FROM `replace`";
$ergebnis = mysql_query($sql)OR die(mysql_error());
while($row = mysql_fetch_object($ergebnis))
{
$buffer .= str_replace('{'$name'}', $content, $buffer);
}
ob_start($buffer);
 
Zuletzt bearbeitet:
Werbung:
Du musst jetzt mal ein bisschen konkreter werden, weil es läuft mittlerweile schon wieder auf sowas raus.


Ich ging von folgendem Szenario aus:
PHP:
$buffer = '<html><head><title>{title}</title></head><body>{content}</body></html>';
$sql = "SELECT * FROM `replace`";
$ergebnis = mysql_query($sql)OR die(mysql_error());
while($row = mysql_fetch_object($ergebnis))
{
    $buffer .= str_replace('{'$name'}', $content, $buffer);
}

// gibt die website mit ersetzten Inhalten aus
echo $buffer;


Wenn dem nicht so ist, erläutere bitte mal deine CMS-Architektur, insbesondere den Aufbau deiner Präsentationsschicht.
 
Bei dem "DeppenPingPong" musste ich schmunzeln.
Also:
Ich habe eine Startseite. In diesem Falle erstmal nur ein HTML Grundgerüst.
Das soll es sein:
Der Nutzer fügt an einer beliebigen Stelle einen Platzhalter ein ( z.B "{apfel}") und kann in einer Onlineverwaltung einen Inhalt dafür angeben. Logischerweise wird das in einer Datenbank festgehalten.

Der Nutzer des CMS soll also nur eine Datei am Anfang und am Ende über include() einfügen. In der eingefügten Datei (logischerweise config.php) soll also über str_replace() der Platzhalter erkannt werden (aus der Datenbank) und durch den Inhalt aus der Datenbank ersetzt werden.

Lösen wollte ich das, indem ich den Inhalt in einem Ausgabepuffer, ob_start(); , speichere, filtern lasse und dann ausgeben lasse.

Ich hoffe es ist nun etwas Klarer.
 
Na geht doch ;)

Der Nutzer des CMS soll also nur eine Datei am Anfang und am Ende über include() einfügen. In der eingefügten Datei (logischerweise config.php) soll also über str_replace() der Platzhalter erkannt werden (aus der Datenbank) und durch den Inhalt aus der Datenbank ersetzt werden.

Das wird kaum hinhauen. Umgekehrt würde es funktionieren - sprich, dass Du in die config.php das HTML-Gerüst einbindest:
PHP:
<?php
ob_start();
include 'myhtmltemplate.html';
$buffer = ob_get_clean();
$sql = "SELECT * FROM `replace`";
$ergebnis = mysql_query($sql)OR die(mysql_error());
while($row = mysql_fetch_object($ergebnis))
{
    $buffer = str_replace('{'$name'}', $content, $buffer);
}

// gibt die website mit ersetzten Inhalten aus
echo $buffer; 
?>
 
Werbung:
Ich würde mal sagen, du hast dieses PingPong Spiel nach ca. 20 Beiträgen gewonnen.
Vielen Dank für die umfangreiche Hilfe. Alles Klappt und funktioniert.
 
Zurück
Oben