Hi,
ich habe ein Problem mit einem selbstgestrickten Mini-Content-Managementsystem auf Basis einer MySQL-Datenbank, in dem die einzelnen Webseiten in einer Datenbanktabelle gespeichert sind und über PHP auf die Seite gebracht werden, nachdem über den Navigationslink die Seite gewählt wurde. Das funktioniert auch einwandfrei.
Außerdem soll es möglich sein, eine Seite auszuwählen, um sie zu ändern. Dann wird diese Seite in einem Textarea-feld gezeigt, und man kann ergänzen, etwas ändern oder löschen. Auch das läuft, Code kommt weiter unten, falls Ihr solange den Nerv habt.
Ich habe hier a) ein Problem mit den Zeilenumbrüchen bei einer Änderung. Ich verwende natürlich die Funktion nl2br, wenn man beim Ändern im textarea-Feld Zeilenumbrüche macht, das Ganze soll ja in <br /> umgewandelt werden, um dann im HTML-Code zu stehen. Die Zeilen werden nun immer mehr, je öfter die Seite zum Ändern aufgerufen wird. Die genauere Erläuterung folgt unten, weil ich gerne den Code zeigen will, damit Ihr wisst, was ich meine.
b) möchte ich gerne fragen, ob jemand weiß, ob ich die HTML-Tags im textarea-feld "unsichtbar" machen kann, ohne sie aber zu verlieren. Die php-Funktion strip_tags entfernt ja einfach die tags, ich brauche sie aber noch, sie sollen auch nach Änderungen weiter in der mysql-Tabelle stehen, damit man sie nachträglich ändern kann. Es wäre nur schön, wenn man sie einfach nicht sehen würde.
Die Datenbank besteht (bislang) aus einer einzigen Tabelle mit den drei Feldern id, linkname und inhalt. id ist Primärschlüssel und auto_increment, linkname enthält nur den Namen der Unterseite im Navigationsbereich, und inhalt enthält den gesamten "inneren" HTML-Code der Seite, also ohne head usw. Die Seite wird auf den Bildschirm gebracht, wenn im Nav-Bereich gewählt wurde (bisher ist das Ganze noch für register_globals=on, ich kenne die Problematik und werde es noch ändern):
Navi-Bereich: (erzeugt die Liste der anklickbaren Links)
<?php
include ("verbindung.php");
$sql=("select id,linkname from seiten");
$linkliste = mysql_query($sql);
while ($row=mysql_fetch_array($linkliste)){
$test=$row['id'];
echo "<li><a href="content.php?sch=$test" target="inhalt"> ";
echo $row["linkname"];
echo "</a></li><br>";
}
?>
Dann wird in der Datei content.php die Seite gezeigt:
?php
include ("verbindung.php");
// mit der folgenden query wird der gewünschte Inhalt aus der DB gelesen
$abfrage=("select inhalt from seiten where id='$sch'");
// in die Variable Ergebnis wird eingelesen, was die Abfrage ergeben hat.
$ergebnis=mysql_query($abfrage);
$row=mysql_fetch_assoc($ergebnis);
echo $row["inhalt"];
echo "<br>Admin-Bereich: <a href='admin.php'>Hier klicken</a>";
?>
Durch die Zeile oben:
echo $row["inhalt"]; wird die komplette HTML-Seite, die ,wie gesagt, in der mysql-Tabelle ist, gezeigt.
Nun kommt der CMS-artige Teil (wie gesagt im Mini-Format), der auf der Datei admin.php zunächst die Auswahl der zu ändernden Dateien zeigt und über checkbox die Seite zum Ändern auswählen lässt, und der außerdem erlaubt, eine neue Seite anzulegen:
Der Link zum Admin-Bereich leitet auf die Detei admin.php, bisher noch ohne Passwortschutz, ist alles erstmal zum Probieren.
<div id=mainlinks>
<h2 class=kurz>Seiten ändern</h2>
<form action="loesch_bearbeit.php" method="post" >
<?php
include ("verbindung.php");
// mit der folgenden query wird der gewünschte Inhalt aus der DB gelesen
$abfrage=("select inhalt from seiten where id='$sch'");
// in die Variable Ergebnis wird eingelesen, was die Abfrage ergeben hat.
$ergebnis=mysql_query($abfrage);
// Die Funktion mysql_fetch_assoc holt den Inhalt aus dem Array:
$row=mysql_fetch_assoc($ergebnis);
echo $row["inhalt"];
echo "<span class=unterlegt>Liste der Seiten:</span><br><br>";
echo "<table><tr><td>Seite</td><td>Bearbeiten</td><td>Löschen</td></tr>";
$liste = mysql_query("select id,linkname from seiten");
/* die folgende Schleife bringt die Namen der Links zur Auswahl und erlaubt, eine davon zum Bearbeiten oder Löschen anzuklicken: */
while ($row=mysql_fetch_array($liste)){
echo"<tr><td>";
$nr=$row['id'];
echo $row["linkname"]."</td><td> ";
echo"<input type='checkbox' name='bearbeiten' value='$nr'></input></td>";
echo"<td><input type='checkbox' name='loeschen' value='$nr'></td></tr>";
}
?>
</table><br>
<div align=center><input type="Submit" name="abschicken" value="Abschicken"></div>
</form>
</div>
<!- - im folgenden Teil kann man eine neue Seite hinzufügen: - ->
<div id=mainrechts>
<h2 class=kurz>Seiten hinzufügen</h2>
Klicken Sie auf den Button unten, um eine neue Seite einzufügen. Sie können den Namen der Seite eingeben, und natürlich den Text. <br>Den Text können Sie aus Word oder anderen Programmen kopieren und einfügen.<br>
Die Seite und der Titel wird in die Datenbank aufgenommen und ist direkt anschließend auf der Website zu sehen.
<form action="neu.php" method="post" >
Hier folgt jetzt der php-Teil der Datei loesch_bearbeit.php. Der Inhalt wird aus der DB-Tabelle gelesen, indem die vorher gewählte id übergeben wurde, und dann wird der HTML-Code mit Text, auf den es hier ja ankommt, in das Textarea-Feld gebracht, damit man Änderungen oder Ergänzungen im Text vornehmen kann. Den unteren Teil zum Löschen brauche ich, glaube ich, nicht näher zu erklären. Er wird ja nur dann gebraucht, wenn mian vorher eine Seite zum Löschen gewählt hat.
<?php
include ("verbindung.php");
if (isset ($bearbeiten) && ($bearbeiten) !=""){
echo "<h2 align='center'>Daten bearbeiten</h2>";
$sql=("select inhalt from seiten where id='$bearbeiten'");
$ergibt=mysql_query($sql);
$row=mysql_fetch_assoc($ergibt);
echo "<form action='update_seiten.php' method='post' >";
$anzeigen=$row[inhalt];
echo "<textarea name='content' cols='70' rows='30'>";
echo "$anzeigen";
echo "</textarea>";
echo "<input type='hidden' name='zahl' value='$bearbeiten'></input>";
echo "<input type='Submit' name='Aufnehmen' value='Änderungen bestätigen'>";
echo "</form>";
}
if (isset ($loeschen) && ($loeschen) !=""){
echo "<br><br><b>Der Eintrag nr.: ".$loeschen." wurde Gelöscht!!</b>";
$abfrage="delete from seiten where id=$loeschen";
$res = mysql_query($abfrage);
if(!$res) {echo mysql_error();
}
}
?>
Wenn Änderungen vorgenommen wurden, wird der gesamte geänderte Seiteninhalt in die Datei update_seiten.php gebracht. Die wandelt die Zeilenwechsel in <br> um, zeigt alles nochmal als echo, und führt das update der Seite aus.
<?php
include ("verbindung.php");
$content=nl2br($content);
$content=stripslashes($content);
echo $content;
$abfrage="update seiten set inhalt ='$content' where id=$zahl";
$tues=mysql_query($abfrage);
?>
Wie gesagt, alles läuft soweit gut, aber die Zeilenumbrüche: Durch die Zeile
$content=nl2br($content);
verwandle ich Zeilenumbrüche in <br />. Die Zeilenumbrüche an sich bleiben aber drin. Wenn man später nochmal dieselbe Datei aufruft, kommt sie wieder ins textarea-Feld. Der rein optisch sichtbare Zeilenwechsel ist noch da, und zusätzlich das HTML-Tag <br />.
Jedesmal, wenn man die Datei zum Ändern in das textarea-Feld aufruft, gibt es einen Zeilenwechsel mehr! Das <br /> ist da, und der durch Return-Drücken erzeugte Zeilenwechsel, der immer wieder umgewandelt wird!
Ist eigentlich auch logisch, aber ich weiß jetzt nicht weiter, wie ich es verhindern kann.
Wenn mir jemand hierzu einen Rat geben kann, würde ich mich sehr freuen.
P. S. Die beiden Funktionen htmlspecialchars und htmlentities (wie man es in Erläuterungen zu Gästebüchern etc. findet), brauche ich insgesamt meines Erachtens für das Ganze nicht, denn ich will ja das HTML an sich erhalten, es soll ja wieder "wirken", wenn die Seite aufgerufen wird.
Vielen Dank für Eure Geduld – weiß jeman einen Rat?