julian57
Goto Top

Projekt Gästebuch - Spamschutz, Bugfixing, Reload-Sperre, Adminbereich...

Hallo,
ein kurze und für euch wahrscheinlich einfache Frage:
Wie kann ich die folgende Tabelle um 10px einrücken? Ich dachte zunächst das funktioniert genau wie in HTML mit Margin doch da hab ich wohl falsch gedacht.
<?php
   echo "<table margin=\"0px 10px 0px\" border=\"1\" cellspacing=\"0\" cellpadding=\"5\" bordercolorlight=\"black\" bordercolordark=\"black\" width=\"540px\">  
   </table><br>
   ";  
   }
?>
Hoffe auf eine schnelle Hilfestellung :D

Gruß

Julian57
Kommentar vom Moderator masterG am 22.10.2011 um 09:56:42 Uhr
Da dieses Thema von der eigentliche Frage abschweift, schließe ich es. Der Threadersteller kann zu den restlichen Fragen, eigene Threads aufmachen.

Content-ID: 174811

Url: https://administrator.de/forum/projekt-gaestebuch-spamschutz-bugfixing-reload-sperre-adminbereich-174811.html

Ausgedruckt am: 27.12.2024 um 19:12 Uhr

Arano
Arano 17.10.2011 um 22:10:32 Uhr
Goto Top
Hallo Julian,

Hoffe auf eine schnelle Hilfestellung :D
Kommt sofort... naja, etwas verspätet.

Es gibt keine HTML-Attribute namens "margin": Index of the HTML 4 Attributes (w3.org)
Dieses "margin" gibt es aber als CSS-Eigenschaft: CSS4you - margin
Auf der Seite hast du auch gleich ein Beispiel wie du das CSS anwenden kannst.

Übrigens, das hat nichts mit PHP zu tun ;)
Mit PHP "generierst" du ja eine HTML-Ausgabe und diese wird vom Browser dargestellt.
Der Browser bekommt also nur das ausgegebene HTML und damit hast du Darstellungsschwierigkeiten.

Du solltest auf CSS umstelle, damit hast du wesentlich mehr Möglichkeiten - wie man gerade sieht ;)


Viel Erfolg
~Arano
Julian57
Julian57 18.10.2011 um 00:04:55 Uhr
Goto Top
Ich weiß wie man Margin im Zusammenhang von HTML und CSS benutzt.
Anscheinend muss ich für eine Lösung mehr Info's preisgeben...
Also ich habe heute Mittag ein PHP-Script eines Gästebuchs in meine Homepage eingefügt. Meine Homepage basiert auf HTML und CSS.
Das Script funktioniert bis auf einen kleinen Bug auch zuverlässig. Zwei weitere Dinge stören aber bislang noch mehr: Zum einen der mangelnde Spam-Schutz, und zum anderen das die Kommentare mit 0px Abstand neben meiner Navigation liegen.

Hier nun allgemein der wichtige Auszug aus dem Script....(gaestebuch.php)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">  

<head>
...
</head>

<body>
...
<h1>Gästebuch</h1>
<form style="margin: 0px 10px 0px" action="neuerbeitrag.php" method="post">  
<table>
<tr><td>Ihr Name:</td>
<td><input name="Name" size="54"></td></tr>  
<tr><td>Ihre E-Mail:</td>
<td><input name="EMail" size="54"></td></tr>  
<tr><td>Ihr Eintrag:</td>
<td><textarea name="inhalt" cols="52" rows="8"></textarea></td></tr>  
</table>
<br/>
<input style="margin: 0px 93px 0px" type="submit" value="G&auml;stebucheintrag hinzuf&uuml;gen">  
</form>
<hr style="margin: 10px 10px 15px; color:#808080;" width="540px" size="2" align="left">  

<?php
$beitrag = file("gaestebuch.txt");  
krsort($beitrag);

foreach($beitrag as $ausgabe)
   {
   $ausgabe = stripslashes($ausgabe);
   $zerlegen = explode("|", $ausgabe);  
    /* Das nachfolgende Echo soll um 10px nach Rechts verschoben sein */
   echo "  
   <table border=\"1\" cellspacing=\"0\" cellpadding=\"5\" bordercolorlight=\"black\" bordercolordark=\"black\" width=\"540px\">  
   <tr><td>Von <a href=\"mailto:$zerlegen\">$zerlegen[1]</a> am $zerlegen[2]</td></tr>  

   <tr><td>$zerlegen[3]</td></tr>
   </table>
<br>";  
  / * Das letzte Echo soll um 10px nach Rechts verschoben sein */
   }
?>
...
</body>
</html>
Hier das Resultat Online: http://julian-schmidt.xprofan.com/gaestebuch.php
Hier habe ich das Script her: http://www.php-einfach.de/tuts_php_gb.php

Wenn ich das durch Kommentare gekennzeichnete "Echo" durch von mir bekannte HTML und CSS Befehle ersetze und auf meine Homepage hochlade gibt es mir nur Fehlermeldungen aus!

Ich nannte vorhin das ein Bug im dem Script vorhanden sei. Die ForEach Schleife wird einmal zu oft ausgeführt. Folglich wird eine Tabelle zu viele erstellt, welche ohne große Verwunderung leer ist. Wie kann man das Vorbeugen?

Was kann man Allgemein für den Spam-Schutz tun? Eine Capache fände ich viel zu aufwändig!

LG

Julian57

P.S.: Jetzt wäre eine Themen-Titel Änderung in Betracht zu ziehen ;D
Arano
Arano 18.10.2011 um 09:26:05 Uhr
Goto Top
Moin moin

Ich weiß wie man Margin im Zusammenhang von HTML und CSS benutzt.
Hm... dan frage ich mich warum du
  1. Einmal einen HTML-Margin-Attribut verwendest das nicht einmal existiert und
  2. Du es nicht einsetzt !?

Ich habe es gerade selber getestet, mit dem Quelltext deiner Seite, es funktioniert !
Wie machst du das also ?
Irgendetwas muss da ja anders sein, so das du es noch als falsch ansiehst ...oder es das sogar ist....


Der zusätzliche leere Gästebucheintrag wird durch eine Leerzeile in der "gaestebuch.txt" erzeugt, vermutlich eine am Anfang der Datei.
könnte auch Ende der Datei sein aber ich tippe eher auf den Dateianfang
Gespeichert wird ja folgender Maßen:
<?php
$eintrag="$email|$user|$datum|$inhalt";  
fwrite($datei, "\n".$eintrag);  
?>
In der zweiten Zeile wird zusätzlich zu den Daten noch eine Zeilenumbruch __am Anfang der Daten__ in die Datei gespeichert. Der soll die einzelnen Beiträge immer voneinander in eine separate Zeile trennen. Das ist soweit auch richtig ABER was wenn die Datei LEER ist ? Dann wird trotzdem erst der Zeilenumbruch gespeichert, dabei wird die Leerzeile erzeugt, und dann die neuen Daten.


Wenn ich das durch Kommentare gekennzeichnete "Echo" durch von mir bekannte HTML und CSS Befehle ersetze und auf meine Homepage hochlade gibt es mir nur Fehlermeldungen aus!
Diese Information ist so in der Form für uns nutzlos !
Was hast du gemacht und wie lauten die Fehlermeldungen, ohne dieses Informationen kann man sonst nur in die Glaskugel schauen ;)


SPAM-Schutz ?
Kein einfaches Thema !
Neben den sagen wir mal aktiven Methoden wie z.B: dem Bild- oder Text-, Rechen-CAPTCHA gibt es auch die "passiven" Methoden.
Z.B: Wird die Zeit gemessen, die der Besucher auf der "Eintragerstellen-Seite" verbracht hat bevor er das Formular abgeschickt hat.
(Hat er 0.1 Sekunde gebraucht um das Formular auszufüllen, oder mehr als ~10 Sekunden weil er alles selber Tippen musste)
Oder Falls möglich, auf welcher Seite war er vorher ?
(Ist es vom Ablauf her logisch das der nun einen Eintrag erstellt, hat er vorher überhaupt die Webseite aufgerufen ?)
(es ist auch OHNE Webseitenaufruf möglich eine Eintrag zu speichern, sofern man die Datenfelder kennt)
Versteckte Formularfelder die nicht befüllt werden dürfen.
(Der Mensch __sieht__ dieses Feld nicht und trägt auch nichts ein. Der Bot, der den Quelltext sieht, sieht das Feld und trägt etwas ein = ERROR)(Je nachdem wie "schlau" der Bot ist, erkennt er aber auch dieses)
Vertauschte / Unaussagekräftige Feld-Namen
(Der Bot denkt es sein Feld für einen Namen und trägt einen solchen ein, tatsächlich handelt es sich aber um das Feld für die E-Mail-Adresse weil aber der Name des Bots kein "@" enthält = ERROR)^^
- be creative -

Diese kann man natürlich auch schön miteinander kombinieren !
Aber nicht vergessen werden darf dabei Benutzerfreundlichkeit. Es sollte also auch abgewogen werden ob sich das für die Website überhaupt lohnt bzw. ob die Bots tatsächlich "unbedingt" in dein Gästebuch wollen oder ob das nur das kleine Ungeziefer ist, bei denen auch ein verstecktes Feld reicht, das nicht ausgefüllt werden darf - was eine kleiner dummer Bot natürlich machen würde.


EDIT:
Öhm... ich kann deine "gaestebuch.txt"-Datei auch so im Browser aufrufen und dort sehe ich:
keine Einträge vorhanden
julian57@gmx.net|Julian Schmidt|17.10.2011 um 19:44|Das ist ein Test
|Arano|18.10.2011 um 09:19|Keine Reloadsperre, dr&uuml;cke nach dem Absenden [F5]<br>Keine Reloadsperre, dr&uuml;cke nach dem Absenden [F5]
Die erste Zeile ist zwar nicht leer, aber für den angezeigten leeren Gästebucheintrag verantwortlich ;)

Evtl. wäre es auch gut zu beachten, das es sich um ein __TUTORIAL__ handelt ;)

~Arano
nxclass
nxclass 18.10.2011 um 09:29:04 Uhr
Goto Top
Wenn ich das durch Kommentare gekennzeichnete "Echo" durch von mir bekannte HTML und CSS Befehle ersetze und auf meine Homepage hochlade gibt es mir nur Fehlermeldungen aus!
evtl. hilft dir eine etwas andere schreibweise der Zeilen 34-40:
    $html = <<<__HTML__
<table border="1" cellspacing="0" cellpadding="5" bordercolorlight="black" bordercolordark="black" width="540px">   
    <tr> <td>Von <a href="mailto:%s">%s</a> am %s</td> </tr>  
    <tr> <td>%s</td> </tr>
</table>
<br>
__HTML__;
    printf( $html, $zerlegen, $zerlegen[1], $zerlegen[2], $zerlegen[3])
... so kannst du evtl. einfacher den HTML code mit CSS Styles versehen.

Die ForEach Schleife wird einmal zu oft ausgeführt.
dein Script liest die Eintäge aus einer Textdatei **zeilenweise* aus, wenn am ende der Textdatei ein Zeilenumbruch ist (oder nur 3 | Zeichen), wird eine leere Tabelle angegangen.
setze Zeile 33-41 in folgendes Konstrukt:
        if (trim($zerlegen[3]) != '') {  
/* zeile 33 -41 */
        }

Was kann man Allgemein für den Spam-Schutz tun? Eine Capache fände ich viel zu aufwändig!
... leider ist dafür etwas mehr code nötig - leider gibt es noch ganz andere Probleme im Script.

Evtl solltest Du dir lieber mal ein kostenloses CMS (Content-Management-System) zulegen.
Julian57
Julian57 18.10.2011 um 13:25:47 Uhr
Goto Top
Zitat von @Arano:

> Wenn ich das durch Kommentare gekennzeichnete "Echo" durch von mir bekannte HTML und CSS Befehle ersetze und auf
meine Homepage hochlade gibt es mir nur Fehlermeldungen aus!
Diese Information ist so in der Form für uns nutzlos !
Was hast du gemacht und wie lauten die Fehlermeldungen, ohne dieses Informationen kann man sonst nur in die Glaskugel schauen ;)

Hab das Echo einfach einfach durch
   <table style="margin-left: 10px" border="1" cellspacing="0" cellpadding="5" bordercolorlight="black" bordercolordark="black" width="540px">  
   <tr><td>Von <a href="mailto:$zerlegen">$zerlegen[1]</a> am $zerlegen[2]</td></tr>  
   <tr><td>$zerlegen[3]</td></tr>
   </table><br/>
ersetzt
Dann kamm folgende Fehlermeldung...
Parse error: syntax error, unexpected '<' in /srv/www/julian-schmidt.xprofan.com/public_html/gaestebuch.php on line 48   
Wenn ich das Echo durch....
   echo "  
   <table style="margin-left: 10px" border="1" cellspacing="0" cellpadding="5" bordercolorlight="black" bordercolordark="black" width="540px">  
   <tr><td>Von <a href="mailto:$zerlegen">$zerlegen[1]</a> am $zerlegen[2]</td></tr>  
   <tr><td>$zerlegen[3]</td></tr>
   </table><br/>
   ";  
ersetzte kommt folgende Fehlermeldung....
Parse error: syntax error, unexpected T_STRING, expecting ',' or ';' in /srv/www/julian-schmidt.xprofan.com/public_html/gaestebuch.php on line 49   
Julian57
Julian57 18.10.2011 um 13:26:18 Uhr
Goto Top
Zitat von @nxclass:
> Wenn ich das durch Kommentare gekennzeichnete "Echo" durch von mir bekannte HTML und CSS Befehle ersetze und auf
meine Homepage hochlade gibt es mir nur Fehlermeldungen aus!
evtl. hilft dir eine etwas andere schreibweise der Zeilen 34-40:
>     $html = <<<__HTML__
> <table border="1" cellspacing="0" cellpadding="5" bordercolorlight="black"  
> bordercolordark="black" width="540px">   
>     <tr> <td>Von <a href="mailto:%s">%s</a> am %s</td> </tr>  
>     <tr> <td>%s</td> </tr>
> </table>
> <br>
> __HTML__;
>     printf( $html, $zerlegen, $zerlegen[1], $zerlegen[2], $zerlegen[3])
> 
... so kannst du evtl. einfacher den HTML code mit CSS Styles versehen.

Da kommt leider allgemein eine Fehlermeldung....
Parse error: syntax error, unexpected '}' in /srv/www/julian-schmidt.xprofan.com/public_html/gaestebuch.php on line 56   

> Die ForEach Schleife wird einmal zu oft ausgeführt.
dein Script liest die Eintäge aus einer Textdatei **zeilenweise* aus, wenn am ende der Textdatei ein Zeilenumbruch ist (oder
nur 3 | Zeichen), wird eine leere Tabelle angegangen.
setze Zeile 33-41 in folgendes Konstrukt:
>         if (trim($zerlegen[3]) != '') {  
> /* zeile 33 -41 */
>         }
> 

Danke das funktioniert nun auch Fehlerfrei
> Was kann man Allgemein für den Spam-Schutz tun? Eine Capache fände ich viel zu aufwändig!
... leider ist dafür etwas mehr code nötig - leider gibt es noch ganz andere Probleme im Script.
Was den noch für Probleme im Script? Den ganzen Code hänge ich gleich noch dran....
Julian57
Julian57 18.10.2011 um 13:35:47 Uhr
Goto Top
gaestebuch.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>
<head>
...
</head>
<body>
...
<h1>Gästebuch</h1>
<form style="margin: 0px 10px 0px" action="neuerbeitrag.php" method="post">  
<table>
<tr><td>Ihr Name:</td>
<td><input name="Name" size="54"></td></tr>  
<tr><td>Ihre E-Mail:</td>
<td><input name="EMail" size="54"></td></tr>  
<tr><td>Ihr Eintrag:</td>
<td><textarea name="inhalt" cols="52" rows="8"></textarea></td></tr>  
</table>
<br/>
<input style="margin: 0px 93px 0px" type="submit" value="G&auml;stebucheintrag hinzuf&uuml;gen">  
</form>
<hr style="margin: 10px 10px 15px; color:#808080;" width="540px" size="2" align="left">  

<p><?php
$beitrag = file("gaestebuch.txt");  
krsort($beitrag);
if (empty($beitrag)) {
    echo "<p>keine Eintr&auml;ge vorhanden!</p><br />";  
}
foreach($beitrag as $ausgabe)
   {
   $ausgabe = stripslashes($ausgabe);
   $zerlegen = explode("|", $ausgabe);  
   if (trim($zerlegen[3]) != '') {  
   echo "<table style=\"margin-left: 10px\" border=\"1\" cellspacing=\"0\" cellpadding=\"5\" bordercolorlight=\"black\" bordercolordark=\"black\" width=\"540px\">  
   <tr><td>Von <a href=\"mailto:$zerlegen\">$zerlegen[1]</a> am $zerlegen[2]</td></tr>  
   <tr><td>$zerlegen[3]</td></tr>
   </table><br/>";  
   }
   }
?>
</p>
...
</body>
</html>

neuerbeitrag.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>
<head>
...
</head>
<body>
...
<h1>Gästebuch</h1>
<p><?php
$user = $_POST["Name"];  
$user = htmlentities($user);

$inhalt = $_POST["inhalt"];  
$inhalt = htmlentities($inhalt);
$inhalt = str_replace("\n", "<br>", $inhalt);  

$email = $_POST["EMail"];  
$email = htmlentities($email);

if (empty($user)) {
    $fehler .= "<li>ihr Name fehlt</li>" ;  
}
if (empty($email)) {
   $fehler .= "<li>ihre Mailadresse fehlt</li>" ;  
}
if (empty($inhalt)) {
   $fehler .= "<li>keine Nachricht eingetragen</li>" ;  
}

if ($inhalt == "" or $user == "" or $email == "")  
   {
   echo "Ihr Eintrag wurde nicht gespeichert, weil...";  
   echo "<ul>$fehler</ul>" ;  
   }
else
   {
   $datum= date("d.m.Y")." um ".date("H:i");  

   $eintrag="$email|$user|$datum|$inhalt";  

   $datei = fopen("gaestebuch.txt", "a");  
   fwrite($datei, "\n".$eintrag);  
   fclose($datei);

   echo "Ihr Eintrag wurde erfolgreich gespeichert";  
   }
?></p>
<a style="margin-left: 10px" href="gaestebuch.php">Zurück zum Gästebuch</a>  
<br />
...
</body>
</html>
Arano
Arano 18.10.2011 um 13:51:07 Uhr
Goto Top
HAHAHA

*g* nein, du kannst ja auch nicht das HTMl einfach so in eine PHP-Datei ballern !
Schau, die PHP-Datei wird doch von dem PHP-Interpreter "abgearbeitet" und wenn der "Befehle" oder Zeichen findet die er nicht kennt oder die an dieser Stelle keine Sinn ergeben, dann meckert er: Syntaxerror.

Das mit dem "echo" war da schon der bessere Weg allerdings hast du das "echo" scheinbar noch nicht ganz verstanden !
In diesem Fall gibt "echo" alles vom ersten Anführungszeichen (") bis zum nächstem Anführungszeichen (") aus. Danach versucht der PHP-Interpreter wieder einen PHP-Befehl zu finden, finde aber irgend welche komischen Zeichen und meckert wieder herrum.
Darum waren in dem Original die Anführungszeichen auch mit einem Backslash (\) "escapet" (oder maskiert) somit sucht das "echo" also weiter nach dem nächstem Anführungszeichen. Ausgeben wird es ein Escaptest Anführungszeichen (\") aber als ein normales (") womit das ausgegebene HTML wieder valide ist.


Hast du einmal in die "gaestebuch.txt" Datei geschaut ?
Wie gesagt, der erste Eintrag der nicht vollständig ist und auch nicht der Syntax mit den pipes (|) als Trennzeichen entspricht ist für darstellen des LeerenEintrages verantwortlich, DAS MUSST DU BEHEBEN !
anschließend ist auch die modifikation mit der IF-Bedingung um die Zeilen 33-41 überflüssig !


Und wie schon einmal erwähnt, das ist ein TUTORIAL, keine fertige "Software"


~Arano
Julian57
Julian57 18.10.2011 um 14:28:01 Uhr
Goto Top
Zitat von @Arano:
*g* nein, du kannst ja auch nicht das HTMl einfach so in eine PHP-Datei ballern !
Schau, die PHP-Datei wird doch von dem PHP-Interpreter "abgearbeitet" und wenn der "Befehle" oder Zeichen
findet die er nicht kennt oder die an dieser Stelle keine Sinn ergeben, dann meckert er: Syntaxerror.

Das mit dem "echo" war da schon der bessere Weg allerdings hast du das "echo" scheinbar noch nicht ganz
verstanden !
In diesem Fall gibt "echo" alles vom ersten Anführungszeichen (") bis zum nächstem Anführungszeichen
(") aus. Danach versucht der PHP-Interpreter wieder einen PHP-Befehl zu finden, finde aber irgend welche komischen Zeichen
und meckert wieder herrum.
Darum waren in dem Original die Anführungszeichen auch mit einem Backslash (\) "escapet" (oder maskiert) somit
sucht das "echo" also weiter nach dem nächstem Anführungszeichen. Ausgeben wird es ein Escaptest
Anführungszeichen (\") aber als ein normales (") womit das ausgegebene HTML wieder valide ist.

Ok danke funktioniert nun super!

Hast du einmal in die "gaestebuch.txt" Datei geschaut ?
Wie gesagt, der erste Eintrag der nicht vollständig ist und auch nicht der Syntax mit den pipes (|) als Trennzeichen
entspricht ist für darstellen des LeerenEintrages verantwortlich, DAS MUSST DU BEHEBEN !
anschließend ist auch die modifikation mit der IF-Bedingung um die Zeilen 33-41 überflüssig !
Hat dich schon durch NXClass und
        if (trim($zerlegen[3]) != '') {  
/* zeile 33 -41 */
        }
gelöst.
Ich vermute Trim schneidet unnütze Leerzeichen am Spring-Ende ab, ist das wirklich so?
Arano
Arano 18.10.2011 um 14:47:05 Uhr
Goto Top
Hallo

Hat dich schon durch NXClass und ... gelöst
gelöst ist das falsche Wort, "umgangen" oder "versteckt" wären da "richtiger".
Dir wird es zwar nun so angezeigt wie du es haben möchtest, ABER der FEHLER BLEIBT BESTEHEN - er wird nur... versteckt.

Das ist wie Atommüll im Garten einbuddeln und ein Blümchen drauf zustellen (Topfpflanze).
Sieht zwar hübsch aus, ist aber mehr als Falsch !


~Arano ;)
Julian57
Julian57 18.10.2011 um 22:37:57 Uhr
Goto Top
Ich habe Allgemein gerade versucht eine Art Adminbereich für das Gästebuch zu schreiben: http://julian-schmidt.xprofan.com/gb_admin.php
Diesen wollte ich dann später Serverseitig mit einem Passwort versehen.
Irgendwie funktioniert weder das Einlesen, noch das Speichern?
Warum? Dateirechte auf dem Server sind richtig gesetzt! Gästebuch funktioniert ja auch auf der Datei.

Hier erstmal der Quelltext:
gb_admin.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>
<head>
....
</head>
<body style="background: #e6d7be">  
<h1  style="margin-left: 0.5%;">Gästebuch-Adminbereich</h1>  
<?php
$beitrag = file("gaestebuch.txt");  
echo"<form  action=\"gb_save.php\" method=\"post\">  
<textarea style=\"margin-left: 1%; width: 98%; height: 400px;\" name=\"Datei\" wrap=\"off\">  
$beitrag
</textarea>
<br/><br/>
<input style=\"margin-left: 1%;\" type=\"submit\" name=\"Speichern\" value=\"Datei speichern\">  
</form>";  
?>
</body>
</html>
gb_save.php
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">  
<html>
<head>
...
</head>
<body style="background: #e6d7be;">  
<h1 style="margin-left: 0.5%;">Gästebuch-Adminbereich</h1>  
<?php
$file = $_POST["Datei"];  
$datei = fopen("gaestebuch.txt", "a");  
fwrite($datei,$file);
fclose($datei);
?>
<p  style="margin-left: 1%; font-size: 1.2em">Erfolgreich abgespeichert</p>  
<p  style="margin-left: 1%; font-size: 1.2em"><a href="gb_admin.php">Zurück zum Adminbereich</a> | <a href="gaestebuch.php">Zum G&auml;stebuch</a></p>  
</body>
</html>

Nachtrag: Der Text wird doch gespeichert, nur angehängt. Was muss man ändern?
Arano
Arano 18.10.2011 um 22:55:43 Uhr
Goto Top
Hi,

Schau dir mal den zweiten Parameter von fopen() an: PHP-Manual - fopen()
Tip: Schau dir auch die Englischen Seiten an, die sind 1. Vollständiger (keine Übersetzungsfehler) und 2. besser Strukturiert ;)
http://de2.php.net/manual/en/function.fopen.php


~Arano
Julian57
Julian57 18.10.2011 um 23:09:51 Uhr
Goto Top
Aso ok, dann brauch ich also den Modus "w".
Warum wird die Datei nicht eingelesen?
Arano
Arano 18.10.2011 um 23:28:18 Uhr
Goto Top
Wurde sie doch eben noch !?
Hast du noch etwas geändert ?
Gab es eine Fehlermeldung ?
- Wenn nein, dann setzt mal stell mal die Fehlerausgabe an und hoch.
in der php.ini suchen und ändern (backup nicht vergessen !!)
display_errors = On
error_reporting = E_ALL & E_WARNING
Fehlermeldung Posten.
Julian57
Julian57 18.10.2011 um 23:36:19 Uhr
Goto Top
Ich meinte eigentlich das Einlesen in das Multiedit/Textarea in gb_admin.php
Julian57
Julian57 20.10.2011 um 13:46:22 Uhr
Goto Top
Schade das das Thema augenscheinlich still steht.
Das einlesen in die Textarea in http://julian-schmidt.xprofan.com/gb_admin.php habe ich leider immer noch nicht hingekommen.

Weiterhin ist mir aufgefallen das man einfach per Aktualisierenn den Post erneut Eintrage kann, was Spamen sehr einfach macht.
Kann man das zuverlässig verhindern, Reloadsperre o.ä.? Evtl. gleich einen Code-Ansatz posten!?
Hier nochmal der Link zum GB...http://julian-schmidt.xprofan.com/gaestebuch.php
nxclass
nxclass 20.10.2011 um 15:49:51 Uhr
Goto Top
Schade das das Thema augenscheinlich still steht.
... leider handelt es sich nicht mehr um ein Thema - das ist schon ein ganzes Projekt. Ich glaube dafür ist dieses Forum auch nicht gedacht.

Entweder Du wendest dich direkt an die Quelle deines Codes oder Du musst zu jedem Problem ein separaten Beitrag schreiben.

EDIT: Ich empfehle Dir dringend dich entweder mit einem PHP Framework (wenn Du PHP, SQL und HTML, CSS, JS lernen willst) oder einem CMS auseinander zu setzen.
Julian57
Julian57 20.10.2011 um 16:07:03 Uhr
Goto Top
Ich weiß das ich das Thema ein wenig mit Fragen überstrapaziere. Und das es alles nicht mehr unter dem Momentanen Titel fällt.
Diesen kann, werde ich vor dem Schließen noch ändern.
Aber was bringt es wenn ich jede Frage in ein einzelnes Thema packe? So verliert man wenigstens nicht den Zusammenhang und ich nicht den Überblick.

Mir ein CMS zuzulegen hatte ich bisher noch nie angedacht. Bisher habe ich meine Seite und besonders die Inhalte alle per Hand zusammen getippt. Das funktioniert auch Prima, solang es bei HTML und CSS bleibt.
Was ist ein PHP-Framework?
Arano
Arano 20.10.2011, aktualisiert am 18.10.2012 um 18:48:50 Uhr
Goto Top
Tag,

aber welche __aussagekräftige__ Überschrift (eine) willst du denn für die vielen Themen die hier dann behandelt werden verwenden ?
Außerdem haben wir ja jetzt schon die Problematik, das hier mehrere Themen/Probleme gleichzeitig "herumschwirren" (Spam, Reload, leere Einträge, schreibt nicht in Datei, liest nicht aus Datei) was soll denn da noch alles kommen !? Und dann alles unter einem __aussagekräftigem__Titel zusammenfassen - unmöglich !

Schade das das Thema augenscheinlich still steht.
Öhm... an mir __sollte__ es bislang nicht liegen !
Ich hänge sozusagen noch bei dem "Dateieinleseproblem" (während du scheinbar schon wieder bei der fehlenden Reload-Sperre bist!?)
Ich hatte die diesbezüglich ein paar Fragen gestellt, denn auch wir können ohne Informationen keine Hilfe anbieten unteranderem gab es darum von mir auch keine weitere Antwort ;)
Also, die Datei gaestebuch.txt wurde vorher doch auch schon ausgelesen, also muss doch irgend etwas verändert worden sein so das es nun nicht mehr funktioniert ! Da in deinem Tutorial leider kaum wert auf Fehlerbehandlung gelegt wurde (Was das auch nur zu einem gaaanz einfachen Tutorial macht) wissen wir also nicht einmal ob es nun Probleme beim lesen der Datei gab (z.B. fehlende Rechte), oder ob der Fehler irgendwo danach besteht (z.B. vielleicht hat du ja versehentlich das "echo" gelöscht)
Und du selbst hast ja auch keine genaueren Angaben gemacht.

Also sieh dir bitte meinen Fragen vom 18.10.2011, 23:28:18 Uhr noch einmal an und beantworte sie bitte auch.

Sollte es dennoch so sein, das ich das vermeintliche Problem missverstanden habe, dann erkläre es doch bitte noch einmal genauer.


~Arano
Julian57
Julian57 20.10.2011 um 17:11:20 Uhr
Goto Top
Ich dachte das wäre nachdem ich es 2x schon gesagt hatte inzwischen verstanden. Nunja nun etwas ausführlicher.
Das einlesen in das Array allgemein im Gästebuch funktioniert! Dort sind auch keinerlei Problem vorhanden.
Es ging viel mehr um den Adminbereich wo er den komplette Inhalt einfach nicht in das Textarea einlesen will. Dabei handelt sich wieder um die Datei Gaestebuch.txt.
Vermutlich verwende ich einfach den falschen Befehl, oder diesen nicht richtig. Fehlermeldungen werden keine Ausgegeben. Die Einstellungen in php.ini sind allgemein so wie oben von dir beschrieben. In der Textarea steht dann immer Array, ka wo er das her nimmt ;O
Hier nochmals der Quelltext
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">   
<html> 
<head> 
.... 
</head> 
<body style="background: #e6d7be">   
<h1  style="margin-left: 0.5%;">Gästebuch-Adminbereich</h1>   
<?php 
$beitrag = file("gaestebuch.txt");   
echo"<form  action=\"gb_save.php\" method=\"post\">   
<textarea style=\"margin-left: 1%; width: 98%; height: 400px;\" name=\"Datei\" wrap=\"off\">   
$beitrag 
</textarea> 
<br/><br/> 
<input style=\"margin-left: 1%;\" type=\"submit\" name=\"Speichern\" value=\"Datei speichern\">   
</form>";   
?> 
</body> 
</html>
Arano
Arano 20.10.2011 um 18:26:16 Uhr
Goto Top
HAHA HAHA :D

siehe da, ein Missverständnis - von beiden *g*

Okay, ich habe dich tatsächlich falsch verstanden, dachte wegen dem Wort "einlesen" immer an das einlesen aus der Datei. Auf die Idee, etwas in eine Textarea "einzulesen", wäre ich ja nie mehr gekommen...
Dafür hätte ich eher den Begriff "ausgeben" verwendet: Etwas in einer Textarea ausgeben.

Und das du __dieses mal__ erwähnst das IN der Teaxarea "nur" Array stünde bringt mich auch gleich auf die Lösung !
Bei so etwas am Beste die funktionsweise einer Funktion im Manual nachlesen.
PHP-Manual - file()

Also, file() liest den Inhalt einer Datei Zeilenweise IN EIN ARRAY ein.
Für jede Zeile in der Datei wird also ein "Array-Element" erstellt - ergo $beitrag IST ein Array.
Quakenet PHP-Tutorial - Array

Jetzt hast du die Wahl !
  • Entweder du bereitest die Daten so auf, das du sie einfach, so wie jetzt, ausgeben kannst,
  • du baust dir eine Schleife (while, for oder foreach) und gibst jeden Eintrag einzeln aus (alle in eine Textarea oder jeder in eine eigene) oder
  • du änderst wie Art und Weise wie die Datei eingelesen wird (fopen, file_get_contents).

In diesem Fall, wäre wohl die "goldene Mitte" am goldisten, denn für die Schleifen hast du ja schon ein entsprechendes Beispiel bei der Anzeige der einzelnen Beiträge.


~Arano
Julian57
Julian57 20.10.2011 um 18:47:54 Uhr
Goto Top
Ok, danke. Mit dem Befehl file_get_contents hats dann funktioniert.
Wie siehts mir der Reloadsperre aus?
Arano
Arano 20.10.2011 um 19:46:26 Uhr
Goto Top
Schön soweit !

Und das ist noch ein Grund warum man nicht alles in ein Thema quetschen sollte !

Denn auch hier gibt es wieder viele verschiedene Ansatzpunkte.
  • Die letzten beiden Beiträge miteinander vergleichen
  • Die IP-Adresse Temporär speichern und und für 1 Minute blockieren (Datenschutz)
  • Ein Cookie platzieren
  • Sessions
  • Captcha die fürs speichern gelöst werden müssen (nach dem ersten speichern ist der Captcha-Code ungültig und ein zweites mal (F5) gelingt nicht mehr)
  • Header-Weiterleitung
  • ...


~Arano
Julian57
Julian57 20.10.2011 um 20:26:37 Uhr
Goto Top
Ich würde gerne den ersten Punkt umsetzten.
Dazu wüsste ich gerne wie man aus der genannten Datei die letzte Zeile ausliest. Die If-Abfrage bekomme ich schon alleine hin.

Ich werde mich zudem in nächster Zeit in Ruhe mit dem Projekt Captcha beschäftigen und wenn zunehmend Spams eingehen evtl. Einführen.
Arano
Arano 20.10.2011 um 22:20:59 Uhr
Goto Top
HAHAHA,
schon wieder muste ich laut lachen, als ich den Titel las.

Die erste Methode... war wohl eher für datenbankbasierte Gästebüchern gedacht.
Naja egal, allerdings wil ich dir die Lösung nun nicht einfach auf dem Silbertablet präsentieren :P
Dabei bedienen wir uns wieder des Array. Wie du den Inhalt der Datei in das Array bekommst weiß du mitlerweile. Jetzt könnten wir, wie beim Ausgeben der Einträge, das Array mit ksort() sortieren und dann nur den ersten Eintrag ausgeben. Oder wir holen uns gleich das letzte Element des Arrays: end() ist der Name der gesuchten Funktion, in PHP-Manual selbstverständlich.
Allerdings ist zu bedenken, das dafür die komplette Datei eingelesen werden muss !
Je größer die Datei, deto höher der Speicherverbrauch.


-Arano
Julian57
Julian57 20.10.2011 um 23:12:29 Uhr
Goto Top
Ok hier mein Ansatz
...
$eintrag="$email|$user|$datum|$inhalt";  
...
$beitrag = file("gaestebuch.txt");  
krsort($beitrag);
if ($beitrag[1] == $eintrag) {
   $fehler .= "<li>Eintrag schon vorhanden</li>" ;  
}
...
Will noch nicht so ganz!? Was mache ich falsch? Ist das erste Element eines Array in PHP 1 oder 0?

Ein Kleinigkeit haben wir, ich übersehen, es wird auch die Uhrzeit, Datum in die Datei geschrieben. Diese muss bei der Abfrage außenvor gelassen werden.
Die Strings beide mit Explode neu zusammensetzen?
Julian57
Julian57 20.10.2011 um 23:36:50 Uhr
Goto Top
Habs nun mittels Fehlerausgabe hinbekommen...
...
$eintrag="$email|$user|$inhalt";  
...
$beitrag = file("gaestebuch.txt");  
$zerlegen = explode("|", end($beitrag));  
$lastbeitrag = $zerlegen.'|'.$zerlegen[1].'|'.$zerlegen[3];  
if ($lastbeitrag == $eintrag)
{
   $fehler .= "<li>Eintrag schon vorhanden</li>" ;  
}
...
Die Reloadsperre funktioniert nun super, solange nicht zufällig jemand vor dem Aktualisieren einen Beitrag absendet. ;O
Arano
Arano 20.10.2011 um 23:37:41 Uhr
Goto Top
Das ist schon einmal etwas !

Ja, da vermutest du schon einmal richtig, bei einem Array fängt man bei "0" an, also ist der erste Eintrag über den Index "0" zu erreichen.
Schau dir mal die beiden Funktionen print_r() und var_dump() an.

Du bist auf dem richtigem Weg, allerdings solltest du noch einmal ganz scharf Überlegen was alles in der Variable $eintrag bzw. einer Zeile der Datei steht ! Schau dir dazu am besten noch einmal an was file() genau macht.


~Arano


Edit
Tja, es führen halt viele Wege nach Rom.
Eigentlich wollte ich ja auf das "Zeilenumbruchzeichen" hinaus, wo das nun beim explode() bleibt muss ich selber mal gucken - morgen.
Aber wenn du es eh schon zerlegst, willst du für deinen Vergleich wirklich auf die Kombination "Email-User-Inhalt" setzten oder lieber einfach nur auf "Inhalt" ;)

~Arano

PS: Was willst du mit meiner E-Mail-Adresse ? Und warum gibst du sie jedem anderem ? (auch Bots, Crawler,Spiders,..)
Julian57
Julian57 20.10.2011 um 23:48:00 Uhr
Goto Top
Ich dachte mir je mehr Informationen das Script abfragt desto besser.
Ich meine Doppelposts von zwei unabhängigen Personen können schließlich durchaus vorkommen.
Z.B. einer schreibt Hallo, und der nächste schreibt Hallo zurück :D

Wenn man nur die Nachrichten vergleicht kommt beim zweiten dann erstmal eine Fehlermeldung
Arano
Arano 20.10.2011 um 23:58:21 Uhr
Goto Top
Oh sorry,

ich meinte natürlich die Variable $beitrag.
"Beitrag", "Eintrag" ist doch beide das gleiche, der geschriebene Text ;)
Darum sollte man auch aussagekräftige Variablennamen verwenden, Namen von denen man auf den Inhalt schließen kann. z.B. $arrBeitraege und $strEintrag.


~Arano
nxclass
nxclass 21.10.2011 um 10:16:56 Uhr
Goto Top
@Arano
Respekt - soviel Geduld - ich befürchte schon fasst noch in einem Jahr von diesem Beitrag E-Mails zu bekommen

@Julian57
prüfe mal das Encoding auf deiner Webseite - oder verwende mal HTML-Entitys
Julian57
Julian57 21.10.2011 um 12:07:17 Uhr
Goto Top
@Julian57
prüfe mal das Encoding auf deiner Webseite - oder verwende mal HTML-Entitys
An welcher Stelle meiner Webseite? HTML-Entitys wird allgemein im Gästebuch für alle drei Eingabefelder verwandt!
Julian57
Julian57 21.10.2011 um 17:32:02 Uhr
Goto Top
Ich habe gerade den Adminbereich eine Verzeichnisstufe höher verschoben, und diesen dann Serverseitig mit einem Passwort geschützt.
Jetzt kommt beim Abspeichern im Adminbereich immer diese Fehlermeldung:
Warning: fopen(http://julian-schmidt.xprofan.com/gaestebuch.txt): failed to open stream: HTTP wrapper does not support writeable connections in /srv/www/julian-schmidt.xprofan.com/public_html/Admin/gb_save.php on line 27 Warning: fwrite(): supplied argument is not a valid stream resource in /srv/www/julian-schmidt.xprofan.com/public_html/Admin/gb_save.php on line 28 Warning: fclose(): supplied argument is not a valid stream resource in /srv/www/julian-schmidt.xprofan.com/public_html/Admin/gb_save.php on line 29 
Ich habe keinerlei Quelltext-Änderungen durchgeführt, bloß den Pfad zur Datei geändert.
Vorher als die Datei noch im gleichen Verzeichnis wie gaestebuch.txt lag hieß der Pfad gaestebuch.txt nun heißt er http://julian-schmidt.xprofan.com/gaestebuch.txt.
Das einlesen/ausgeben im Formular über gb_admin.php funktioniert. Beim abspeichern in gb_save.php kommt dann die Fehlermeldung.
Wenn ich den Passwortschutz entferne kommt auch die Fehlermeldung. Wenn ich den Adminbereich zurückverschiebe kommt die gleich Fehlermeldung. Wenn ich den Pfad zur gaestebuch.txt in gaestebuch.txt. ändere und den Adminbereich verschiebe funktioniert es wieder.
Die Dateirechte auf gaestebuch.txt. stehen auf 777 also auch auf Schreiben. Das Gästenbuch funktioniert ja auch super auf der Datei.
Woran liegt es? Was kann ich tuen?
...
<?php
$file = $_POST["Datei"];  
$datei = fopen("http://julian-schmidt.xprofan.com/gaestebuch.txt", "w");  
fwrite($datei,$file);
fclose($datei);
?>
...
nxclass
nxclass 21.10.2011 um 23:58:50 Uhr
Goto Top
.. denke doch mal nach: - wäre das für Google schön wenn jeder mit http://www.google.de/foobar.txt eine Datei aus den Server platzieren könnte ?

versuch mal:
if ( $datei = fopen( '/srv/www/julian-schmidt.xprofan.com/public_html/gaestebuch.txt', 'w')) {  
    // ...
    fclose($datei);
}

*auf Uhr schau* ... gute Nacht

HTTP wrapper does not support writeable connections
EDIT: wenigstens mal die Fehlermeldungen könntest du lesen - mit etwas Englisch sollte das doch klar sein.