• Apfeltalk ändert einen Teil seiner Allgemeinen Geschäftsbedingungen (AGB), das Löschen von Useraccounts betreffend.
    Näheres könnt Ihr hier nachlesen: AGB-Änderung
  • Was gibt es Schöneres als den Mai draußen in der Natur mit allen Sinnen zu genießen? Lasst uns teilhaben an Euren Erlebnissen und macht mit beim Thema des Monats Da blüht uns was! ---> Klick

Session Variable wird unabsichtlich geändert

freshy

Macoun
Registriert
19.11.06
Beiträge
122
Hallo zusammen. Habe ein kleines Problem mit einem PHP-Script, was ich zu einem Test geschrieben habe und woraus mal eine Art Spamschutz für ein Gästebuch werden soll. Erstmal nur die Grundlogik: Später will ich abgespeicherte Bilder per Zufall auswählen und diese per gdlib in die Seite einbinden und zufällig verschnörkeln. Der User soll dann eingeben was er auf dem Bild sieht. Bevor das allerdings passiert, habe ich irgendwie ein fundamentales Problem.

Zum Test habe ich einfach mal Worte anstatt Bilder genommen. Diese Worte werden in ein Array gespeichert und ein Wort zufällig ausgewählt. Dieses Wort wird ausserdem in eine Sessionvariable gespeichert. Jetzt gibt man das richtige Wort ein, schickt das Formular ab... und siehe da... die Sessionvariable hat einen anderen (anscheinend auch zufälligen) Wert. Ganz verdutzt komme ich mit diesem "Phänomen" gar nicht klar. Die Sessionvariable wird im Script ganz klar nach erstmaligem abfragen geändert. Vielleicht mag sich das mal jemand anschauen.

Habt ihr einen Vorschlag? Vielen Dank vorab. ;)

Code:
<?
session_start();

if(isset($_POST['gbgo'])) {
  echo "<b>".$_POST['gbans']." == ".$_SESSION['richtig']."</b><br>";
  if($gbans == $_SESSION['richtig']) {
    echo "<u>richtig</u><br><br>";
  }
  else {
    echo "<u>falsch</u><br><br>";
  }
}

$gbanswers[0] = "Apfel";
$gbanswers[1] = "Birne";
$gbanswers[2] = "Pflaume";
$gbanswers[3] = "Banane";

srand((float)microtime() * 1000000);
shuffle($gbanswers);

$_SESSION['richtig'] = $gbanswers[0];
?>
<form method="post" action="<? echo $PHP_SELF; ?>">
<? echo "Bitte ".$gbanswers[0]." eingeben."; ?><br>
<input type="text" value="" name="gbans"><br>
<input type="submit" name="gbgo">
</form>
 

freshy

Macoun
Registriert
19.11.06
Beiträge
122
Was auch sehr, sehr merkwürdig ist. Auf meinem xampp (lokal) funktioniert das Script ohne Probleme. Hochgeladen aufm Webspace machts Probleme und verursacht obiges Problem. Macht mir da ne PHP-Einstellung Probleme?
 

duderino

Prinzenapfel
Registriert
26.01.06
Beiträge
555
Hast du bevor du die Session startest eine Ausgabe? Auf Windows Rechner macht das keinen Unterschied aber die Linux-Kisten haben Probleme damit. Es darf vor dem Session-Start keine Header-Ausgabe geben.

Bekommst du eine Fehlermeldung auf deinem Webspace?
 

freshy

Macoun
Registriert
19.11.06
Beiträge
122
Vielen Dank für deine Antwort duderino. Also ich habe das Problem jetzt halbwegs gefunden und vorerst abgestellt. Bin aber noch nicht ganz zufrieden.

Also der Fehler lag darin, dass ich über ne Domain, die bei einem anderen Anbieter liegt, per Umleitung + URL Hide auf meinen Webspace zugegriffen hab. Das man also bei Links nicht meine domain sieht, sondern eben diese "externe" und praktisch nicht erkennt auf welchem Server die Dateien wirklich liegen. Das Problem an der Geschichte ist nur, dass da auch PHP durcheinander kommt. Wenn ich das Script "direkt" ohne Umleitung angesprochen hab ging alles einwandfrei. Also irgendwie hat sich da was mit der Session verhakt. Nun hab ich die Domain einfach auf ein Frameset umgeleitet, dass man in der Adresszeile eben nur die externe Domain sieht, aber in den Linkadressen wieder meine Domain zu sehen ist. Eine unschöne Lösung wie ich finde. Soll erstmal so lange dafür hinhalten bis ich eine andere Lösung gefunden habe.

Hat jemand schonmal das selbe Problem gehabt? :)
 

Hilarious

Gelbe Schleswiger Reinette
Registriert
10.08.05
Beiträge
1.759
Das Problem liegt vielmehr im Protokoll (HTTP) begründet. Wenn Du eine Sitzung eröffnest wird der Server im Regelfall versuchen, dem Browser ein Cookie abzuringen. Dies nimmt der Browser aber nur vor Austausch der Seiteninformationen an. Sendest Du zuvor noch Header-Informationen an den Browser, wäre der Ablauf gestört und der Cookie wird schlicht nicht oder falsch gesetzt und auf der Folgeseite von der PHP-Sitzungsverwaltung nicht mehr erkannt. Es mag sein das Windows-Server (IIS) das Protokoll anders interpretieren, aber spätestens mit so toleranzfreien Browsern wie Opera ist da schnell schluss und Deine Kunden rufen an, und »kommen nicht rein« oder werden »rausgeworfen«.

Falls Du immernoch Schwierigkeiten damit hast, kannst Du den HTTP-Verkehr auch kontrollieren. Dazu hilft das Plug-In »livehttpheaders« für den Firefox.
 

Atelis

Akerö
Registriert
01.03.07
Beiträge
1.835
so, habe es leicht abgeändert:
  1. die session-id wird jetzt bei jedem aufruf übertragen - hat nen kleinen vorteil, da nicht alle surfer cookies aktiviert haben.
  2. das zufällige auswählen des Wortes geändert - ich würds so machen...

Code:
<?php

session_name('sid');
session_start();


if (isset($_POST['gbgo'])) {
  echo "<b>".$_POST['gbans']." == ".$_SESSION['richtig']."</b><br>";
  if($gbans == $_SESSION['richtig']) {
    echo "<u>richtig</u><br><br>";
  }
  else {
    echo "<u>falsch</u><br><br>";
  }
}

$gbanswers[0] = "Apfel";
$gbanswers[1] = "Birne";
$gbanswers[2] = "Pflaume";
$gbanswers[3] = "Banane";

$_SESSION['richtig'] = $gbanswers[rand(0, 3)];

?>
<form method="post" action="<?php echo $PHP_SELF . "?sid=" . session_id(); ?>">
<?php echo "Bitte ".$_SESSION['richtig']." eingeben."; ?><br>
<input type="text" value="" name="gbans"><br>
<input type="submit" name="gbgo">
</form>

bei mir funktioniert es jetzt - denke mal, dass es an der übertragung der session-id lag...

-me