Sessions: Textdaten Übertragungsproblem
Maxi
- php
Hallo liebe SelfHTML-Gemeinde,
dank der regen Hilfe in diesem Forum habe ich mich inzwischen ein wenig mit Sessions in PHP auseinandergesetzt und mein kleines Quizspiel komplett umgebaut. Allerdings gibt es (mal wieder) ein Problem...
Es wäre super lieb, wenn Ihr mir noch einmal helfen könntet ;)
Problem:
-----------------------
Die Punkte werden von Session zu Session korrekt übermittelt und auch auf dem Server gespeichert. Der Teilnehmername (wohl jede Art von Textvariable) geht immer wieder verloren. Ich vermute also mal, dass man bei Sessions etwas anders einrichten muss, je nachdem ob man Zahlen-Variablen (wie die Punktzahl) oder Text-Variablen (wie Namen) speichert.
Aufbau meines Scripts:
------------------------
Ich habe ein PHP-Hauptdokument welches immer wieder aufgerufen wird und dabei wiederum immer wieder Textdateien mit den Quizfragen aufruft. Momentan übermitteln die Textdateien per hidden Formularfeld immer die nächste Seite, die dann im PHP-Dokument weiterverarbeitet wird.
Das PHP-Script ruft Seite 199.txt (Startseite mit Namenseingabe) auf, wenn keine andere Angabe vorhanden ist. Anschließend geht es mit Seite 200.txt (Frage 1) weiter. Danach geht es zu Seite 201.txt (Frage 2). Testweise folgt danach wieder Seite 200.txt (Frage 1).
Die Punktezählung und der Aufruf der Seiten erfolgt problemlos. Nur der Name wird nicht von Session zu Session übergeben :(
Meine PHP-Datei:
------------------------
<?php // Quizspiel
session_start();
session_register('Punkte');
session_register('Teilnehmer');
$Punkte = $_SESSION['Punkte'];
$Teilnehmer = $_SESSION['Teilnehmer'];
// TEST, ob Startseite notwendig
if ($seite <=0)
{
$seite = "199";
}
// TEST, ob Frage richtig war
if ($Frage == "Richtig")
{
$Punkte = $Punkte +1;
}
?>
<html>
<body>
<? echo $Teilnehmer; ?> (Punkte: <? echo $Punkte; ?>)<hr/>
<form name="QuizFormular" action="<?=$PHP_SELF."?".$SID?>" method="post">
<?php include("$seite.txt"); ?>
</form><hr/>
<?
echo "Dies ist Seite: $seite";
echo"Ihr Name ist: $Teilnehmer";
?></div>
</body>
</html>
Meine txt-Startseite (Namenseingabe):
------------------------------------------------
Bitte gebe deinen Namen ein::<br/><br/>
<input style="margin-left:20px;" type="Text" name="Teilnehmer" value="" size="50" maxlength="20" /></div>
<input type="hidden" name="seite" value="200" />
<input type="Submit" name="" value="Fertig!" />
Meine txt-Quizseite 1:
------------------------------------------------
<script type="text/javascript">
function Zack () {
document.QuizFormular.submit();
}
</script>
Was ist größer?<br/><br/></div>
<input type="radio" name="Frage" value="Richtig" onClick="Zack()"> Orange </input><br/>
<input type="radio" name="Frage" value="Falsch" onClick="Zack()"> Ei </input><br/>
<input type="hidden" name="seite" value="201" />
</div>
Meine txt-Quizseite 2:
------------------------------------------------
<script type="text/javascript">
function Zack () {
document.QuizFormular.submit();
}
</script>
Was ist größer?<br/><br/></div>
<input type="radio" name="Frage" value="Falsch" onClick="Zack()"> Ameise </input><br/>
<input type="radio" name="Frage" value="Richtig" onClick="Zack()"> Wal </input><br/>
<input type="hidden" name="seite" value="200" />
</div>
Hallo,
<?php // Quizspiel
session_start();
#»» session_register('Punkte'); nicht mehr benutzen
#»» session_register('Teilnehmer');nicht mehr benutzen
if(empty($_SESSION['Teilnehmer']))
{
header('Location http://domain.tld/anmeldeseite?meldung='.urlencode($meldung))
}
$Punkte = 0;
if (!empty($_SESSION['Punkte']))
{
$Punkte = $_SESSION['Punkte']);
}
LG
Chris
Hallo Chris,
vielen Dank für die schnelle Hilfe. Allerdings schaffe ich es nicht deine Änderungen umzusetzen.
So weiß ich nicht genau was mit
header('Location http://domain.tld/anmeldeseite?meldung='.urlencode($meldung))
gemeint ist. Als ich hier eine PHP- oder HTML-Seite angab, gab es zwar online keine Fehlermeldung mehr, doch dafür wurde ein Fehler bei
$Punkte = $_SESSION['Punkte']);
gemeldet.
Als ich die letzte runde Klammer entfernte ging das Script wieder, doch das Script merkte sich dann weder $Punkte noch $Teilnehmer. Also weder die Zahlen- noch die Textvariable.
Habe ich etwas falsch umgesetzt oder wo könnte das Problem liegen? Ich kann den Effekt von
if(empty($_SESSION['Teilnehmer']))
{
header('Location http://domain.tld/anmeldeseite?meldung='.urlencode($meldung))
}
auch nicht ganz nachvollziehen. Bedeutet dies eventuell, dass wenn kein $Teilnehmer vorhanden ist eine Fehlermeldung mit der fehlerhaften URL ausgegeben wird? Wenn ja, müsste man wohl eventuell auch die anmeldeseite auf diesen Datenzugang vorbereiten, oder?
Danke ;)
Maxi
Hallo Maxi,
vielen Dank für die schnelle Hilfe. Allerdings schaffe ich es nicht deine Änderungen umzusetzen.
Ist ja auch ein bisschen viel auf einmal.
So weiß ich nicht genau was mit
header('Location http://domain.tld/anmeldeseite?meldung='.urlencode($meldung))
gemeint ist.
Angenommen Deine Domain heißt Maxi-Play
und Deine Anmeldeseite heißt login.php
Dann würde
$meldung = "bitte erst anmelden";
header('Location http://www.maxi-play.de/login.php?meldung='.urlencode($meldung));
Zur Anmeldeseite umleiten.
Das hat zur Voraussetzung, dass vorher noch kein einziges Zeichen ausgegeben worden ist (auch keine Leerzeile), sonst hat der Server den Header bereits gesendet und kann Deinen nicht mehr hinzufügen.
Im Header einer HTTP-Response werden an den Browser (für den Normaluser unsichtbar) bestimmte Informationen und Befehle (Wünsche) übermittelt.
Wenn jetzt also $_SESSION['Teilnehmer']
ist, dann würde die Bedingung empty erfüllt sein und der Server würde den Browser bitten, doch erstmal das /login.php aufzurufen.
Im login.php müsstest Du dann mittels Affenformular den Teilnehmernamen (und ggf. auch ein Passwort) erfragen. Wenn die Angaben akzeptabel sind, lässt Du den Link zum Spiel anzeigen.
Vorher hast Du den Inhalt dem <input name="teilnehmer"> in die Session übertragen:
$_SESSION['Teilnehmer'] = trim($_POST['teilnehmer']);
und alle anderen Sessionvariablen, die Du benötigst, initialisiert.
$Punkte = $_SESSION['Punkte']);
Als ich die letzte runde Klammer entfernte ging das Script wieder,
Sorry, mein Tippfehler.
LG
Chris
Hallo @all,
empty()
- nur Leerzeichen
??
Hab gerade keinen Webserver laufen. Wie war das?
Sind Leerzeichen auch empty() ?
Ich glaub, das war falsch, oder?
Dann müsste man besser nach empty(trim($eingabe)) fragen
LG
Chris
Hallo Chris.
Sind Leerzeichen auch empty() ?
Die Funktion empty() überprüft, ob eine Variable einen Wert enthält; Leerzeichen sind auch ein Wert, weshalb empty() hier false zurück liefert.
Einen schönen Sonntag noch.
Gruß, Ashura
Hallo Ashura,
Sind Leerzeichen auch empty() ?
Die Funktion empty() überprüft, ob eine Variable einen Wert enthält; Leerzeichen sind auch ein Wert, weshalb empty() hier false zurück liefert.
Danke. Das fiel mir eben noch siedendheiß ein...
Dann sollte man sicherheitshalber immer fragen:
if(empty(trim($eingabe))
obwohl nur Leerzeichen im Name-Value-Pair (eigentlich) nicht übertragen werden sollten. Da wäre dann aber eine Lücke.
LG
Chris
Hallo Chris, Ashura und all die anderen Lieben ;)
Vielen Dank für die Hilfe! Leider schaffe ich es aber immer noch nicht das Ding zum Laufen zu bringen :(
Wenn ich das Script starte, lange ich auf der Login-Seite. Ich habe aber absolut keine Ahnung wie ich die Daten nun zum Haupt-PHP-Dokument zurückschicke... Meine anmelden.php sieht so aus (ist bestimmt total Falsch...):
anmelden.php
--------------------------
<form name="Anmeldung" action="test5.php" method="post">
<input style="text" name="Teilnehmer" value="" size="20" maxlength="20" />
<input type="Submit" name="" value="Weiter...!" />
</form>
Problem #2
-----------------------------
Leider kenne ich auch trim nicht und verstehe damit die Eingabezeile nicht ganz... Wozu ist das gut?
$_SESSION['Teilnehmer'] = trim($_POST['teilnehmer']);
Frage #3
-------------------------------
Muss ich später eigentlich für jede Textvariable wieder eine Login-Seite einrichten oder geht das nicht auch irgendwie anders? Zahlen-Variablen konnte ich ja auch per include von Dateien einlesen (wie in meinem ursprünglichen Script).
Oder verstehe ich einige grundsätzlichen Sachen nicht?
Sorry für die vielen Probleme und Fragen - aber ich gebe nicht auf bevor ich hier nicht mindestens halbwegs durchblicke.
Nochmal danke für die liebe Hilfe ;)
Hallo Maxi,
Wenn ich das Script starte, lande ich auf der Login-Seite. Ich habe aber absolut keine Ahnung wie ich die Daten nun zum Haupt-PHP-Dokument zurückschicke... Meine anmelden.php sieht so aus (ist bestimmt total Falsch...):
anmelden.php
<?php
session_start();
if(empty($_SESSION['Teilnehmer']))
{?>
<form name="Anmeldung" action="test5.php" method="post">
<input style="text" name="Teilnehmer" value="" size="20" maxlength="20" />
<input type="Submit" name="" value="Weiter...!" />
</form>
<?php
}
else
{
echo "<a href="http://www.meineWebseite.de/login.php?abmelden">logout</a>";
}
if(isset($_GET['abmelden']))
{
unset($_SESSION['Teilnehmer'); # hier wird die Session-Variable entfernt
}
if(isset($_SESSION['Teilnehmer']))
{
# hier alle Spielvariablen initialisieren und
# einen Link auf den Spielbeginn ausgeben
}
Problem #2
Leider kenne ich auch trim()
Dafür gibt es das PHP-Manual
http://de3.php.net/manual/de/function.trim.php
Muss ich später eigentlich für jede Textvariable wieder eine Login-Seite einrichten oder geht das nicht auch irgendwie anders?
Nein. natürlich nicht.
Die Variablen in der Session kannst Du durch einfache Zuweisung festlegen.
$_SESSION['aktuelle_frage'] = 222;
LG
Chris
Hallo Maxi,
anmelden.php
<?php
session_start();
if(empty(trim($_SESSION['Teilnehmer'])))
Document-Type usw...
{?>
<form name="Anmeldung" action="test5.php" method="post">
<input style="text" name="Teilnehmer" value="" size="20" maxlength="20" />
<input type="Submit" name="" value="Weiter...!" />
</form>
<?php
}
else
{
if (!empty(trim($_POST['Teilnehmer']))
{
$_SESSION['Teilnehmer'] = trim($_POST['Teilnehmer']);
echo "<a href="http://www.meineWebseite.de/anmelden.php?abmelden">logout</a>";
}
}
if(isset($_GET['abmelden']))
{
unset($_SESSION['Teilnehmer'); # hier wird die Session-Variable entfernt
}if(isset($_SESSION['Teilnehmer']))
{
# hier alle Spielvariablen initialisieren und
# einen Link auf den Spielbeginn ausgeben
}
Da fehlte noch die Speicherung des Teilnehmernamens in der Session.
LG
Chris
Hallo Chris,
noch einmal danke für die erneute Hilfe. Leider will es bei mir aber einfach nicht klappen. :(
Online gibt es direkt die Fehlermeldung:
Parse error: parse error, unexpected T_STRING, expecting T_VARIABLE or '$' in anmelden.php ... Line 5
Zeile 5 ist diese:
if(empty(trim($_SESSION['Teilnehmer'])))
Sorry für die vielen Fragen und Problemchen. Ich habe wohl die Komplexität des Quiz völlig unterschätzt. Sobald das Ding läuft steht mir noch ein netter Abend mit dme Nachlesen zu den Funktionen einiger Codeabschnitte im PHP Manual bevor ;)
anmelden.php
------------------------
<?php
session_start();
if(empty(trim($_SESSION['Teilnehmer'])))
# Document-Type usw...
{?>
<form name="Anmeldung" action="test5.php" method="post">
<input style="text" name="Teilnehmer" value="" size="20" maxlength="20" />
<input type="Submit" name="" value="Weiter...!" />
</form>
<?php
}
else
{
if (!empty(trim($_POST['Teilnehmer']))
{
$_SESSION['Teilnehmer'] = trim($_POST['Teilnehmer']);
echo "<a href="anmelden.php?abmelden">logout</a>";
}
}
if(isset($_GET['abmelden']))
{
unset($_SESSION['Teilnehmer'); # hier wird die Session-Variable entfernt
}
if(isset($_SESSION['Teilnehmer']))
{
# hier alle Spielvariablen initialisieren und
# einen Link auf den Spielbeginn ausgeben
$seite = "200";
header('Location: test5.php);
}
Hallo,
Zeile 5 ist diese:
if(empty(trim($_SESSION['Teilnehmer'])))
Das war ja auch mal wieder typisch "besser lernen durch Fehler..."
In der Session sollten nur gültige Werte drinstehen. Dafür musst Du sorgen. Wenn aber die Variable $_SESSION['Teilnehmer'] noch nicht angelegt wurde, dann darf man auch nicht mit trim() darauf zugreifen.
Wenn aber $_SESSION['Teilnehmer'] vorhanden ist, sollte die Variable mit einem gültigen Wert gefüllt sien. Gültig könnte auch '' sein.
Das kann man dann mit empty($_SESSION['Teilnehmer']) abfragen.
Für $_POST gilt entsprechendes.
@Ashura:
Nun müsste man nur noch wissen, an welcher Stelle Leerzeichen aus Eingabefeldern (aus HTTP-Name-Value-Pairs) entfernt werden. Findet das in der PHP-Shell bei Übergabe des Environments automatisch statt, oder ist ein HTTP-Request von Haus aus nicht in der Lage, in einem Name-Value-Pair Leerzeichen als Wert zu übertragen?
LG
Chris
Hallo Chris,
oh je... ich glaube nun verstehe ich gar nichts mehr. Ich sollte mir wohl wirklich erst einmal das PHP Manual zu der trim-Sache in Ruhe durchlesen. Das scheint ein wichtiges Basiswissen zu sein.
Ich habe den Code meiner ursprünglichen Vorlage ein wenig auskommentiert, so dass er wieder läuft. Die Anmeldeseite werde ich noch mal in Griff nehmen, wenn ich etwas Ahnung von der trim-Sache habe.
Noch einmal vielen lieben Dank für die viele Hilfe! Sobald ich mehr über trim weiß, werde ich sicher deine letzten Postings verstehen und dann mein Quiz abschließen können!
Für alle, die mitgelesen haben, hier der letzte funktionielle Stand des Quiz (inkl. Änderung auf einen festgelegte Namen und auskommentierter if-Schleife zur Login-Seite):
PHP-Startseite:
-----------------------------------
<?php // Quizspiel
session_start();
// if(empty($_SESSION['Teilnehmer']))
// {
// $meldung = "bitte erst anmelden";
// header('Location: anmelden.php?meldung='.urlencode($meldung));
// }
$_SESSION['Teilnehmer'] = "Maxi"; // Festlegung des Teilnehmer-Namens
// $Punkte = 0;
if (!empty($_SESSION['Punkte']))
{
$Punkte = $_SESSION['Punkte'];
}
$Punkte = $_SESSION['Punkte'];
$Teilnehmer = $_SESSION['Teilnehmer'];
// TEST, ob Startseite notwendig
if ($seite <=0)
{
$seite = "200";
}
// TEST, ob Frage richtig war
if ($Frage == "Richtig")
{
$Punkte++;
}
?>
<html>
<body>
<? echo $Teilnehmer; ?> (Punkte: <? echo $Punkte; ?>)<hr/>
<form name="QuizFormular" action="<?=$PHP_SELF."?".$SID?>" method="post">
<?php include("$seite.txt"); ?>
</form><hr/>
</div>
</body>
</html>
Frageseite 1:
-----------------------------------
<script type="text/javascript">
function Zack () {
document.QuizFormular.submit();
}
</script>
Was ist größer?<br/><br/></div>
<input type="radio" name="Frage" value="Richtig" onClick="Zack()"> Orange </input><br/>
<input type="radio" name="Frage" value="Falsch" onClick="Zack()"> Ei </input><br/>
<input type="hidden" name="seite" value="201" />
</div>
Frageseite 2:
-----------------------------------
<script type="text/javascript">
function Zack () {
document.QuizFormular.submit();
}
</script>
Was ist größer?<br/><br/></div>
<input type="radio" name="Frage" value="Falsch" onClick="Zack()"> Ameise </input><br/>
<input type="radio" name="Frage" value="Richtig" onClick="Zack()"> Wal </input><br/>
<input type="hidden" name="seite" value="200" />
</div>
Hallo Maxi,
...
if (!empty($_POST['Teilnehmer']))
{
$_SESSION['Teilnehmer'] = trim($_POST['Teilnehmer']);echo "<a href="anmelden.php?abmelden">logout</a>";
}}
if(isset($_GET['abmelden']))
{
unset($_SESSION['Teilnehmer'); # hier wird die Session-Variable entfernt
}
if(!empty($_SESSION['Teilnehmer']))
{
# hier alle Spielvariablen initialisieren und
# einen Link auf den Spielbeginn ausgeben
#$seite = "200";
$_SESSION['seite'] = 200; ## speichern in der Session!
#header('Location: test5.php);
header('Location: http://www.meineWebseite.de/test5.php);
## Nur vollständige URi's sind zulässig, auch wenn
## halbe Sachen bei manchen Browser "funktionieren"
}
Hallo Chris.
header('Location http://domain.tld/anmeldeseite?meldung='.urlencode($meldung))
Hier fehlt ein Doppelpunkt.
Einen schönen Sonntag noch.
Gruß, Ashura
Hallo Ashura,
das fehlende Semikolon (das meintest du sicher statt dem Doppelpunkt, oder?) habe ich eingefügt. Dennoch merkt sich das Script nun weder Zahl ($Punkte) noch Text ($Teilnehmer) :(
Hier das veränderte Script:
------------------------------------------
<?php // Quizspiel
session_start();
if(empty($_SESSION['Teilnehmer']))
{
header('Location http://www.meineSeite.de?meldung='.urlencode($meldung));
}
$Punkte = 0;
if (!empty($_SESSION['Punkte']))
{
$Punkte = ($_SESSION['Punkte']);
}
$Punkte = $_SESSION['Punkte'];
$Teilnehmer = $_SESSION['Teilnehmer'];
// TEST, ob Startseite notwendig
if ($seite <=0)
{
$seite = "199";
}
// TEST, ob Frage richtig war
if ($Frage == "Richtig")
{
$Punkte++;
}
?>
<html>
<body>
<? echo $Teilnehmer; ?> (Punkte: <? echo $Punkte; ?>)<hr/>
<form name="QuizFormular" action="<?=$PHP_SELF."?".$SID?>" method="post">
<?php include("$seite.txt"); ?>
</form><hr/>
</div>
</body>
</html>
Hi Maxi!
das fehlende Semikolon (das meintest du sicher statt dem Doppelpunkt, oder?) habe ich eingefügt.
Oh nein nein nein. Ashura meinte schon den Doppelpunkt. :)
MfG H☼psel
Hallo Ashura, hallo Maxi,
das fehlende Semikolon (das meintest du sicher statt dem Doppelpunkt, oder?)
if(empty($_SESSION['Teilnehmer']))
{
header('Location: http://www.meineSeite.de?meldung='.urlencode($meldung));
}
Ashura hat eine weitere Schlampigkeit von mir entdeckt...
Der Doppelpunkt hinter der Angabe "Location" fehlte.
LG
Chris