Anker in PHP

hammertibet

Grünschnabel
hallo zusammen,
kann mir bitte jemand sagen wie ich dieses Problem löse:
ich habe in einem script ein gästebuchformular ganz unten , nach dem senden, und wenn eingaben fehlen, habe ein anker auf das form gestzt. jetzt möchte ich das wenn alle eingaben rechtig sind soll der anker nach oben springen
ich hab es zum Teil so probiert: (teil des codes)

if($sent and $name and $text){$anker = "oben";}
elseif(!$sent or !$name or !$text){$anker = "unten";}
<a name="oben"></a>
<form action="<?php echo $PHP_SELF; ?>#<?php echo $anker; ?>" Method="post">
<a name="unten"></a>

leider erkennt er auch nach erfolgreichem senden nur anker "unten"

ich bin für jede hilfe sehr dankbar....bis dann
 
Zuletzt bearbeitet:
Hallo!

Mir scheint es so zu sein, dass du ein kleines Verständnis-Problem hast.
So wie ich das sehe, wird im Script abgefragt, ob das Formular bereits abgesendet worden ist.
Wenn das nicht der Fall ist, oder aber das Formular ist ungültig ($name ist false), wird "unten" als anchor angegeben.
Das Problem an der Sache ist, dass das Script erst den anchor auf "oben" setzten kann, wenn das Formular abgeschickt wurde.
Was du hingegen erreichen möchtest, ist, das der 'Fokus' (ich nenn' das jetzt mal der Einfachheit halber so) auf den anchor 'oben' geht, wenn das Formular richtig abgeschickt wurde. Das Script kann aber nicht bestimmen, wo der Fokus hingehen soll, sondern es passiert nur folgendes:
Im Formular-Attribut 'action' wird der anchor auf 'oben' gesetzt (also das steht dann einfach nur da drin) - weiter nichts.
Wenn du dir den Quelltext anschaust (und ich das Script richtig verstehe ;) ), dürftest du feststellen, dass nach erfolgreichem und richtigem Absenden des Formulars 'oben' im action-Attribut steht.
Damit aber tatsächlich zu diesem anchor gescrollt wird, müsste das Formular nun ein weiteres mal abgesendet werden, da das action-Attribut sich erst jetzt geändert hat (und auch erst jetzt ändern kann).

Somit gibt es meiner Meinung nach folgende Möglichkeiten:
1. JavaScript:
Du überprüfst das Formular mittels JavaScript (über den EventHandler 'onSubmit') und wenn alles richtig eingegeben worden ist, setzt du das action-Attribut auf 'oben' und sendest das Formular dann erst ab.

2. Weiterhin eine Lösung mittels PHP:
Da das Formular nach dem ersten absenden immer nur nach 'unten' gesendet werden kann, überprüfst du, wie du es ja bereits machst, ob das Formular richtig abgesendet wurde, wenn das der Fall ist, sendest du einen Redirect-Header an den Browser (was natürlich nur dann geht, wenn noch kein Inhalt an den Browser gesendet wurde) und leitest somit die Seite nach 'seite.php#oben' um.

Beispiel:
PHP:
if($sent && $name && $text)
{
    header("Location: http://www.ziel.de/gaestebuch.php#oben");
    exit;
}
<a name="oben"></a>
<form action="<?= $PHP_SELF ?>" Method="post">
<a name="unten"></a>

Allerdings ist mir nicht bekannt, ob das mit einem anchor und einem PHP-Redirect auch tatsächlich funktioniert.

3. Statt eines PHP-Redirects benutzt du wieder JavaScript, um zu dem Anchor zu scrollen (zum Beispiel mittels scrollTo oder ähnlichen Mechanismen).

Ich hoffe dir einigermaßen weiter geholfen zu haben.
 
Zuletzt bearbeitet:
hallo rootssw,
erstmal danke für deinen Beitrag.
Da ich seit 5 wochen ein "phpler" bin hab die ganze logik met den formularen noch nicht ganz drauf.
das mit dem action attribut habe ich auch vorher gemerkt denn ich hab immer die $anker ausgegeben um es zu verfolgen. nach dem 2 senden klappts aber ich dachte man kann es irgendwie "manipulieren"
da es ein reiner php-Script sein soll, versuche ich es mit der header-Location.

ich danke dir für deinen ausführlichen Beitrag denn es hat bei mir einige lämpchen angemacht
mfg hammertibet
 
ich hab es jetzt so versucht
if($sent && $name && $text)
{
header("Location: http://www.ziel.de/eitragen.php"); //in dem script wird in textdatei geschrieben
exit;
}
und zurück mit anchor eingabe
header("Location: http://www.ziel.de/gaestebuch.php#oben");
exit;
aber er schreibt mir in der formular seite, wo oben auch die einträge aus der textdatei aufgelistet werden
Warning: Cannot modify header information - headers already sent by (output started at /www.ziel.de/gaestebuch.php:10) in /www.ziel.de/gaestebuch.php on line 40

ich hab irgendwo gelesen daß kein ausgabe auf dem script stattfinden darf aber weiß trotzdem jemand wie ich das umgehen kann

in dieser Aufgabe darf ich kein javascript benutzen, also bitte ich um eine php lösung

ich danke euch für jede weitere hilfe
mfg hammertibet
 
Zuletzt bearbeitet:
Du hast recht, es darf keinerlei Ausgabe stattfinden! Also auch keine Leerzeichen oder ähnliches. Dafür ist es meiner Ansicht nach am besten, die Pufferung des Inhaltes zu aktivieren, wodurch vor dem Aufruf der Funktion ob_end_flush kein Inhalt an den Browser gesendet wird.

Dazu musst du ganz am Anfang (also in der ersten Zeile des ersten Scripts (falls z. B. mehrere per Include-Befehl zusammengefasst wurden) und an die erste Spalte - oder kurz gesagt, drück einfach in dem Script, das in der URL aufgerufen wird STRG+Pos1 ;) ) folgenden Schnipsel setzten:

PHP:
<?php
//das steht ganz am Anfang des Scripts
ob_start ();
?>

Dadurch wird der gesamte Inhalt, der per echo, print usw. ausgegeben wird erst zwischengespeichert und dann (wenn das Script 'fertig' ist) an den Browser gesendet.
Wenn du dann (am Ende des Scripts) den Inhalt ausgeben möchtest musst du folgenden Code verwenden:

PHP:
<?php
//das steht ganz am Ende des Scripts
ob_end_flush();
?>

Diese Funktion (ob_end_flush) beendet die Pufferung des Inhalts und sendet das, was z. B. mit echo ausgegeben wurde an den Browser.
Wenn du nun den Redirect-Header senden möchtest, muss die Pufferung beendet werden, ohne das der Inhalt an den Browser gesendet wird. Dazu dient die Funktion ob_end_clean.

Ein Beispiel:

PHP:
<?php
//Anfang des Scripts
ob_start();

if ( $sent && $name && $text )
{
    ob_end_clean ();
    header ( "Location: http://www.ziel.de/gaestebuch.php#oben" );
    exit; 
}
else
    echo 'was auch immer hier steht';


//Ende des Scripts
ob_end_flush ();
?>

Ich denke, das müsste die Funktionsweise und implementierung einigermaßen Erklären.
Bei weiteren unklarheiten zu diesem Thema ist php.net immer zu empfehlen:

http://de.php.net/manual/de/function.ob-start.php
 
Zurück