Zuerst PHP Code ausführen, dann Seite neu laden
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
anzahl
ausgabe
button
code
date
datei
dateiname
datum
eintragen
file
header
laden
mitspieler
server
speichern
spieler
text
url
zeile
zuweisung
-
Hallo.
Durch einen Klick auf einen Button soll folgender Code ausgeführt werden:
if(isset($_POST['Posten']) && isset($_POST['name2'])) { //Datum: $datum = date("d.m.Y"); $uhrzeit = date("H:i"); $name=$_POST['name2']; $name=nl2br($name); $text = "+'$name'+ \r\n"; $datei=fopen("textdateien/m_spieler.txt","a"); fputs($datei,$text); fclose($datei); } ?>
Außerdem soll die Seite, nachdem dieser Code ausgeführt wurde, neu geladen werden. Das hatte ich so vor:
header('Location:zuweisung.php'); exit;
Also das soll in den oberen Code unter fclose.
Unter XAMPP hat das auch geklappt aber auf meinem bplaced Server kommt folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /users/spielertrinken/www/zuweisung.php:60) in /users/spielertrinken/www/mitspieler_hinzufuegen.php on line 40
Ich habe gelesen, dass vor einem header Befehl keine Ausgabe stattfinden darf. Aber wie kann ich mein Ziel sonst erreichen, wenn ich vor dem Neuladen den o.g. Code ausführen will?
Freue mich über Hilfe ;)
Liebe Grüße -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
Ist leider schwierig nur mit PHP vor dem Neuladen Code auszuführen.
Meine Idde wäre es das am Anfang des Codes das ausführet was eigentlich vor dem Neuladen passieren sollte. Da dies ja aber nur beim Neuladen ausgeführt wird, setzte du eine Überprüfung ein ob die Seite neugaden wurde. Wenn das nicht der Fall ist wird der Code-Schnippsel nicht ausgeführt, sollte die Seite neugeladen werden übergibt man eine Variable das sie neugeladen wird und führt anschließend den Code aus. Verstanden?
Tipp: Man kann auch bei Lima .php Dateien hochladen und ausführen!
MfG Stephan -
Ja das verstehe ich aber ich weiß nicht wie die if Abfrage aussehen würde ;) Würde der Code denn dann auch ausgeführt, wenn man die Seite manuel aktualisiert? Das wäre nämlich doof...
Also ich erkläre mal mein Problem:
Ich habe eine Textbox, wo man eine Zeile in eine Textdatei schreiben kann. Dazu dient der bereits genannte Code. Und wenn in der Textdatei 10 Zeilen sind soll die Textbox deaktiviert werden. Die Anzahl der Zeilen prüfe ich so:
$file = file("textdateien/m_spiele.txt"); $anzahl_mitspieler = count($file); $i = $anzahl_mitspieler;
Und der Code der Textbox ist dann so:
<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 Problem ist jetzt, dass sich die Variable nicht aktualisiert, wenn man eine Zeile hinzufügt. Also kann die Textbox auch nicht bei 10 Zeilen deaktiviert werden. Die Variable aktualisiert sich erst wenn man die Seite manuel aktualisiert. Und das möchte ich halt automatisch machen, wenn man auf den Button klickt. Oder gibt es denn noch eine Variante mit Javascript?
Beitrag zuletzt geändert: 30.6.2012 9:21:18 von ultimate-bravery -
Für den Zweck ist AJAX erfunden worden. Damit kannst du den Server (dein PHP-Script) fragen was in der Variablen stehen soll...
Brauchst du auch ein Codebeispiel? -
Ja wäre gut ;) Habe noch nie mit AJAX gearbeitet ;)
-
Also gut.
Auf deiner Webseite machst du dir eine JavaScript-Funktion die die Daten vom Server abfragt:// Browserunabhängige XMLHttpRequests function createXMLHttpRequest() { if(window.XMLHttpRequest) { // code for IE7+, Firefox, Chrome, Opera, Safari return new XMLHttpRequest(); } else { // code for IE6, IE5 //return new ActiveXObject("Microsoft.XMLHTTP"); try { return new ActiveXObject('Msxml2.XMLHTTP'); } catch(e) { } try { return new ActiveXObject('Microsoft.XMLHTTP'); } catch(e) { } } alert("XMLHttpRequest not supported!"); } function getZeilenanzahl() { // XMLHttpRequest erstellen, sodass es in jedem Browser funktioniert var request = createXMLHttpRequest(); request.onreadystatechange = function() { if (request.readyState == 4 && request.status == 200) { var doc = request.responseText; if(doc.length != 0) { // setz deine Variable auf den abgefragten Wert deinevariable = doc; } } }; // Request-Typ und URL setzen request.open("GET", "/url/zur/php-datei.php", true); // Request senden (asynchron) request.send(); }
In der php-datei.php gibst du die Zeilenanzahl aus:<?php $file = file("textdateien/m_spiele.txt"); echo(count($file)); ?>
So kannst du die Zeilenanzahl vom Server abfragen ohne die Seite dabei neu zu laden...
Damit die Variable aktualisiert wird musst du auf deiner Seite nur noch die JavaScript-Funktion
aufrufen.getZeilenanzahl()
-
Hallo
sehe ich das richtig,
Du willst das der User 10 Speiler-Namen eintragen soll / kann / muss
hier noch 2 Beispiele ohne Ajax,
Jeweils mit 10 Text-Feldern, um dort Namen einzutragen
a) zuweisung1.php .... Daten nach Speichern neu laden
b) zuweisung2.php .... mit header('Location ...');
zu a) ... nach Speichern die Daten neu aus .txt Datei laden
<?php // -------------------------------------- header("Cache-Control: no-store, no-cache, must-revalidate"); header("Cache-Control: post-check=0, pre-check=0"); header("Pragma: no-cache"); // -------------------------------------- $runonfile = 'zuweisung.php'; // --- Dateiname des Aufrufs (Script) $dateiname = 'textdateien/m_spieler.txt'; // --- Dateiname der Spieler-Daten $z_umbruch = "\n"; // --- der Zeilenumbruch (in Daten) $datum = date("d.m.Y"); $uhrzeit = date("H:i"); // -------------------------------------- if (!file_exists($dateiname)) { $neue_zeilen = ''; for ($n=0; $n<10; $n++) { $neue_zeilen .='"hier Name eintragen";"'.$datum.'";"'.$uhrzeit.'"'.$z_umbruch; } file_put_contents($dateiname,$neue_zeilen); } // -------------------------------------- $old_data = array(); $handle1 = fopen($dateiname, "r"); while (($row1 = fgetcsv($handle1, 1024, ';')) !== FALSE) { $old_data[] = $row1; } fclose($handle1); // -------------------------------------- if (isset($_POST['run']) && $_POST['run'] == 'Speichern') { $neue_zeilen = ''; for ($n=0; $n<10; $n++) { $nrx = str_pad((int) ($n+1),2,'0',STR_PAD_LEFT); $keyname = 'name_'.$nrx.''; $name = $_POST[$keyname]; $name = trim(chop($name)); $name = nl2br($name); if ($name == $old_data[$n][0]) { $save_datum = $old_data[$n][1]; $save_zeit = $old_data[$n][2]; } else { $save_datum = $datum; $save_zeit = $uhrzeit; } $neue_zeilen .= '"'.$name.'";"'.$save_datum.'";"'.$save_zeit.'"'.$z_umbruch; } $datei=fopen($dateiname,"w",0666); fputs($datei,$neue_zeilen); fclose($datei); // --------------------------------------------------------------- // ------- nach Speichern die Daten neu aus .txt Datei laden ----- $old_data = array(); $handle2 = fopen($dateiname, "r"); while (($row2 = fgetcsv($handle2, 1024, ';')) !== FALSE) { $old_data[] = $row2; } fclose($handle2); } // -------------------------------------- ?> <html> <head> <title>Spielernamen</title> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"> </head> <body bgcolor="#FFFFFF" text="#000000"> <br> <br> ... hier Ausgabe vor dem Formular (Header) ... <br> <br> <form name="form1" method="post" action="<?php echo $runonfile; ?>"> <p>Bitte 10 Spieler-Namen eintragen: </p> <?php // -------------------------------------- for ($n=0; $n<10; $n++) { $nrx = str_pad((int) ($n+1),2,'0',STR_PAD_LEFT); $keyname = 'name_'.$nrx.''; echo "<br> NR: ".$nrx." --- <input type=\"text\" name=\"".$keyname."\" size=\"50\" maxlength=\"50\" value=\"".$old_data[$n][0]."\" /> <small>Last Edit: am: ".$old_data[$n][1]." um: ".$old_data[$n][2]." Uhr</small> \n"; } // -------------------------------------- ?> <br> <br> OK .... <input type="submit" name="run" value="Speichern"> </form> <br> <br> <br> ... hier Ausgabe nach dem Formular (Footer) ... <br> <br> </body> </html>
zu b) ... nach Speichern mit header Browser-Seite neu laden
Code genau wie oben .... nur anders ist:
... ... fclose($datei); // --------------------------------------------------------------- // ------- nach Speichern mit header Browser-Seite neu laden ----- header('Location: '.$runonfile.''); exit; } // -------------------------------------- ?> <html> ...
oder wie ist das sonst gemeint, mit den max. 10 Spieler-Namen ?
Beitrag zuletzt geändert: 30.6.2012 13:18:28 von rssping -
@ hackyourlife: Danke für den Code aber ich kann leider nichts damit anfangen -.- Ich glaub das wäre ein bisschen zu viel verlangt, wenn ich dich fragen würde, ob ich dir mein Code schicken kann und du deinen da einbaust oder?
@ rssping: Ne 10 Textfelder würde in meinem Fall doof sein... -.- Gibt es PHP Befehler die einfach nur die Seite neu laden? Also ohne Header?
-
wenn du das mit header('Location: .....'); machen willst,
dann wirst du es doch schaffen, die If-Bedingung und Speichern in Datei
vor einer Ausgabe zu machen, also ganz oben im Script ... ?!?
einfach vor der ersten Ausgabe den PHP-Code mit if-Bedingung
und am Ende (innerhalb dieser if-Bedingung) dann den Header-Befehl und exit;
zu Ajax
und das Beispiel von hackyourlife ist doch auch gut erklärt
Du kannst auch Deinen Code hier posten
dann können evtl. mehrere daran "arbeiten"
... mir ist immernoch nicht ganz klar was Du damit eigentlich machen willst
- User muss nicht, aber kann bis zu max. 10 Namen in Liste eintragen
- User muss alle 10 Namen in Liste eintragen
- User muss mind. 1 Name aber max. 10 Namen eintragen
Wenn Du ein "Game" machst, in der eine Mannschaft 10 Speiler hat,
warum ist dann ein Formular mit 10 Feldern doof ?
und sollte das für ein "Game" sein, dann vergiss ganz schnell Speichern in .txt
mach lieber MySQL, das ist dafür deutlich besser geeignet
-
Hi,
ultimate-bravery schrieb:
Wenn es unter xampp geklappt hat, warum sollte es bei bplaced nicht gehen? Was steht den in zuweisung.php:60 und drum herum? Evtl. ist es einfach nur eine php Notice z.B. wegen Zugriff auf die Datei oder ein Leerzeichen vor dem <?php was die Ausgabe gestartet hat?
Unter XAMPP hat das auch geklappt aber auf meinem bplaced Server kommt folgende Fehlermeldung:
Warning: Cannot modify header information - headers already sent by (output started at /users/spielertrinken/www/zuweisung.php:60) in /users/spielertrinken/www/mitspieler_hinzufuegen.php on line 40
Ich habe gelesen, dass vor einem header Befehl keine Ausgabe stattfinden darf. Aber wie kann ich mein Ziel sonst erreichen, wenn ich vor dem Neuladen den o.g. Code ausführen will?
Evlt. kannst du auch anstatt header('Location ... die andere Datei includieren?
Gruß -
Also hier ist meine Seite:
http://spielertrinken.de/
So jetzt wisst ihr auch worum es geht. Und bitte nicht meckern über meine Vorgehensweise mit den Textdateien und so ;) Ich kann es bis jetzt nur so.
Hier ist der Code, um einen Mitspieler hinzuzufügen und zu löschen:
<?php //Anzahl Mitspieler $file = file("textdateien/m_spieler$counterstand.txt"); $anzahl_mitspieler = count($file); $i = $anzahl_mitspieler; ?> <!--Spieler hinzufügen--> <center> <form method="post" action="zuweisung.php"> <fieldset style="width:340px"> <legend>Neuen Mitspieler hinzufügen:</legend> <label><input name="name2" type="text" size="50" maxlength="50" <?php if ($i >=9) {echo "disabled";}; ?> value="<?php if ($i >=9) {echo "Du hast die maximale Anzahl von 10 Spielern erreicht";}; ?>"/></label><br /> <input name="Posten" type="submit" value="Hinzufügen" <?php if ($i >=10) {echo "disabled";}; ?> /> </fieldset> </form> </center> <?php $counter = fopen("textdateien/counter.txt","r+"); $counterstand = fgets($counter, 10); if(isset($_POST['Posten']) && isset($_POST['name2'])) { //Datum: $datum = date("d.m.Y"); $uhrzeit = date("H:i"); $name=$_POST['name2']; $name=nl2br($name); $text = "+'$name'+ \r\n"; $datei=fopen("textdateien/m_spieler$counterstand.txt","a"); fputs($datei,$text); fclose($datei); // hier soll normalerweise die Seite neu geladen werden } ?> <!--LÖSCHEN--> <center> <form method="post"> Mitspieler löschen: <input type="text" name="nr" placeholder="Zeile eingeben (Bsp: 1)" /> <input type="submit" name="submit" value="X"/> </form> </center> <?php if(isset($_POST['nr'])) { $zeile = $_POST['nr'] - 1; $datei = "textdateien/m_spieler$counterstand.txt"; $zeilen = file($datei); unset($zeilen[$zeile]); $handle = fopen($datei, 'wb'); fwrite($handle, implode('', $zeilen)); fclose($handle); // hier soll normalerweise die Seite neu geladen werden } ?> <br /> Eingetragene Mitspieler:<br /> <select name="fussballer" size="11" style="width: 150px;" > <?php $datei = fopen("textdateien/m_spieler$counterstand.txt","r"); $inhalt = fread($datei, filesize ("textdateien/m_spieler$counterstand.txt")); $inhalt = explode("\n",$inhalt); $newinhalt=''; foreach($inhalt as $zeile){ $newinhalt.=$zeile."\n"; } $newinhalt = str_replace("+'","<option value='$name'>",$newinhalt); $newinhalt = str_replace("'+","</option>",$newinhalt); echo($newinhalt); fclose($datei); ?> </select> <br /><br />
Was würdet ihr jetzt vorschlagen, was ich machen soll? Danke übrigens für eure Hilfe ;) -
Hi,
sehe gerade das Problem nicht.
Warum soll die Seite überhaupt neu geladen werden? Wegen der Anzahl der Spieler?
Wie wäre es, wenn du erst die PHP Sachen abarbeitest und am Ende der Seite das HTML ausgibst?
Gruß -
Ich habe jetzt mal den Wert der Variable $i neben dem Button ausgegeben. Du wirst sehen, wenn du einen Namen hinzufügst, verändert sich der Wert nicht. Erst nach manuellen Neuladen. Und dieses Neuladen soll automatisch geschehen.
-
Hi,
bei mir ändert sich der wert wenn ich auf "hinzfügen" klicke, ohne nochmal neu zu laden.
Gruß -
Komisch... Ich habe auf jeden Fall jetzt eine Lösung gefunden, mit der es bei mir auch geht.
Am Ende meines Codes habe ich folgendes erweiter:
<?php //Anzahl Mitspieler $file2 = file("textdateien/m_spieler$counterstand.txt"); $anzahl_mitspieler2 = count($file2); $t = $anzahl_mitspieler2; ?> <?php if ($i != $t) { ?> <script type="text/javascript">javascript:location.reload()</script> <?php } ?>
Ich habe eine weitere Variable $t eingeführt, die das gleiche bezweckt, wie die erste Variable $i. Nur $t steht am Ende des Scripts, also wird diese im Gegensatz zu $i beim Klick auf den Button aktualisiert. Dann habe ich eine if abfrage gemacht, ob die beiden Variablen ungleich sind. Das sind sie ja immer. Wenn sie also ungleich sind, also immer, wird die Seite durch einen Javascript Code neu geladen. -
Hi,
na wenn du jetzt zufrieden bist.
Ich würde zwar vermuten, dass es reicht $i nach dem update der Textdatei zu ermitteln, ganz ohne Vergleich und sonstwas, aber so geht es ja scheinbar auch.
Gruß -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage