TP Underground Lounge 07/08
-


Hinweise


Antwort
 
LinkBack Themen-Optionen Thema durchsuchen Thema bewerten
Alt 31.12.2005, 11:47   #1
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE

[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($fp2); // die Logfile wird abgeriegelt
    
$shout fwrite($fp$_POST['Name'].'||'.$_POST['Kommentar']."\n"); // der Neue Eintrag wird ans Ende angehängt
    
flock($fp3); // 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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten


Alt 31.12.2005, 12:34   #2
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 31.12.2005, 13:18   #3
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials

Geändert von hero-master (31.12.2005 um 13:27 Uhr).
hero-master ist offline   Mit Zitat antworten
Alt 31.12.2005, 13:52   #4
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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 &lt; und > durch &gt;
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 31.12.2005, 14:01   #5
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten
Alt 31.12.2005, 14:17   #6
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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"
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 31.12.2005, 14:50   #7
TP-Greis
 
Benutzerbild von Boris
 
Registriert seit: Mar 2001
Ort: Berlin, Germany
Boris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKEBoris ist ein richtiges Arbeitstier - DANKE
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
Boris ist offline   Mit Zitat antworten
Alt 31.12.2005, 15:05   #8
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten
Alt 31.12.2005, 15:15   #9
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 31.12.2005, 15:37   #10
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
danke steffen,
ich habs eben eingefügt und neu hochgeladen. Es will nicht klappen
http://nicogutmann.de/allerlei/shout.php
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten
Alt 31.12.2005, 15:58   #11
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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($fp2);
    
$shout fwrite($fp"$name||$comment\n");
    
flock($fp3);
    
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.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 01.01.2006, 16:15   #12
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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
__________________
Grüße Nico

Meine kleinen CSS-Tutorials
hero-master ist offline   Mit Zitat antworten
Alt 01.01.2006, 16:31   #13
TP-Special Mod
 
Benutzerbild von steffenk
 
Registriert seit: Feb 2005
Ort: Haan / NRW
steffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine Usersteffenk lebt für das TP und seine User
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($fp2); 
    
$shout fwrite($fp"$name||$comment\n"); 
    
flock($fp3); 
    
fclose($fp); 

Jetzt sollte alles in einer Zeile stehen.
__________________

Typo3 · MySQLDumper · dislabs
·
manche Mühlen mahlen schneller ...
"Ich habe Rücken"
Horst Schlämmer
steffenk ist offline   Mit Zitat antworten
Alt 01.01.2006, 16:47   #14
TP-Moderator
 
Benutzerbild von hero-master
 
Registriert seit: Mar 2003
Ort: Hamburg
hero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKEhero-master ist ein richtiges Arbeitstier - DANKE
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(