Seitenrefresh nach Absenden eines Formulars
Alexander Krug
- php
Hallo, allerseits!
Ich hab ein kleines Problem mit einem Formular und den dadurch aktualisierten Daten:
Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt und kann diesen mittels Klick auf einen Button ändern. Durch den Klick wird in der Datenbank einfach der Inhalt das Status-Feldes von 0 auf z.B. 1 gesetzt. So weit funktioniert auch alles. Das Problem ist, daß die Seite sich nach Klicken des Buttons nicht automatisch neu lädt und der Nutzer somit noch den alten Status angezeigt bekommt. Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird. Gibt es dafür eine einfache Möglichkeit?
Habt Nachsicht mit mir, ich bin noch PHP-Anfänger. ;-)
Vielen Dank auf jeden Fall für Eure Unterstützung!
Alex
Hi
Hallo, allerseits!
... Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen ...
Alex
Ich vermute du suchst nach header .
grüße
Ich vermute du suchst nach header .
Hi und vielen Dank für den Hinweis!
Ich hab es darüber mal versucht, aber irgendwas mach ich, scheint's, falsch. Ich krieg dauernd folgende Meldung:
Warning: Cannot modify header information - headers already sent by (XXXXXXXXXXXXXXXXXX) in /xxx/xxx/xxxx/xxxx/xxxx/xxxxxxx.php on line 52
Ich hab's mit folgendem Code probiert:
$host = $_SERVER['HTTP_HOST'];
$uri = rtrim(dirname($_SERVER['PHP_SELF']), '/\');
$extra = 'seite.php';
header("Location: http://$host$uri/$extra");
Weiß irgend jemand, was daran falsch ist oder was noch fehlt?
Hallo!
Weiß irgend jemand, was daran falsch ist oder was noch fehlt?
Die header() Funktion __muss__ vor allen Ausgaben (echo, print, print_r, Fehlermeldungen, ..) stehen.
Sobald du per print/echo/was auch immer etwas an den Browser gibst werden automatisch die ensprechenden Header mitgegeben und diese lassen sich dann nicht mehr ändern.
Die header() Funktion __muss__ vor allen Ausgaben (echo, print, print_r, Fehlermeldungen, ..) stehen.
Sobald du per print/echo/was auch immer etwas an den Browser gibst werden automatisch die ensprechenden Header mitgegeben und diese lassen sich dann nicht mehr ändern.
Ich glaub, ich steh momentan irgendwie auf dem Schlauch ...
Also, ich hab die Funktion jetzt ganz nach oben gesetzt:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<?php
header("Location: http://www.blabla.de/seite.php");
Trotzdem erhalte ich dieselbe Fehlermeldung immer noch:
Warning: Cannot modify header information - headers already sent by (output started at /xxx/xxxx/xxxx/seite.php:3) in /xxx/xxxx/xxxx/seite.php on line 4
Geändert hat sich nur das "line 4". In Zeile 4 steht aber:
header("Location: http://www.blabla.de/seite.php");
Jetzt versteh ich langsam gar nichts mehr ...
Um mein Problem noch mal genauer darzulegen:
Zuerst wird in der Datenbank ausgelesen, welcher Wert unter "status" steht. Dann wird je nach Wert eine Statusanzeige ausgegeben. Das sieht z.B. so aus:
Sie sind derzeit:
<?php
if($ergebnis[status]=="0")
{
echo "nicht verfügbar.";
}
Anhand dieses Wertes wird dann auch ein Button angezeigt, mittels dessen der Benutzer den Status ändern kann.
Der Code für einen Button sieht z.B. so aus:
<?php
if($ergebnis[status]=="0")
{
?>
<form action="<?php echo $PHP_SELF; ?>" method="post">
<input type="hidden" name="flag" value="1">
<input type="submit" value="Status ändern auf: jetzt verfügbar">
<?php
if($_POST[flag]==1)
{
$sql="UPDATE $tabellenname set status=1";
$link = mysql_connect("localhost", "Benutzername", "Paßwort");
mysql_select_db("Datenbank", $link);
$result = mysql_query($sql, $link);
}
}
?>
Die Seite soll demnach neu geladen, werden sobald der Benutzer auf den Butten geklickt hat. Dadurch werden die Befehle in der zweiten If-Anweisung ausgeführt (der Wert unter "status" in der Datenbank geändert).
Wo kann ich jetzt wie dem Browser sagen, daß er nach Drücken des Buttons die Seite neu laden bzw. die Datenbank neu auslesen soll? Entschuldigt meine Verständnisschwierigkeiten ... Momentan kapier ich aber echt gar nichts mehr.
Hi,
Also, ich hab die Funktion jetzt ganz nach oben gesetzt:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<?php
header("Location: http://www.blabla.de/seite.php");
das nennst Du ganz nach oben?
freundliche Grüße
Ingo
Hi,
Also, ich hab die Funktion jetzt ganz nach oben gesetzt:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<?php
header("Location: http://www.blabla.de/seite.php");
das nennst Du ganz nach oben?freundliche Grüße
Ingo
Okay, hab's jetzt so gemacht:
<?php
header("Location: http://www.blabla.de/seite.php");
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
Dafür krieg ich jetzt diese Fehlermeldung:
Safari kann die Seite nicht öffnen.
Es traten zu viele Verbindungswiederholungen beim Öffnen von „http://www.blabla.de/seite.php“ auf. Dies könnte bei inkorrekten Weiterleitungen auftreten.
Was ist jetzt wieder falsch?
Hi,
Dafür krieg ich jetzt diese Fehlermeldung:
Safari kann die Seite nicht öffnen.
Es traten zu viele Verbindungswiederholungen beim Öffnen von „http://www.blabla.de/seite.php“ auf. Dies könnte bei inkorrekten Weiterleitungen auftreten.Was ist jetzt wieder falsch?
Du hast vermutlich auf dieselbe Seite weitergeleitet, diese dann wiederum auf dieselbe usw. Jeder Browser gibt dann irgendwann auf. Aber wie Du siehst, funktioniert die Weiterleitung jetzt.
freundliche Grüße
Ingo
Du hast vermutlich auf dieselbe Seite weitergeleitet, diese dann wiederum auf dieselbe usw. Jeder Browser gibt dann irgendwann auf. Aber wie Du siehst, funktioniert die Weiterleitung jetzt.
freundliche Grüße
Ingo
Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.
Moin!
Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.
Dein Logikfehler ist in https://forum.selfhtml.org/?t=159222&m=1035926 erklärt.
- Sven Rautenberg
echo $begrüßung;
Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt
Das heißt also, dass die Seite wechselnden Inhalt hat und mit jedem Besuch der Seite etwas anderes dastehen kann. In dem Fall ist es nicht sinnvoll, dass der Browser eine Kopie der Seite im Cache ablegt und beim erneuten Aufrufen diese verwendet.
Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird.
Bitte den Browser also, die Seite jedes Mal neu zu holen. Dazu kannst du HTTP-Header senden (Beispiel im PHP-Handbuch) und/oder im HTML-Head Meta-Elemente verwenden. Siehe Datei von Originaladresse laden und Diverse Meta-Angaben. Ein HTTP-Header hat dabei immer Vorrang vor einer gleichnamigen "meta http-equiv"-Angabe.
echo "$verabschiedung $name";
echo $begrüßung;
Ein Benutzer kriegt seinen aktuellen Status (z.B. "Dein Profil ist nicht öffentlich") angezeigt
Das heißt also, dass die Seite wechselnden Inhalt hat und mit jedem Besuch der Seite etwas anderes dastehen kann. In dem Fall ist es nicht sinnvoll, dass der Browser eine Kopie der Seite im Cache ablegt und beim erneuten Aufrufen diese verwendet.
Die Seite in diesem Fall ist paßwortgeschützt und nur für diesen einen User zugänglich. Über das Formular auf dieser Seite kann er seinen Status ändern, also ob im öffentlichen Teil der Website z.B. sein Profil angezeigt werden soll oder nicht. Die Seite hat also wechselnde Inhalte, allerdings werden die vom User immer manuell geändert.
Das heißt, ich müßte es irgendwie hinkriegen, daß mit Absenden des Formulars die gesamte Seite neu geladen bzw. zumindest die Datenbank neu ausgelesen und der neue Status angezeigt wird.
Bitte den Browser also, die Seite jedes Mal neu zu holen. Dazu kannst du HTTP-Header senden (Beispiel im PHP-Handbuch) und/oder im HTML-Head Meta-Elemente verwenden. Siehe Datei von Originaladresse laden und Diverse Meta-Angaben. Ein HTTP-Header hat dabei immer Vorrang vor einer gleichnamigen "meta http-equiv"-Angabe.
Ich hab das alles probiert, aber es klappt trotzdem nicht. Es geht ja nicht (nur) darum, daß die Inhalte der Datenbank bei jedem Seitenbesuch neu ausgelesen werden müssen und nicht aus einem Cache kommen dürfen. Es geht darum, daß die Seite automatisch nach Klicken eines Buttons neu geladen wird und dadurch die Daten in der Datenbank gelesen.
Momentan kriegt der User angezeigt: Ihr Profil ist nicht öffentlich. Er möchte es jetzt aber veröffentlichen und klickt auf den Button "Profil freigeben". Nach Klicken dieses Buttons wurde zwar in der Datenbank der entsprechende Eintrag geändert, aber der User kriegt immer noch angezeigt "Ihr Profil ist nicht öffentlich" und den Button zum Freigeben. Er soll aber den neuen Status angezeigt kriegen und den neuen Button, mit dem er es wieder sperren kann.
Eine Weiterleitung mit der header()-Funktion hat bislang nicht funktioniert bzw. hab ich's nicht hingekriegt ...
Das ganze Script sieht momentan so aus:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<?php
$tabellenname="xxxxxx";
$link = mysql_connect("localhost", "xxxxx", "xxxxxxx");
mysql_select_db("xxxxxxxx", $link);
$sql="SELECT status FROM $tabellenname";
$result = mysql_query($sql, $link);
$ergebnis=mysql_fetch_array($result);
?>
<HTML>
<HEAD>
<meta http-equiv="expires" content="0">
<TITLE> </TITLE>
</HEAD>
<BODY>
Ihr Profil ist derzeit:
<?php
if($ergebnis[status]=="0")
{
echo "nicht öffentlich.";
}
if($ergebnis[status]=="1")
{
echo "öffentlich.";
}
?>
<?php
if($ergebnis[status]=="0")
{
?>
<form action="<?php echo $PHP_SELF; ?>" method="post">
<input type="hidden" name="flag" value="1">
<input type="submit" value="Status ändern auf: öffentlich">
<?php
if($_POST[flag]==1)
{
$sql="UPDATE $tabellenname set status=1";
$link = mysql_connect("localhost", "xxxxx", "xxxxxxxxx");
mysql_select_db("xxxxxxxxxx", $link);
$result = mysql_query($sql, $link);
}
}
?>
</BODY>
</HTML>
Welche Möglichkeit(en) hab ich denn nun hier, dem Browser zu sagen, daß er mit Klick auf den Button zuerst den Wert ändern und dann sofort die Seite neu laden oder zumindest die Datenbank neu auslesen soll?
Ich wäre Euch wirklich überaus dankbar, wenn mir irgend jemand einen entscheidenden Tipp geben könnte. Bislang hat alles nicht so recht funktioniert, was ich mit der header()-Funktion probiert hab. Ich mache sicher irgendwas ganz grob falsch oder gar nicht, aber ich weiß nicht, was ...
Moin!
Ich hab das alles probiert, aber es klappt trotzdem nicht. Es geht ja nicht (nur) darum, daß die Inhalte der Datenbank bei jedem Seitenbesuch neu ausgelesen werden müssen und nicht aus einem Cache kommen dürfen. Es geht darum, daß die Seite automatisch nach Klicken eines Buttons neu geladen wird und dadurch die Daten in der Datenbank gelesen.
Die Sache ist doch klar:
Erster Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt.
Dann Buttonklick.
Zweiter Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt. Dann wird der neue Status in die Datenbank geschrieben. Was also wird die Statusanzeige anzeigen, den neuen oder den alten Zustand?
Reload.
Dritter Seitenaufruf. Die Datenbank wird gelesen und der Status angezeigt. Wird jetzt der alte oder der neue Status angezeigt?
Du hast den typischen Denkfehler gemacht. Deshalb halte dich grundsätzlich an folgende Reihenfolge: EVA. Das heißt: Eingabe, Verarbeitung, Ausgabe.
Derzeit hast du Ausgabe, Eingabe, Verarbeitung, noch mehr Ausgabe, und du hoffst, dass die spätere Verarbeitung dann noch rückwirkend Einfluß auf die schon erfolgte Ausgabe nimmt - was zeitlich unmöglich ist, denn Zeitmaschinen sind noch nicht erfunden.
Deshalb grundsätzlich: Am Skriptanfang beginnt direkt in der ersten Zeile erstmal der PHP-Block. Dann wird darin viel programmiert. Und ganz am Ende, wenn alles berechnet und aktualisiert wird, kommt der Skript- und HTML-Teil, der die Ausgabe realisiert.
- Sven Rautenberg
Irgendwo gab es, glaub ich, ein Mißverständnis: Ich will überhaupt nirgendwohin weiterleiten. Ich will, daß nach dem Absenden des Formulars bzw. Klicken des Buttons dieselbe Seite neu lädt und damit die Datenbank neu ausliest, weil sich durch den Buttonklick ja was geändert hat. Das muß doch irgendwie möglich sein.
Was ich nicht verstehe ist, wie die Seite den Status des Profils auf "öffentlich setzten kann, wenn sie nicht neu geladen wird?
Die "Aufforderung" muss ja erstmal zum Server -> Die Seite muss sich neu laden.
Ich würde das so machen (Skript nicht getestet):
<?php
$tabellenname="xxxxxx";
$link = mysql_connect("localhost", "xxxxx", "xxxxxxx");
mysql_select_db("xxxxxxxx", $link);
if($_POST['flag'] == 1) {
$sql = "UPDATE $tabellenname set status = 1";
$link = mysql_connect("localhost", "xxxxx", "xxxxxxxxx");
mysql_select_db("xxxxxxxxxx", $link);
$result = mysql_query($sql, $link);
}
$sql="SELECT status FROM $tabellenname";
$result = mysql_query($sql, $link);
$ergebnis=mysql_fetch_array($result);
?>
<HTML>
<HEAD>
<TITLE> </TITLE>
</HEAD>
<BODY>
Ihr Profil ist derzeit:
<?php
if($ergebnis[status]=="0") {
echo "nicht öffentlich.";
}
if($ergebnis[status]=="1") {
echo "öffentlich.";
}
?>
<?php
if($ergebnis[status]=="0") {
?>
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">
<input type="hidden" name="flag" value="1">
<input type="submit" value="Status ändern auf: öffentlich">
</form>
<?php
}
?>
</BODY>
</HTML>