 |
| Hinweise |
Willkommen im TP-Hilfe-Forum!Dies ist ein Forum zu den Themen Photoshop, Dreamweaver, Flash, Selbständigkeit und mehr, in dem Du Hilfe, Anleitung oder eine Lösung zu Deinen Problemen erhältst. Aktuell bist Du in unseren Foren als Gast mit reinen Leserechten unterwegs. Wenn Du Dich registrierst, kannst Du eigene Themen verfassen, deine Frage stellen und privat mit anderen TPlern kommunizieren. Weitere Foren werden zugänglich, und Du wirst – falls gewünscht – per Mail über neue Beiträge informiert. Die Registrierung ist schnell und kostenlos. Sollten bei der Registrierung Fragen auftauchen, reicht ein Klick in unsere Hilfe - Häufig gestellte Fragen oder eine kurze Mitteilung an das Support-Team. Viel Spaß bei Traum-Projekt.com |
31.12.2005, 11:47
|
#1
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
[PHP] Shoutbox Reihenfolge und Mehrzeiligkeit
Hallo zusammen
Wie versprochen melde ich mich heute mit einem weiteren PHP-Problem 
Und zwar möchte ich eine kleine Shoutbox erstellen, um dort Kommentare einzutragen.
Dazu habe ich als Grundlage dieses Script hier genommen:
http://webmasterpro.de/content_tip-1371.php
Dies hab ich nach meinen Ermessen umgeschrieben:
PHP-Code:
$logfile = "shouts.txt"; // Datenbank, in "shouts.txt" werden die Einträge gespeichert
if(isset($_POST['Senden']))
{
$fp = fopen($logfile, "a+"); // die Logfile wird geöffnet zum Beschreiben
flock($fp, 2); // die Logfile wird abgeriegelt
$shout = fwrite($fp, $_POST['Name'].'||'.$_POST['Kommentar']."\n"); // der Neue Eintrag wird ans Ende angehängt
flock($fp, 3); // die Logfile wird wieder entriegelt
fclose($fp); // Datei wird geschlossen
}
PHP-Code:
$alle_eintraege = 40; // Anzahl der zu zeigenden Einträge
$data = @file($logfile); // Einträge werden in ein Array eingelesen
$eintraege = count($data); // Einträge werden gezählt
$x = $eintraege; // Einträge werden nummeriert
for($i=$eintraege-$alle_eintraege; $i<$alle_eintraege; $i++)
{
if(trim($data[$i])!="") {
$split = explode('||', $data[$i]); // Die Einträge werden bei "||" getrennt
echo "<h4>Kommentar #". $x-- ." von ". htmlspecialchars($split[0]) .":</h4>\n";
echo "<p>". htmlspecialchars($split[1]) ."</p>\n";
}
}
Onlinebeispiel: http://nicogutmann.de/allerlei/shout.php
Ich verstehe das Script schon recht gut und alles klingt für mich auch plausibel. Doch einiges habe ich noch nicht ganz verstanden bzw. will ich abändern, weiß aber nicht wie das gehen könnte:
1. trim($data[$i])!="" : durch trim() kann man ja Whitespaces entfernen lassen. Was hat das denn hier für eine Wirkung?
Meine Idee: Wenn jemand ein Leerzeichen zu Beginn einbaut dann wird das quasi entfernt?
2. Ich würde gerne die neuesten Einträge oben platziert bekommen. Also müsste ich das Script dazu bringen, dass es die Texte, die in dem Textfile gepsiechert sind von unten nach oben zu lesen oder die Texte andersherum speichern. Wie würde das gehen?
3. Wenn ich in dem Textfeld einen Zeilenumbruch erzwinge (per Enter) dann wird auch in der Textdatei ein Zeilenumbruch erzeugt und es wird als neuer Eintrag interpretiert, bzw. eben nur als "Name". Wie kann ich der Shoutbox erklären, dass er den Text in der Textdatei in der gleichen Zeile anzeigt, jedoch im Endeffekt er diesen Umbruch anzeigt, also einen br-Tag einfügt.
Viele Fragen, ich weiß aber ich möchte so langsam mal damit beginnen PHP besser zu verstehen und acuh ein wenig zu erlernen und das mit "Learning by doing", da das mit CSS so gut geklappt hat 
|
|
|
31.12.2005, 12:34
|
#2
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
Hi Nico,
ein klein wenig Aufklärung:
trim entfernt nicht nur überflüssige Leerzeichen links und rechts sondern auch Zeilenumbrüche am Ende des Strings. Wenn man daher auf leer prüfen will, tut man gut daran, diese zeichen erstmal zu entfernen.
Um eine Reihenfolge zu erreichen, gehst Du am besten so vor:
$zeilen=file($logfile);
Jetzt hast Du alle Zeilen in einem Array, mit count($zeilen) erfährst Du die Anzahl. Wenn Du mit den letzten Zeilen beginnen willst, drehst Du das Array einfach um:
$zeilen=array_reverse($zeilen);
Um Umbrüche (\n unter Linux, \n\r unter Windows) in HTML zu wandeln , machst Du einfach folgendes:
$a=nl2br($text);
viel Erfolg weiterhin 
|
|
|
31.12.2005, 13:18
|
#3
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
Hallo steffen!
Vielen Dank für deine Hilfe 
trim hab ich kapiert und die Kommentare werden in der richtigen Reihenfolge ausgegeben, nur das mit den Zeileumbrüchen hab ich nicht so ganz hinbekommen:
nl2br() kannte ich schon, jedoch wusste ich nicht, wie ich das auf dieses Script anwenden kann 
Welche Vraible muss ich für $a, welche für $text einsetzen?
$Kommentar für $text?
Edit:
Wenn ich beispielsweise das hier eingebe:
$split[1] = nl2br($split[1]);
Zeigt er mir zwar ein <br /> an, jedoch nur als Text und der Rest ist gleich 
Geändert von hero-master (31.12.2005 um 13:27 Uhr).
|
|
|
31.12.2005, 13:52
|
#4
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
nl2br macht nichts anderes als die Zeilenumprüche in <br> umzuwandeln.
Ich setz das meist so ein, das ich es bei der Ausgabe umwandel, also so wie Du es angewandt hast, also
echo nl2br($split[1]);
Wenn er Dir das br anzeigt, dann hast Du den String wohl mit htmlspecialchars($text) umgewandelt - das ersetzt z.B. < durch < und > durch >
|
|
|
31.12.2005, 14:01
|
#5
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
Hi nochmal 
Jetzt wird zwar das <br> eingefügt, jedoch wird trotzdem die 2-Zeile als Namen von dem nächsten Eintrag gezählt, da in die Textdatei immer noch folgendes übertragen wird:
Code:
Name||1.Zeile
2.Zeile
Und ich möchte das eben so haben:
Code:
Name||1.Zeile 2.Zeile
|
|
|
31.12.2005, 14:17
|
#6
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
sag das doch gleich, das Du die Zeilenumbrüche ganz weg haben willst
so kannst Du die alle eleminieren (ohne nl2br):
$text = String mit Zeilenumbrüchen
$nureinezeile=strtr($text,array("\r"=>"","\n"=>""));
Das Array in strtr ist nach dem Muster "Suchstring"=>"Ersatzstring"
|
|
|
31.12.2005, 14:50
|
#7
|
|
TP-Greis
Registriert seit: Mar 2001
Ort: Berlin, Germany
|
Ich würde Zeilenumrüche so entfernen:
$string=preg_replace('/\r\n|\r|\n/', '', $string);
PREG Power 
__________________
“My software never has bugs. It just develops random features ...”
» DevShack - die Website des freien Webentwicklers Boris
|
|
|
31.12.2005, 15:05
|
#8
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
Ich weiß jetzt nicht ob ich zu blöd bin das richtig einzusetzen:
Zeilenumbrüche sollen in der shouts.txt unterbunden werden, wenn man im Textfeld einen Zeilenumbruch erstellt, jedoch sollen sie dann wieder als Zeilenumbruch ausgegeben werden:
http://nicogutmann.de/allerlei/shout.php
|
|
|
31.12.2005, 15:15
|
#9
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
na das, was wir oben geschrieben haben, also
echo "<p>". htmlspecialchars(strtr($split[1],array("\r"=>"","\n"=>""))) ."</p>\n";
@Boris - für den Anfang finde ich den Umgang mit regulären Ausdrücken zu kompliziert, hier ist es besser, erstmal die php-eigenen Befehle kennenzulernen.
Bei komplexeren Such-/Ersetzungsroutinen kommen die noch früh genug 
|
|
|
31.12.2005, 15:58
|
#11
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
ja, kein Wunder
Da Du in einem Kommentar mehrere Zeilen hast, werden Dir diese auseinandergerupft (also in mehreren Deiner Array-Elementen). Daher empfehle ich Dir, die Zeilenumbrüche nicht als Zeilenumbrüche abzuspeichern, so das ein Kommentar immer in einer Zeile bleibt. Das erreichst Du mit Maskierung:
PHP-Code:
if(isset($_POST['Senden']))
{
$name=get_magic_quotes_gpc() ? $_POST['Name'] : addslashes($_POST['Name']);
$comment=get_magic_quotes_gpc() ? $_POST['Kommentar'] : addslashes($_POST['Kommentar']);
$fp = fopen($logfile, "a+");
flock($fp, 2);
$shout = fwrite($fp, "$name||$comment\n");
flock($fp, 3);
fclose($fp);
}
Beim Auslesen musst Du das wieder rückgängig machen:
PHP-Code:
echo "<h4>Kommentar #". $x-- ." von ". htmlspecialchars(stripslashes($split[0])) .":</h4>\n";
echo "<p>". htmlspecialchars(strtr(stripslashes($split[1]),array("\r"=>"","\n"=>""))) ."</p>\n";
Wenn Du Dir dann das logfile anschaust, müssen alle Umbrüche als \\n abgespeichert sein.
|
|
|
01.01.2006, 16:15
|
#12
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
Hallo Steffen,
wie versprochen geht das Problem bis ins Jahr 2006
Leider ändert sich dabei nichts, sowohl in der Textdatei als auch bei den Kommentaren.
Hab nochmal alle Infos auf der Seite:
http://nicogutmann.de/allerlei/shout.php
|
|
|
01.01.2006, 16:31
|
#13
|
|
TP-Special Mod
Registriert seit: Feb 2005
Ort: Haan / NRW
|
okay, dann gehen wirs anders an
PHP-Code:
if(isset($_POST['Senden']))
{
$name=get_magic_quotes_gpc() ? $_POST['Name'] : addslashes($_POST['Name']);
$comment=get_magic_quotes_gpc() ? stripslashes($_POST['Kommentar']) : $_POST['Kommentar'];
$comment=strtr($comment,array("\n"=>"||"));
$fp = fopen($logfile, "a+");
flock($fp, 2);
$shout = fwrite($fp, "$name||$comment\n");
flock($fp, 3);
fclose($fp);
}
Jetzt sollte alles in einer Zeile stehen.
|
|
|
01.01.2006, 16:47
|
#14
|
|
TP-Moderator
Registriert seit: Mar 2003
Ort: Hamburg
|
Perfekt, viele Dank 
Hab das noch ein wenig umgeändert, damit das nun passt:
PHP-Code:
$Name = get_magic_quotes_gpc() ? $_POST['Name'] : addslashes($_POST['Name']); $Kommentar = get_magic_quotes_gpc() ? stripslashes( | | |