Variable aktualisiert sich erst nach Neuladen
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
aktion
anzahl
browser
check
code
dank
datei
file
formular
header
http
post
posten
problem
speichern
teil
textdatei
textfeld
url
zeile
-
Hallo.
Ich habe ein Formular mit einem Textfeld, wo man etwas in eine Textdatei speichern kann, und ein Textfeld wo man eine Zeile aus der Textdatei wieder löschen kann.
In dieser Reihenfolge steht das in meinem php Dokument:
1. Anzahl der Zeilen in der Textdatei wird ermittelt mit folgendem Code:
//Anzahl Mitspieler $file = file("textdateien/m_spieler.txt"); $anzahl_mitspieler = count($file); $i = $anzahl_mitspieler;
2. Textfeld für das Eintragen in die Textdatei mit folgendem Code:
<input name="name2" type="text" size="50" maxlength="50" <?php if ($i >=10) {echo "disabled";}; ?> value="<?php if ($i >=10) {echo "Du hast die maximale Anzahl von 10 Spielern erreicht";}; ?>"/>
Das heißt, dass das Textfeld deaktiviert werden soll, wenn die Anzahl der Zeilen 10 erreicht hat.
3. Textfeld zum löschen einer Zeile mit folgendem Code:
<?php if(isset($_POST['nr'])) { $zeile = $_POST['nr'] - 1; $datei = "textdateien/m_spieler.txt"; $zeilen = file($datei); unset($zeilen[$zeile]); $handle = fopen($datei, 'wb'); fwrite($handle, implode('', $zeilen)); fclose($handle); } ?>
Mein Problem ist jetzt, dass die Anzahl der Zeilen in der Textdatei also $i nicht aktualisiert wird, wenn ich eine Zeile hinzufüge oder lösche. Erst wenn ich die gesamte Seite neu lade. Ich glaube das liegt daran, dass die $i jeweils über den Textfeldern definiert wird. Wie kann ich mein Problem lösen?
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Hallo
ich denke das liegt am Browser-Cache, den kannst Du ausschalten / deaktivieren,
dann sollte es ohne Browser-Reload gehen, dass gleich "aktuelle" Werte kommen.
PHP:
header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: max-age=0, post-check=0, pre-check=0", false); header("Pragma: no-cache");
.htaccass
Header set Cache-Control "must-revalidate, no-store, no-cache, max-age=0, pre-check=0, post-check=0" Header set Pragma "no-cache"
bei PHP beachten, die header() Angaben ganz oben im Script stehen müssen,
also bevor irgend eine Ausgabe an Browser gesendet wird.
bei .htaccess wirkt der Cache-Control für alle Dateien im dem Ordner,
in dem die .htaccess Datei liegt, diese Variante würde ich empfehlen.
PS:
es gibt auch noch
header("Expires: <DATUM> GMT");
hier kann man ein Ablauf-Datum eintragen, z.B. auch in der Vergangenheit
und
header("Last-Modified: " <DATUM> GMT");
hier kann man die letzte Änderung eintragen, oft aktuelles Datum: gmdate("D, d M Y H:i:s")
aber es sollte auch ohne diese zwei Datum-Angaben funktionieren
:)
-
Danke schonmal.
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: max-age=0, post-check=0, pre-check=0", false);
header("Pragma: no-cache");
Also das soll noch vor den <head> teil oder in dem <head> teil sein?
Wo soll das .htaccass hin? Habe das noch nie benutzt... -
Hallo
wenn mit PHP, dann noch vor dem <html> oder <!DOCTYPE>
also wirklich gaaaaaaaanz oben, noch bevor irgendwas ausgegeben wird
es darf nichtmal ein Leerzeichen vorher ausgegeben werden, .... garnix .. ganz am Anfang !!!
<?php header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: max-age=0, post-check=0, pre-check=0", false); header("Pragma: no-cache"); ?> <html> <head> ... </head> ...
aber mach es lieber mit .htaccess, das gilt dann für alle Dateien,
und Du muss es nicht einzeln je Datei in PHP rein schreiben
wenn .htaccess, einfach eine neue Datei erstellen mit Dateiname: .htaccess
und dort die Zeilen einfügen
Mit einer .htaccess Datei kann man u.a. einige Server-Einstellungen "nachträglich" setzen
wie hier z.B. Cache-Control ... und wenn wir schon bei .htaccess sind,
dann mach dort doch auch gleich Einstellungen für Error_Reporting
php_flag display_errors on php_value error_reporting 30719 Header set Cache-Control "must-revalidate, no-store, no-cache, max-age=0, pre-check=0, post-check=0" Header set Pragma "no-cache"
mit einer .htaccess ist noch mehr möglich, z.B. auch Passwort-Schutz, Fehlerseiten, etc.
allgemeine Info: http://de.selfhtml.org/servercgi/server/htaccess.htm
und sonst googeln nach dem was du machen willst + htaccess,
z.B: cache-control htaccess
z.B: error_reporting htaccess
usw.
beachte:
Die Datei heisst nur ".htaccess" nicht "htaccess.txt" oder "htaccess.php"
(nur vorne der . Punkt, und hinten keine Datei-Endung dran)
Infos zum Zahlenwert für php_value error_reporting
siehe: http://www.php.net/manual/de/errorfunc.constants.php
Für Error-Level "E_ALL" (alle Fehler) ist die Zahl
32767 in PHP 5.4.x,
30719 in PHP 5.3.x,
6143 in PHP 5.2.x,
2047 für ältere Versionen
Wichtig bei error_reporting ist auch display_errors on
damit die Fehler auch angezeigt werden
Beitrag zuletzt geändert: 29.6.2012 10:57:53 von rssping -
Hallo
rssping schrieb:
ich denke das liegt am Browser-Cache, ..
Ich kann mir jetzt nicht vorstellen, dass das am Cache liegt, der Browser-Cache hat doch reingarnichts mit den Variablen in PHP zu tun, bzw. allgemein mit PHP??
ultimate-bravery schrieb:
Mein Problem ist jetzt, dass die Anzahl der Zeilen in der Textdatei also $i nicht aktualisiert wird, wenn ich eine Zeile hinzufüge oder lösche. Erst wenn ich die gesamte Seite neu lade. Ich glaube das liegt daran, dass die $i jeweils über den Textfeldern definiert wird.
Ich glaube das genannte Problem trifft es.
*Du solltest erst die Datei Auslesen, dann löshen bzw. hinzufügen (falls erfordert), dabei $i um eine hoch bzw runter zählen und dann das Textfeld mit der Überprüfung ;)
* Die ersten beiden Punkte können bei Bedarf ich getauscht werden (Auslesen / Einfügen bzw. löschen, dann aber kein $i ändern)
Fabi
-
@ rssping: Sry aber deine Varianten lösen das Problem nicht. Aber trotzdem danke ;)
@ fabi755: Wenn ich nach den Textfeldern das $i um eins erhöhe bzw verringer wirkt sich das ja nicht auf das $i über den Textfeldern aus. Aber gerade diese $i verwenden ja die Textfelder darunter... Eigentlich muss es ja auch ohne $i + 1 oder $i - 1 gehen. $i zählt ja die Zeilen in der Textdatei und eigentlich müsste das ja automatisch gehen mit dem +1 oder -1 ...
Weiß noch jemand eine Lösung? -
Also noch mal..
1. Datei auslesen
2. Zeile löschen ($i - 1) und/oder Zeile hinzufügen ($i + 1)
3. Textfeld mit Überprüfung
Sprich, du verarbeitest erst die Daten und dann stellst du weitere Funktionen zur Verfügung
Falls es immer noch nicht klappt, oder es Probleme gibt, schreib mich bitte an.
Die Lösung posten wir hier später natürlich noch (falls es Änderungen geben sollte) -
stimmt auch wieder, ... einfach gleich beim Speichern den $i Zähler bearbeiten
Du hast ja vielleicht ein Formular-Feld, das die Aktion angibt ... hinzufügen / entfernen (new/delete)
z.B. über ein hidden-Field
also je nach Aktion $i um 1 hoch oder 1 runter
if(isset($_POST['action']) && $_POST['action'] == 'new') { $i++; // --- hier Code zum hinzufügen einer Zeile } if(isset($_POST['action']) && $_POST['action'] == 'delete') { $i--; // --- hier Code zum entfernen einer Zeile } echo "<br />Neue Anzahl: ".$i."\n";
oder Du machst nach dem Speichern einen header-Redirect zur "neuen" Ausgabe
also den Browser-Reload quasi automatisch
-
rssping schrieb:
if(isset($_POST['action']) && $_POST['action'] == 'new') { $i++; // --- hier Code zum hinzufügen einer Zeile } if(isset($_POST['action']) && $_POST['action'] == 'delete') { $i--; // --- hier Code zum entfernen einer Zeile } echo "<br />Neue Anzahl: ".$i."\n";
Genau so meinte ich das.
rssping schrieb:
oder Du machst nach dem Speichern einen header-Redirect zur "neuen" Ausgabe
also den Browser-Reload quasi automatisch
Eine Weiterleitung empfinde ich hier als überflüssig, da du sicher auf der Seite bleiben möchtest.
Ich leite nach einem Formular grundsätzlich auf keine andere Seite weiter. (Und vorallem nicht auf die selbe Seite erneut?). Eine Weiterleitung wird bei mir nur nach einem Login ausgeführt (durch die Änderung der SessionWerte)
Beitrag zuletzt geändert: 29.6.2012 11:42:35 von fabi755 -
Ok danke ;)
Die Seite bei dem Klick auf den Button neu zu laden würde in meinem Fall aber auch gehen.
Also hier ist der Button, auf den man klickt, wenn man z.B. eine Zeile hinzufügen möchte:
<input name="Posten" type="submit" value="Hinzufügen"/>
Wie kann ich jetzt sagen, dass die Seite neu geladen wird, wenn man auf diesen Button klickt? -
Du weißt nicht wie du ein Formular machst aber schon den Rest? Genial! :D
<form action="seite.php" method="POST"> <!-- [b]action="seite.php"[/b] <-- Auf welche Seite das Formular beim Absenden "weitergeleitet" wird --> <input type="hidden" name="action" value="new"> <!-- Welche Aktion ausgeführt werden soll --> <input type="text" name="eingabe" value=""> <!-- Benutzer Eingabe, für Zeile oder was auch immer du vor vor hast --> <input type="submit" name="sendbutton" value="Hinzufügen"> <!-- Sendebutton (da IM FormTag sendet er an [b]action[/b] sobald er betätigt wird) --> </form>
Das ist ein kleines Formular ich hoffe du verstehst es.
Bei dem PHP-Teil kann ich dir jetzt nicht so ganz helfen, weil ich nur im Groben verstanden habe was du vor hast ;)
Schick mir einfach eine PN wenn du für den PHP-Teil noch Hilfe brauchst.
Beitrag zuletzt geändert: 29.6.2012 12:25:06 von fabi755 -
Hallo
musst Du garnicht Seiten-Reload machen, Du kannst es ja sofort "direkt" machen
if(isset($_POST['Posten']) && $_POST['Posten'] == 'Hinzufügen') { $i++; // --- hier Code zum hinzufügen einer Zeile } echo "<br />Neue Anzahl: ".$i."\n";
Hinweis: ich würde nicht "Hinzufügen" als String zum Prüfen nehmen, wegen dem ü
könnte Probleme machen, wenn Eingabe als iso-8859-1 und Verarbeitung als UTF-8
mach leiber noch ein hidden-Field mit name="action" und value = "new" oder "delete"
und prüfe das dann ab, welche Aktion gerade ausgeführt wird
aber wenn Du "Seite Neu Laden" unbedingt machen willst, gibt es 2 Möglichkeiten:
mit $go_url legst Du fest, welche Seite genau neu geladen werden soll (mit Parameter)
a) per php mit header('Location: .... ');
$go_url = 'index.php?player=1234&seite=spieler'; header("Location: ".$go_url."");
INFO: auch hier wieder header() Befehl immer vor der ersten Ausgabe im Browser ausführen
b) per html mit Meta-Tag Refresh (z.B. nach 0.2 Sekunden)
$go_url = 'index.php?player=1234&seite=spieler'; echo "<meta http-equiv=\"refresh\" content=\"0.2; url=".$go_url."\">";
INFO: manche Browser erlauben kein Meta-Refresh
aber wie gesagt, ist eigentlich quatsch die Seite neu zu laden,
denn Du kannst den $i Zähler ja auch direkt beim Speichern ändern.
Idee wäre dazu auch, diesen $i Zähler-Wert in Session speichern,
dann ist er für die Session-Laufzeit immer verfügbar
... aber das ist wieder ein anderes Thema :)
-
Danke aber habe auch ne Lösung gefunden. War mir nur nicht sicher ob das mit onclick gemacht werden musste.
Also ich habs jetzt so gemacht:
if(isset($_POST['Posten']) && isset($_POST['name2'])) { header('Location:zuweisung.php'); exit; } ?>
Also es klappt jetzt so wie ich es möchte ;) Danke für die Denkanstöße :) -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage