Sessions und php-redirect klappt nicht

Mache ich ein PHP-Skript check.php prüft, ob ein Benutzer angemeldet ist. Es gibt nur einen Benutzer, so wird das Passwort geschrieben wird, direkt in den php-code. Die check.php enthalten ist, an der Spitze (Linie 1) von jeder relevanten Seite mit der Zeile <? include "check.php"; ?>.

Den code

Habe ich das Passwort entfernt und der domain-name. Abgesehen davon, dass die folgende ist mein code.
Der Punkt hier ist, dass Sie geben Sie ein Passwort bei einem login-Seite, und dann schicken Sie es per POST an das Skript.

Wenn die Passwort korrekt ist xxx, die Sitzung login speichern true.

Wenn die Passwort ist nicht korrekt, aber ist gesetzt, D. H. der Benutzer eingegeben in, etwas falsch, vorhandene Sitzung beendet wird mit session_destroy(), d.h. er ist abgemeldet.

Wenn er an einer Seite, aber nicht angemeldet, die Sitzung login werden sollte, falsch oder nicht gesetzt, was bedeutet, dass die } elseif(!($_SESSION['login'])) { verwendet werden.

Schließlich, wenn er auf eine logout Taste er ist, senden Sie dieses Skript mit der url: check.php?logout=true. Die logout=true erwischt werden sollte in der $_GET in den letzten elseif-Anweisung, und die Sitzung beendet werden sollte, die in es.

<?
ob_start();
session_start();


if($_POST['password'] == 'xxx') {   //Correct password

    $_SESSION['login'] = true;
    header("Location: http://www.url.com/administration/index.php");

} elseif (isset($_POST['password'])) {  //Wrong password

    session_destroy();
    header("Location: http://www.url.com/administration/login.php?true");

} elseif(!($_SESSION['login'])) {   //Check at every page

    header("Location: http://www.url.com/administration/login.php");

} elseif($_GET['logout']) { //Log out

    session_destroy();
    header("Location: http://www.url.com/");

}
ob_flush();
?>

Das problem

In jeder if-Anweisung, die ich versuchen, umzuleiten. Ich benutze die header("Location:...), aber es funktioniert nicht, in keinem der Fälle. Da die header Befehl muss die erste Anfrage zu senden, um den browser nach den Angaben, die ich verwendet, die ob_start(); und ob_flush(); als hier beschrieben. Es funktioniert nicht mit oder ohne diese.

Gibt es auch ein problem mit der session, das nicht speichern der Inhalte. Ich kann nicht speichern true in der Sitzung der einige Grund. Gibt es da ein problem mit meinem code, macht es nicht?

Als test habe ich versucht zu schreiben, eine echo Befehl in jeder if /ifelse - Anweisung. Ich fand, dass das Skript immer tritt die Dritte Anweisung - der mit den !($_SESSION['login']).

Die Frage

So weit So gut. Das sagt mir, dass das Skript in der Lage ist zu erkennen, dass die session nicht gesetzt ist.

Die zwei Probleme, die bleiben sind:

  • WARUM die Umleitung in einer Anweisung funktioniert nicht, da keine Umleitung geschieht, und
  • WARUM die session nicht festgelegt werden kann, in den ersten Platz.

Jede Beratung wird geschätzt.


Update 1

Deutlich zu machen, was passiert (und was nicht geschehen wird) ich habe in einer echos an verschiedenen stellen. Dieser Ausschnitt des obigen code mit einigen zusätzlichen echos:

...
echo "Input: " . $_POST['password'];
echo "<br>Session before: " . $_SESSION['login'];

if($_POST['password'] == 'xxxx') {  //Correct password

    $_SESSION['login'] = true;
    header("Location: http://www.url.com/administration/index.php");
    echo "<br>Session after: " . $_SESSION['login'];
    echo "<br>The first if works";

} ...

gibt die folgende Ausgabe zurück:

Input: xxxx
Session before:
Session after: 1
The first if works

(Die xxxx ist das Passwort, und es ist richtig).

Dies ist eine situation, wo Sie sind loggin in. Sie haben nur geschrieben, das Passwort und wurde geschickt, um die check.php.

So, ich kann hier sehen, dass es auf den ersten if wie es soll. Und die Sitzung ist ordnungsgemäß eingestellt true (oder 1). Wenn ich die Seite aktualisieren die session nicht gesetzt ist, mehr obwohl. Sollte es nicht sein?

Und die header umleiten klar nicht tun.


Update 2

So, Dank der Antwort von @EmilF unten, ich fand, dass meine session-id - das konnte ich drucken, um den Bildschirm mit echo session_id(); - änderungen auf jeder Seite die Umschalttaste oder die Seite aktualisieren, um einige neue random Zahl, wie es scheint. Ich sieht aus, als wenn die Daten in der session gespeichert ist dann vergessen, denn die neue session-id Punkte woanders.

Mit:

<?
session_id('cutckilc16fm3h66k1amrrls96');
session_start();
...

wo cutckilc16fm3h66k1amrrls96 ist einfach eine willkürliche Zahl, die session-id behoben ist, und die gespeicherten Daten können Sie nun erneut abgerufen werden, nachdem die Seite aktualisieren. Das funktioniert ganz gut; obwohl immer noch ein wenig seltsam ist es notwendig.

Jetzt brauche ich nur die header-Weiterleitung funktioniert...

Gut, das riecht wie etwas, das wurde abgeschaltet. Die Sitzung und die header-Funktionen geändert werden. Vielleicht ist das etwas PHP-Einstellung vom host. Etwas, das blockiert die header-Anfrage.

Fortgesetzt werden...

Update 3 behoben

Siehe meine Antwort unten.

Einige seltsame Symbole erstellt werden, die in den Anfang der Datei, wenn ich die Datei in einer anderen Codierung format, z.B. von ANSI zu UTF-8. Die Symbole angelegt sind  ein, und ich kann nicht sehen, wie Sie in meinen eigenen editor. Weil Sie vor dem php-Skript Sie verhindern, dass die header und session_start() arbeiten proporly. Warum Sie erstellt werden und es ist immer noch ein Rätsel für mich.

  • Ist dein PHP code vor den HTML-Code in Ihre .php-Datei?
  • Der obige code wird eine Datei von selbst check.php. Aber die Datei wird dann in die ganz oben auf den php-Seiten, wo es soll, um zu überprüfen, ob der login gültig ist.
  • Haben Sie so etwas wie HTTPLiveHeader installiert? Dann können Sie sehen, wenn die Location: Kopf an Ihren Webbrowser gesendet wird oder nicht. Ich nehme an, Sie erhalte keine Fehlermeldungen, tun Sie? Haben Sie error_reporting(E_ALL); ?
  • stackoverflow.com/faq#dontask - Lies die FAQ !!!
  • Ich kann nicht sehen, warum die Frage falsch sein sollte. ""Ich möchte, dass die anderen erklären ______ zu mir", dann sind Sie wahrscheinlich OK." Und er will, dass jemand zu erklären, den Fehler zu ihm.
  • Gelesen habe ich es wieder und ich habe Meinung geändert. Erste mal, dass ich Magermilch, und ich dachte, es wird etwas gebildet, die mehr für das forum als für SE.
  • Versuchen Sie print_r für $_POST['password'] array. Wenn nicht von den Umleitungen arbeiten, natürlich Ihr zuerst, wenn etwas falsch ist im code.
  • Wenn ich versuche, dass die $_POST['password'] korrekt ist. Es scheint nicht die if Aussagen, die falsch sind, die Ihre header macht das nichts.
  • Also, ich habe ein update gemacht auf die Frage, um zu zeigen, was die Ausgabe ist, wenn der Benutzer gibt som-Eingang auf log-in. Es scheint, dass die, wenn funktioniert, und dass die Sitzung ordnungsgemäß festgelegt ist. Aber wenn die Seite aktualisiert wird, die Sitzung ist wieder leer. Wie kommt das?
  • Vielen Dank für die tricks. Ich habe versucht die error_reporting(E_ALL); aber es gibt keine Fehlermeldungen, es scheint.
  • Okay, also das nächste debug-Schritt: haben Sie auch etwas zu überprüfen, werden cookies in Ihrem browser? Ich in der Regel verwenden Sie den Firefox web-developer-toolbar-plugin, das hat ein Menü Cookie -> show-cookie-Informationen. Dort sollten Sie sehen, ein PHPSESSID cookie (nach dem login). Wenn nicht, wird Ihre URL sollte auch einige Informationen über die session-id. Ansonsten ist es klar, warum die Sitzung nicht gefunden werden kann.
  • versuchen Sie, beenden; unter dem Header. Vielleicht ist der rest der Seite Ausführung stört dieses Verhalten
  • Ich benutze Chrome mit einem browser toolbox für diese info. Ich habe keine PHPSESSID-cookie. Ich bin mir nicht sicher, was du meinst mit der url info, aber da ist keiner in der url zu sehen. So weit So gut...
  • Die exit; beendet die Ausführung in Ordnung. Aber noch keine session gespeichert ist und noch keine Umleitung funktioniert. 🙁
  • Sie können ersetzen session_start() mit var_dump (session_start());, und geben uns den Wert?
  • Das gibt bool(true). Nicht, dass irgendetwas erzählen?
  • ist sehr seltsam, dass Sie keine Fehler erhalten, mit E_ALL. Vielleicht display_error auf off gesetzt ist? Hinzufügen Sie können set_error_handler(function() {throw new Exception();}); und sehen, ob eine exception geworfen wird?
  • Über die Location: header, ist es in den Kopf (Sie überprüft mit HTTP-Header-plugin)?
  • Hast du desinfizieren Sie die Eingaben?
  • Ich Tat nichts, um den Eingang, während ich Teste. Es ist Reine form, input.
  • Also, wenn Sie die Seite aktualisieren, starten Sie die Sitzung erneut, aber dieses mal, ohne sich anzumelden. Dies ist der Grund, warum es gibt nichts in der session-variable auf aktualisieren.
  • Was meinst du mit start the session again?
  • Vorausgesetzt, Ihre Ausführung die gleiche php-Datei auf "aktualisieren", der code beginnt von der ersten Zeile. Der Anfang des Codes sagt Sitzung starten, aber dieses mal, wenn Sie eine Sitzung starten wieder ohne die login-Daten eingegeben.
  • Ist es diese die du meinst? php.net/manual/en/function.session-start.php session_start();? Wie ich es verstehe, muss diese Zeile gesetzt werden, um zu arbeiten mit sessions. Ich glaube nicht, es ändert sich nichts von selbst.
  • Ich glaube nicht, dass dies wirklich einen Unterschied machen, aber einen Versuch ist es Wert. Ich verwende single-quotes in meine header-Funktionen, und Sie arbeiten immer. Nicht sagen, das ist der Grund, es funktioniert nicht, weil ich wirklich keine Ahnung habe. Aber ich war nur ein Vergleich der Arbeit einer von Ihr nicht zu arbeiten und mein Arbeitstag hat man einfache Anführungszeichen. Nur ein Schuss im Dunkeln. Ich bin erst sagen dies, weil der einzige Unterschied, den ich finde, ist das einfache Anführungszeichen statt der doppelten Anführungszeichen.
  • Einen Versuch Wert, machte aber kein Unterschied leider 🙂
  • Das ist seltsam. Hast du irgendwelche html-Code auf der gleichen Seite, bevor Sie Ihre php? Ich lese auf einer Website, die mit html, bevor eine header-Funktion macht es nicht funktionieren.
  • Ja, den header muss die erste Anforderung an den browser. php.net/manual/en/function.header.php. "Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP". Ich habe das ausprobiert. Ich habe sogar versucht, indem Sie die Kopfzeile auf der Linie 1 kurz nach der <? starten alle anderen Inhalte auf der Seite auskommentiert, aber kein Glück entweder. Es fühlt sich an wie etwas, das ausgeschaltet ist, blockieren meinen Kopf verlangen.
  • Ich habe keine Ahnung dann. Vielleicht sollten Sie beginnen, ein Kopfgeld auf diese Frage.
  • Frage wurde aktualisiert. Siehe update 2. Die Hälfte der Probleme sind jetzt gelöst etwas. Der header-redirect-Problem bleibt.
  • fügen Sie diese register_shutdown_function(function() { var_dump(headers_list()); }); (oder einfach var_dump(headers_list()); am Ende der Seite) und sehen, was heraus kommen
  • var_dump(headers_list()); am Ende der Seite gibt array(2) { [0]=> string(24) "X-Powered-By: PHP/5.3.14" [1]=> string(23) "Content-type: text/html" }.

InformationsquelleAutor Steeven | 2012-07-14
Schreibe einen Kommentar