Warum gibt PHP die Session nicht an die nächste Seite weiter?

4 Antworten

Vom Fragesteller als hilfreich ausgezeichnet

Auf Anhieb sehe ich da keinen Fehler. Außer vielleicht deine fehlende Abfrage, ob das Formular ausgefüllt wurde. Andere Baustelle.

Schaue einmal im Webbrowser in den Debugger (F12) und in den Netzwerkverkehr. Insbesondere wichtig wäre hier, ob die Session-ID per Cookie auch beim Aufruf der Seiten noch übergeben wird. Denn die erste Seite (index.php) funktioniert auch völlig ohne funktionierende Session-. Die Variable $_SESSION gibt es ja auch ohne, dass session_start funktioniert.

Darüber hinaus ist es immer eine gute Idee, alle Fehler einzuschalten (error_reporting(E_ALL). Eventuell gibt es ein Problem beim Starten der Session, was dir nur nicht angezeigt wird. session_start muss wirklich das Erste sein, was du machst, vor weiteren Ausgaben. Manche Texteditoren speichern beispielsweise ein sogenanntes UTF-BOM ab, etwas Unsichtbares zu Beginn der Datei. Damit hast du schon eine Ausgabe an den Browser und session_start funktioniert nicht mehr.

Woher ich das weiß:Berufserfahrung

Es scheint echt an einem BOM zu liegen. Ich nutze Visual Studio, und eine komfortable Methode, darauf zu verzichten, scheint nicht zu existieren. Dafür habe ich es jetzt anders gelöst: per .htaccess habe ich session.auto_start aktiviert, jetzt brauche ich session_start(); nicht mehr. Aber selbst die .htaccess musste ich über einen Web-FTP erstellen, denn über VS hat jede .htaccess unabhängig vom Inhalt zu Error 500 geführt.

0

Nun bei mir funktioniert dein Beispiel. Du solltest im Webserver alle Fehler anzeigen und mal in die php_errors.log schauen, ob sich der gute da beschwert. Ansonsten einfach mal auf der zweiten Seite nach dem session_start die gesamte $_SESSION Variable ausgeben:

echo '<pre>';
print_r($_SESSION);
echo '</pre>';

oder leichter aber ohne entsprechende Extensions wie XDebug, welche die Formatierung übernehmen unleserlicher:

var_dump($_SESSION);

Daneben kannst du natürlich einfach mal mit einer vernünftigen IDE bzw. einen guten Editor durch debuggen. Sprich etwas wie Netbeans, Eclipse, PHPStorm oder Visual Studio Code heranziehen in Kombination mit XDebug.

Ich tippe mal, dass die php_errors.log aber schon Fehler enthält, welche dir hier einen hinweis geben. Zum Beispiel, dass die Session nicht geöffnet werden kann alternativ sind die Sessions auf dem Webserver falsch konfiguriert. Wichtig in dem Zusammenhang wären wohl:

session.use_cookies = 1
session.use_only_cookies = 1
session.auto_start = 0

Ob session.use_strict_mode einen Einfluss hat, weiß ich spontan nicht. Den Wert habe ich persönlich auf 0.

Weiteres beliebtes Problem ist, dass der Ordner des session.save_path nicht existiert oder der Webserver keine Berechtigungen hat hier rein zuschreiben, wobei du dann das Problem auch schon auf der ersten Seite haben solltest.

Ansonsten poste uns doch mal via pastebin.com z.B. deine php.ini oder zumindest alle Einträge daraus, die für die Konfiguration der Session zuständig sind.

Ich nutze Visual Studio, was das Problem wohl auch auslöste. VS setzt bei jeder erstellten Datei ein BOM, wodurch session_start(); nicht mehr funktioniert. Ich habe jetzt aber session.auto_start per .htaccess aktiviert (was übrigens auch nicht über VS funktioniert hat, dafür habe ich einen Web-FTP-Manager gebraucht). Jetzt funktioniert es aber.

0

Wird nach dem Abschicken des Logins der Eintrag Registriert als'.$_SESSION['nn'].' korrekt angezeigt oder wird da angezeigt Du musst dich erst <a href="/experimentell">einlochen</a>?

Alex

Auf der ersten Seite wird es korrekt angezeigt, auf der zweiten nicht mehr. Laut weiter.php müsste ich mich erst einloggen.

0
@Kasagranda

Das bedeutet dann wohl, dass Deine session nicht gespeichert wird, z. B. weil das in session.save_path angegebene Verzeichnis nicht schreibbar ist.

0

Ich bin kein PHP Entwickler, aber ich glaube nicht, dass das so geht, wie du das in der index.php gemacht hast.

PHP wird, so viel ich weiß, beim Aufrufen der Seite erzeugt. Wenn du nun die Seite aufrufst, dann wird

$Name = $_POST['Nickname'];

Dieser Abschnitt direkt ausgeführt. So viel ich weiß, musst du dein Login Script in eine andere Datei legen. z.B. hast du eine index.php und dann eine login.php. In der Form Action rufst du dann einfach die login.php auf und als method nimmst du POST.

 <form action="./login.php" method="POST">

Dann kannst du in der login.php auf die Variable Nickname zugreifen.

Von da aus kannst du dann auf die weiter.php verlinken.

Die login.php sieht dann z.B. so aus

<?php
  session_start();
  if(!isset($_SESSION['nn'])){
    $_SESSION['nn'] = $_POST['Nickname'];
    echo 'Registriert als'.$_SESSION['nn'].'<br /> <a href="/experimentell/weiter.php">Weiter geht es hier.</a>';
  }
?>


So viel ich weiß, musst du dein Login Script in eine andere Datei legen. z.B. hast du eine index.php und dann eine login.php.

Kannm man machen, muss man aber nicht. Mit action="#" wird dieselbe Seite nochmal aufgerufen. Das ist möglich, dann macht es zwei separate Aufrufe zu derselben Seite. Man sollte aber sauber prüfen, ob es der erste Aufruf (=Formular nicht ausgefüllt) oder der zweite Aufruf (Formular ausgefüllt) ist.

Sprich: Es ist wichtiger, das Grundprinzip, dass es also in Summe immer zwei Script-Durchläufe sind, zu verstehen :-)

0
@mepeisen

Deswegen sagte ich ja, dass ich kein PHP Entwickler bin. Ich setze bei Webseiten Java ein. Für reine Webseiten arbeite ich mit Tomcat, wo eher weniger JavaScript eingesetzt wird und wo eben JavaScript verwendet werden kann, nutze ich einen Embedded Jetty Server und mach einfach den ganzen Seitenaufbau via WebSocket.

0
@Xearox

Auch n Java und via Tomcat/Jetty bzw. mit WebSockets sind es grundsätzlich zwei Seitenaufrufe. Man kann diese via URL unterscheiden, muss man nicht. Man kann es auch via Parameter unterscheiden.

Erst gewisse Frameworks bzw. Einsatz derselben lassen es irgendwann so aussehen, als würden sich die Inhalte dynamisch verändern. Bei J2EE etwa die Optionen, Beans zu definieren, die Events empfangen und dann ihr "Aussehen" verändern. Tatsächlich ist das nur ein geschickter Einsatz von Ajax ;-)

In PHP gibt es auch solche Frameworks. Würde aber ggf. zu weit führen, das hier zu diskutieren.

0

Was möchtest Du wissen?