Gästebuchscript überarbeitet.
KD-one
- php
0 Christoph Schnauß0 wahsaga0 KD-one
Hi ihr alle,
Ich habe nun mal mein Gästebuchscript überarbeitet, um die lästigen 'Notices' endlich wegzubekommen.
Ist mir scheinbar auch gelungen, allerdings würde ich mich freuen, wenn ein paar von euch Cracks drüberschauen könnten, um mir vielleicht die eine oder andere syntaktische Ungereimtheit aufzuzeigen, da ich noch nicht allzu fit bin in Sachen PHP.
Das ursprüngliche Script stammte nicht von mir und war ziemlich fehlerbehaftet, abgesehen davon, dass es, wenn die Fehlermeldungen abgeschaltet waren, funktioniert hat.
Ach ja, hier die Url zum Script: http://faq.united-web.at/guestbook/gaestebuch.phps
Gruß
Kurt
grmpf ...
Ach ja, hier die Url zum Script: http://faq.united-web.at/guestbook/gaestebuch.phps
Nö, das ist nicht das Script selbst, sondern es ist das Ergebnis, wenns bereits auf dem Server herumrennt. Verwandle es mal bitte in eine downloadbare oder anschaubare Textdatei, damit man sieht, was man kritisieren soll.
Grüße aus Berlin
Christoph S.
Hallo Christoph!
Ach ja, hier die Url zum Script: http://faq.united-web.at/guestbook/gaestebuch.phps
Nö, das ist nicht das Script selbst, sondern es ist das Ergebnis, wenns bereits auf dem Server herumrennt. Verwandle es mal bitte in eine downloadbare oder anschaubare Textdatei, damit man sieht, was man kritisieren soll.
Ähm, Du hast dir die verlinkte Seite aber schon angeschaut?
Denn, ich wüßte nicht, was an einer Textdatei anders sein sollte ... (phps-Dateien sind ja meist so schön bunt, aber nichtmal das ists in diesem Fall, ich kann mir also nicht vorstellen, was Dich an der verlinkten Datei stören könnte).
MfG
Götz
Hi Christoph,
Nö, das ist nicht das Script selbst, sondern es ist das Ergebnis, wenns bereits auf dem Server herumrennt. Verwandle es mal bitte in eine downloadbare oder anschaubare Textdatei, damit man sieht, was man kritisieren soll.
Öhm ja, das _ist_ eine anschaubare Textdatei...
*.phps sagt ja imho aus, dass die Datei nicht geparst, sondern text/plain ausgeliefert wird, oder ist das bei dir nicht der Fall?
Gruß
Kurt
hi,
Öhm ja, das _ist_ eine anschaubare Textdatei...
*.phps sagt ja imho aus, dass die Datei nicht geparst, sondern text/plain ausgeliefert wird, oder ist das bei dir nicht der Fall?
doch, das ist der fall.
allerdings zeigt der blöde IE, der sich um mime types einen dreck schert, auch innerhalb einer solchen seite die formularelemente immer noch als HTML dar - man sieht also eine seite, die aus einem mix aus inut-buttons und php-code besteht - wobei letzterer auch nicht mehr anständig formatiert ist, sondern aller whitespace zu deinem blank zusammengedampft wird (wie es in _html_ halt vorgesehen ist).
also, entweder vernünftigen browser benutzen, oder im IE den _quelltext_ dieser "seite" ansehen, dann sieht's auch wie ein ordnetliches PHP-script aus ;-)
gruss,
wahsaga
Moin moin,
[...] man sieht also eine seite, die aus einem mix aus inut-buttons und php-code besteht - wobei letzterer auch nicht mehr anständig formatiert ist, sondern aller whitespace zu deinem blank zusammengedampft wird (wie es in _html_ halt vorgesehen ist).
genau dieses Verhalten zeigen mein Opera 7.20 und IE5 auch.
Als Workaround könnte man doch das ganze Script mit <pre></pre> darstellen und die spitzen Klammern durch < und > ersetzen.
Dann könnte man (im Browser) den angezeigten Bereich markieren und in die Zwischenablage kopieren.
Aus den < und > sollten afaik dann wieder < und > werden.
Gruß
Patrick
Hi Patrick,
genau dieses Verhalten zeigen mein Opera 7.20 und IE5 auch.
Opera auch? Naja, hätte mich auch gewundert, wenn Christoph mit dem IE unterwegs wäre. ;-)
Als Workaround könnte man doch das ganze Script mit <pre></pre> darstellen und die spitzen Klammern durch < und > ersetzen.
Dann könnte man (im Browser) den angezeigten Bereich markieren und in die Zwischenablage kopieren.
Aus den < und > sollten afaik dann wieder < und > werden.
Nuja, da ist es aber einfacher, das Ganze als *.txt abzuspeichern, was ich auch gemacht habe.
http://faq.united-web.at/guestbook/gaestebuch.txt
Gruß
Kurt
Moin moin,
Nuja, da ist es aber einfacher, das Ganze als *.txt abzuspeichern, was ich auch gemacht habe.
argl, du hast ja sooo Recht. Vielleicht war mir das zu einfach :-))
Gruß
Patrick
hi,
genau dieses Verhalten zeigen mein Opera 7.20 und IE5 auch.
echt?
dann stimmt wohl auf dem server irgendwas nicht, denn normalerweise sollten seiten mit der endung .phps als textdateien ausgeliefert werden.
obwohl, http://www.schroepl.net/cgi-bin/http_trace.pl?url=http%3A%2F%2Ffaq.united-web.at%2Fguestbook%2Fgaestebuch.phps&method=HEAD&version=HTTP%2F1.0 sagt mir, dass die ressource als text/plain ausgeliefert wird ... sollte also alles i.O. sein.
gruss,
wahsaga
Hi wahsaga,
allerdings zeigt der blöde IE, der sich um mime types einen dreck schert, auch innerhalb einer solchen seite die formularelemente immer noch als HTML dar - man sieht also eine seite, die aus einem mix aus inut-buttons und php-code besteht - wobei letzterer auch nicht mehr anständig formatiert ist, sondern aller whitespace zu deinem blank zusammengedampft wird (wie es in _html_ halt vorgesehen ist).
also, entweder vernünftigen browser benutzen, oder im IE den _quelltext_ dieser "seite" ansehen, dann sieht's auch wie ein ordnetliches PHP-script aus ;-)
Uups, Sch****, das wusste ich nicht. Also hier nochmal, für IE-Nutzer: http://faq.united-web.at/guestbook/gaestebuch.txt
Gruß
Kurt
hallo ;-)
also, entweder vernünftigen browser benutzen, oder im IE den _quelltext_ dieser "seite" ansehen, dann sieht's auch wie ein ordnetliches PHP-script aus ;-)
Uups, Sch****, das wusste ich nicht
Haha, Unwissen schützt vor Strafe nicht ;-)
wahsaga hat völlig recht. Ich gebe zu, daß ich mich ganz doof gestellt und genau das geantwortet habe, was ein unbedarfter IE-Benutzer antworten müßte.
Also hier nochmal, für IE-Nutzer: http://faq.united-web.at/guestbook/gaestebuch.txt
Das hilft nix. Dem IE ist es wurscht, ob eine plain-text-Datei "txt" ode "phps" oder "self" heißt. Wenn da irgendwo HTML-tags drinstehen, macht er eine HTML-Ansicht draus und stellt bei <input ...> eben einen grau unterlegten Klick-button dar.
Nichts für ungut. Ich hab dich nen bißchen aufs Glatteis geführt, weil ich ahnte, daß du solche Reaktionen noch nicht kennst - und wahsaga hat mir nen bissel die Show gestohlen und mir vermasselt, daß ich rechtzeitig "April, April" rufen und alles aufklären konnte, grmpf ... :-(
Leider ist das aber (wie so oft) gar nicht die Diskussion, die du haben wolltest, und ich bin mir nicht sicher, ob dir der restliche Thread zu deinem PHP-Problem bereits genügend Aufschlüsse und Hilfestellungen geliefert hat. Also frag bitte weiter zm Thema, wenn noch irgendwas nicht geklärt ist, und ich werde solche hinterlistigen Anmerkungen in diesem Thread hier sein lassen.
Grüße aus Berlin
Christoph S.
Hi Christoph,
also, entweder vernünftigen browser benutzen, oder im IE den _quelltext_ dieser "seite" ansehen, dann sieht's auch wie ein ordnetliches PHP-script aus ;-)
Uups, Sch****, das wusste ich nichtHaha, Unwissen schützt vor Strafe nicht ;-)
wahsaga hat völlig recht. Ich gebe zu, daß ich mich ganz doof gestellt und genau das geantwortet habe, was ein unbedarfter IE-Benutzer antworten müßte.
Dachte mir sowas. Wäre schon ungewöhnlich, wenn du mit dem IE surfen würdest. ;-)
Also hier nochmal, für IE-Nutzer: http://faq.united-web.at/guestbook/gaestebuch.txt
Das hilft nix. Dem IE ist es wurscht, ob eine plain-text-Datei "txt" ode "phps" oder "self" heißt. Wenn da irgendwo HTML-tags drinstehen, macht er eine HTML-Ansicht draus und stellt bei <input ...> eben einen grau unterlegten Klick-button dar.
Ja, hab ich auch schon gemerkt. Der Browser ist ja noch kaputter, als ich je geglaubt habe.
Nichts für ungut. Ich hab dich nen bißchen aufs Glatteis geführt, weil ich ahnte, daß du solche Reaktionen noch nicht kennst - und wahsaga hat mir nen bissel die Show gestohlen und mir vermasselt, daß ich rechtzeitig "April, April" rufen und alles aufklären konnte, grmpf ... :-(
Naja, stimmt so nicht ganz. Natürlich kenne ich solche Reaktionen, hab ich ab und an auch selbst schon gesetzt, aber das fehlende Bewusstsein in Bezug auf die Darstellungsproblematik hat verhindert, dass ich dahintergestiegen bin, worauf du abzielst. ;-)
Leider ist das aber (wie so oft) gar nicht die Diskussion, die du haben wolltest, und ich bin mir nicht sicher, ob dir der restliche Thread zu deinem PHP-Problem bereits genügend Aufschlüsse und Hilfestellungen geliefert hat. Also frag bitte weiter zm Thema, wenn noch irgendwas nicht geklärt ist, und ich werde solche hinterlistigen Anmerkungen in diesem Thread hier sein lassen.
Nun ja, ich denke, ich werde das Script einfach nur noch zu Übungszwecken optimieren und dann wegschmeissen, um ein völlig neues zu schreiben.
Oder aber ich schaffe es im Laufe der Zeit, das Script dorthin zu trimmen, wo ich es haben möchte. ;-)
Irgendwo möchte ich eine Funktion einbauen, dass das Script das einlesen nach einer bestimmten Anzahl Postings abbricht und eine neue Seite beginnt. Dazu sollte ich aber in des Textfile Marker einbauen, um zählen zu können...
Naja, noch viel Arbeit für jemanden, der noch in der PHP-Krabbelstube ist. ;-)
Gruß
Kurt
hi,
Ist mir scheinbar auch gelungen, allerdings würde ich mich freuen, wenn ein paar von euch Cracks drüberschauen könnten, um mir vielleicht die eine oder andere syntaktische Ungereimtheit aufzuzeigen, da ich noch nicht allzu fit bin in Sachen PHP.
ohne mich als crack bezeichnen zu wollen, ein paar kleine anmerkungen von mir:
zu oberst hast du das formular stehen, ausserhalb des php-bereiches, als reinen HTML-code.
dann eröffnest du den php-bereich wieder, setzt display_errors und error_reporting - und gibst dann einen weiteren HTML-abschnitt per echo aus. dieser enthält nicht eine einzige php-variable, also warum überhaupt ausgabe mit echo? das würde ich umdrehen, also die ausgabe noch oben in den html-bereich mit reinpacken, und ini_set/error_reporting danach aufrufen. ist aber eher eine strukturelle angelegenheit, vermutlich sogar "ansichtssache".
if ((isset($_POST['name']) && $_POST['name'] == "") || (isset($_POST['nachricht']) && $_POST['nachricht'] == ""))
das lässt sich eigentlich gleich mit einer anweisung erschlagen, nämlich empty(). diese liefert false, wenn die als argument übergebene variable gar nicht existent, false oder leer ist.
btw, warum prüfst du überhaupt diesen beiden felder, nur um zu schauen, ob du die bisherigen einträge ausgeben solltest?
ich würde dabei einfach nur abfragen, ob der name des submit-buttons _nicht_ übermittelt wurde.
for ($i=0; $i<2; $i++) {
sleep(1);
flush();
}
was bezweckt das?
ähnlicher fall wie oben, beim abprüfen, ob das formular abgesendet wurde:
isset($_POST['send_status']) && $_POST['send_status'] == "ok"
$_POST['send_status'] wird nur übermittelt, wenn auf den button geklickt wurde. ob dabei jetzt der wert "ok" übermittelt wurde, wäre _mir persönlich_ an dieser stelle vollkommen wurscht.
klar _könnte_ jemand das formular manipuliert und statt "ok" den wert "kuckuck" übermittelt haben - aber welche auswirkungen sollte dies auf mein script haben, so lange $_POST['send_status'] überhaupt existiert?
- $filesize = filesize("guestbook/speicher.txt");
$file = fopen("guestbook/speicher.txt","r");
$buffer = fread($file,$filesize);
echo "$buffer";
fclose($file);
dieser teil steht _fast_ gleich sowohl im if- als auch im else-zweig drin, ist also grösstenteils redundant. lediglich das echo "$buffer"; fehlt im else-zweig.
warum packst du also öffnen der datei und einlesen in $buffer nicht _vor_ die if-abfrage, und nur noch das echo $buffer in den if-zweig?
- if (!empty($_POST['url'])) {
if(substr($url, 0, 7) == "http://") {
$homepage = "<a href="$url">$url</a>";
} else {
$homepage = "<a href="http://$url">http://$url</a>";
das mache ich immer leicht anders:
zuerst ersetze ich mit str_replace "http://" durch nichts - _wenn_ es drin stand, ist es jetzt weg, wenn's nicht drin stand, ist der string so wie vorher. danach brauche ich nur noch _ein_ echo ohne jegliche abfragen, bei dem "http://" automatisch davorgesetzt wird.
$text = stripslashes($text);
das sollte nicht einfach auf verdacht gemacht werden, sondern nur dann, wenn formulareingaben auch mit slashes versehen werden. wenn dies - auf anderem webspace, oder nach einem update der php-version nämlich mal nicht mehr der fall ist, werden "normale" \ ebenfalls rausgekegelt - aus der eingabe 3/4 wird 34.
deshalb besser vorher mit get_magic_quotes_gpc() überprüfen, ob diese option überhaupt aktiviert ist.
und unten $_POST['view_guestbook'] schon wieder das einlesen der datei in $buffer - wie gesagt, redundant, pack's ganz nach vorne.
was ein wenig unangenehm auffällt, ist die fehlende fehlerbehandlung bei den dateioperationen. wenn das öffnen oder schreiben mal schief geht, wie reagierst du darauf? wenn du es gar nicht tust, werden dem nutzer dann wieder die unschönen fehlermeldungen von PHP präsentiert.
gruss,
wahsaga
Hi wahsaga,
Öhm ja, wie gesagt, das Script stammt nicht von mir, ich habe zur Zeit nur versucht, die Notices wegzubringen.
- zu oberst hast du das formular stehen, ausserhalb des php-bereiches, als reinen HTML-code.
dann eröffnest du den php-bereich wieder, setzt display_errors und error_reporting - und gibst dann einen weiteren HTML-abschnitt per echo aus. dieser enthält nicht eine einzige php-variable, also warum überhaupt ausgabe mit echo? das würde ich umdrehen, also die ausgabe noch oben in den html-bereich mit reinpacken, und ini_set/error_reporting danach aufrufen. ist aber eher eine strukturelle angelegenheit, vermutlich sogar "ansichtssache".
Nuja, standardmässig setze ich ja Error-reporting auf E_NONE. Das ist jetzt nur zum debuggen so gemacht.
- if ((isset($_POST['name']) && $_POST['name'] == "") || (isset($_POST['nachricht']) && $_POST['nachricht'] == ""))
das lässt sich eigentlich gleich mit einer anweisung erschlagen, nämlich empty(). diese liefert false, wenn die als argument übergebene variable gar nicht existent, false oder leer ist.
Uups, das wusste ich nicht. Also genügt hier
if (empty($_POST['name'] || $_POST['nachricht')
btw, warum prüfst du überhaupt diesen beiden felder, nur um zu schauen, ob du die bisherigen einträge ausgeben solltest?
ich würde dabei einfach nur abfragen, ob der name des submit-buttons _nicht_ übermittelt wurde.
Nein, diese beiden Felder sind Pflichtfelder, bei nichtausfüllen wird nachfolgende Anweisung ausgeführt.
- for ($i=0; $i<2; $i++) {
sleep(1);
flush();
}
was bezweckt das?
Dieser Teil stammt nicht von mir, aber imho sollte damit $buffer eingelesen und angezeigt werden. Im ursprünglichen Gästebuch wurden ja die bestehenden Einträge sofort angezeigt und sollten wohl mit diesen Zeilen bei einem Fehlposting wieder eingelesen und angezeigt werden.
Dieser Teil wird wahrscheinlich in weiterer Folge durch eine Fehlermeldung ersetzt werden.
- ähnlicher fall wie oben, beim abprüfen, ob das formular abgesendet wurde:
isset($_POST['send_status']) && $_POST['send_status'] == "ok"
$_POST['send_status'] wird nur übermittelt, wenn auf den button geklickt wurde. ob dabei jetzt der wert "ok" übermittelt wurde, wäre _mir persönlich_ an dieser stelle vollkommen wurscht.
klar _könnte_ jemand das formular manipuliert und statt "ok" den wert "kuckuck" übermittelt haben - aber welche auswirkungen sollte dies auf mein script haben, so lange $_POST['send_status'] überhaupt existiert?
Ja, ist eine Überlegung, die nicht von der Hand zu weisen ist.
- $filesize = filesize("guestbook/speicher.txt");
$file = fopen("guestbook/speicher.txt","r");
$buffer = fread($file,$filesize);
echo "$buffer";
fclose($file);
dieser teil steht _fast_ gleich sowohl im if- als auch im else-zweig drin, ist also grösstenteils redundant. lediglich das echo "$buffer"; fehlt im else-zweig.
warum packst du also öffnen der datei und einlesen in $buffer nicht _vor_ die if-abfrage, und nur noch das echo $buffer in den if-zweig?
- $heute = getdate();
$month = $heute['month'];
$mday = $heute['mday'];
$year = $heute['year'];
$datum = "$mday. $month $year";
verwendung von date() mit entsprechender formatierung des datums würde ich hier vorziehen.
Dieser Teil stammt ebenfalls nicht von mir, ich habe ihn nur Überarbeitet, um die, diesen Teil betreffenden; Notices wegzubekommen.
In diesem Zusammenhang gibt es sowieso noch weiter unten eine Redundanz bzw. offensichtlich nicht gebrauchte Anweisung, deshalb werde ich mir diesen Teil auch gesondert vornehmen, sobald ich mich in date() eingelesen habe.
- if (!empty($_POST['url'])) {
if(substr($url, 0, 7) == "http://") {
$homepage = "<a href="$url">$url</a>";
} else {
$homepage = "<a href="http://$url">http://$url</a>";
das mache ich immer leicht anders:
zuerst ersetze ich mit str_replace "http://" durch nichts - _wenn_ es drin stand, ist es jetzt weg, wenn's nicht drin stand, ist der string so wie vorher. danach brauche ich nur noch _ein_ echo ohne jegliche abfragen, bei dem "http://" automatisch davorgesetzt wird.
Stimmt, das würde das Script deutlich verkürzen.
- $text = stripslashes($text);
das sollte nicht einfach auf verdacht gemacht werden, sondern nur dann, wenn formulareingaben auch mit slashes versehen werden. wenn dies - auf anderem webspace, oder nach einem update der php-version nämlich mal nicht mehr der fall ist, werden "normale" \ ebenfalls rausgekegelt - aus der eingabe 3/4 wird 34.
deshalb besser vorher mit get_magic_quotes_gpc() überprüfen, ob diese option überhaupt aktiviert ist.
Stimmt. Da diese Option bei mir aktiviert ist, habe ich diesen Teil eingefügt und nicht bedacht, das es besser wäre, das Ganze mit einer Abfrage zu koppeln.
- und unten $_POST['view_guestbook'] schon wieder das einlesen der datei in $buffer - wie gesagt, redundant, pack's ganz nach vorne.
Ja, werde ich machen. ;-)
- was ein wenig unangenehm auffällt, ist die fehlende fehlerbehandlung bei den dateioperationen. wenn das öffnen oder schreiben mal schief geht, wie reagierst du darauf? wenn du es gar nicht tust, werden dem nutzer dann wieder die unschönen fehlermeldungen von PHP präsentiert.
Mit error_reporting (E_NONE) ?
Aber prinzipiell gebe ich dir recht, da sollte man wohl mit or die was machen.
*grmpf* ich hätte mich doch wohl nicht dazu hinreissen lassen sollen, das Script zu reparieren, sondern besser gleich ein neues schreiben...
Danke dir für deine Tips.
Gruß
Kurt
hi,
Uups, das wusste ich nicht. Also genügt hier
if (empty($_POST['name'] || $_POST['nachricht')
nicht ganz, musst du schon einzeln machen:
if (empty($_POST['name']) || empty($_POST['nachricht'))
- for ($i=0; $i<2; $i++) {
sleep(1);
flush();
Dieser Teil stammt nicht von mir, aber imho sollte damit $buffer eingelesen und angezeigt werden. Im ursprünglichen Gästebuch wurden ja die bestehenden Einträge sofort angezeigt und sollten wohl mit diesen Zeilen bei einem Fehlposting wieder eingelesen und angezeigt werden.
nein, das einlesen fand ja schon darüber statt.
diese sleep() bewirkt nur, dass das script für eine gewisse zeit angehalten wird - aber was das an dieser stelle bezwecken soll, ist mir unklar.
- was ein wenig unangenehm auffällt, ist die fehlende fehlerbehandlung bei den dateioperationen. wenn das öffnen oder schreiben mal schief geht, wie reagierst du darauf? wenn du es gar nicht tust, werden dem nutzer dann wieder die unschönen fehlermeldungen von PHP präsentiert.
Mit error_reporting (E_NONE) ?
na schön, dann sieht der benutzer halt keinen fehler - aber es passiert auch nichts. auch nicht ideal, oder?
Aber prinzipiell gebe ich dir recht, da sollte man wohl mit or die was machen.
jepp, so viel fehlerbehandlung sollte schon drin sein.
klar ist es unschön, dem benutzer die fehlermeldungen von PHP zu präsentieren - manchmal sogar riskant, weil er dadurch pfadnamen etc. zu gesicht bekommt, die ihn gar nichts angehen.
aber eine schöne, selbst gestaltete fehlermeldung sollte schon sein.
gruss,
wahsaga
Hi ihr alle,
Nachdem ich nun überprüft habe, dass der IE selbst *.txt-Dateien als HTML darstellt, habe ich es nun auch als Archiv hochgeladen:
http://faq.united-web.at/guestbook/gaestebuch.rar
Tststs, Sachen gibt's, die gibt's gar nicht...
Gruß
Kurt
Hi ihr alle,
Nachdem ich nun überprüft habe, dass der IE selbst *.txt-Dateien als HTML darstellt, habe ich es nun auch als Archiv hochgeladen:
http://faq.united-web.at/guestbook/gaestebuch.rar
Tststs, Sachen gibt's, die gibt's gar nicht...
Man sollte halt den Betreff auch ändern, wenn man möchte, dass wer reinschaut...
Gruß
Kurt