Problem mit weiterleitung via header(location: ...)


#1
Hallo Forum!
Es ist scheinbar ein leidiges Thema und es gibt jede Menge Threads dazu. Leider konnte das bisher zu keiner Lösung beitragen. Egal was ich probiert habe, ich lande auf einer leeren Seite (kein Inhalt, wenn ich den Quelltext mithilfe des Browsers anzeigen lasse).
error_reporting(E_ALL) liefert nichts.

Was ich ursprünglich wollte:
Meine index.php bindet ein Formular ein, welches Benutzernamen und Passwort abfragt und die eingegeben Daten dann durch Klick auf den Senden-Button an "die Datei" übergibt, die die dann die eingebenen Daten mit den hinterlegten Daten in einer Tabelle vergleicht und dann entsprechend weiterleiten soll.

PHP:
<?php
   error_reporting(E_ALL);
   $servername = "localhost";
   $db = "usr_web1052_4";
   $table = "user";
   $conn = mysqli_connect ( $servername, 'beispielusr', 'beispielpwd', $db ); // Verbinden mit mySQL DB
   mysqli_query ( $conn, "SET NAMES 'utf8'" );
   $sql = "SELECT * FROM $table"; // Name der Tabelle
   $result = mysqli_query ( $conn, $sql ); // Antwort der DB in result schreiben
   $form_user = $_POST['USR'];
   $form_pwd = $_POST['PWD'];
   while ( $zeile = mysqli_fetch_assoc ( $result ) )
       {
           if ( $form_user == $zeile['username'] ) // Username abgleichen
               {
                   if ( $form_pwd == $zeile['password'] ) // Passwort abgleichen
                       {
                           session_start ();
                           $_SESSION['MENSCH'] = $zeile['vorname'];
                           $_SESSION['USR'] = $form_user;
                           $_SESSION['PWD'] = $form_pwd;
                           header ('location: http://www.webseite.ab/termine.php');
                           exit;
                       }
                   else // Passwort falsch
                       {
                           header ('location: http://www.webseite.ab/index.php');
                           exit;
                       }
               }
           else // User nicht vorhanden
               {
                   header ('location: http://www.webseite.ab/index.php');
                   exit;
               }
       }
?>
Bis zum header Befehl funktioniert so weit alles. Teste ich das Ganze auf XAMPP funktioniert es komplett. Um alles auszuschließen, habe ich selbst das hier versucht:
PHP:
<?php
header ('location: http://www.webseite.ab/index.php');
exit;
?>
Leider auch ohne Erfolg. Ich lande wieder auf der leeren Seite. Übersehe ich da irgendwas?
Ich bin ein ziemlicher Noob, was php angeht. :D
 

Kalito

Erfahrenes Mitglied
#2
Ich entnehme deinen Worten, dass das ganze auf xampp funktioniert, aber nicht auf einen anderen Server? Ist das ein eigener Server oder ein shared Server? Bei einem shared Server kann es sein, dass das Reporting ausgeschaltet ist. Was sagt das error-Log vom apache?
 
#3
Exakt. Ich hab gerade herausgefunden, dass die Fehlerausgabe auf dem Server deaktiviert war. Hast also Recht gehabt. Kein Wunder, dass es dann keine Fehlermeldungen gab... *facepalm*
Jetzt kriege ich das hier:

Warning: session_start(): Cannot send session cookie - headers already sent by (output started at /var/www/web1052/html/TET/passwort.php:1) in /var/www/web1052/html/TET/passwort.php on line 18

Warning: session_start(): Cannot send session cache limiter - headers already sent (output started at /var/www/web1052/html/TET/passwort.php:1) in /var/www/web1052/html/TET/passwort.php on line 18

Warning: Cannot modify header information - headers already sent by (output started at /var/www/web1052/html/TET/passwort.php:1) in /var/www/web1052/html/TET/passwort.php on line 22
 
#4
Das Problem mit der Session sollte sich ja mit ISSET abfangen lassen. Hab das gerade auch mal mit nem anderen Account verucht, dann gibts das Problem natürlich nicht mehr. Aber die Fehler an den Stellen mit dem header (location: ...) bleiben bestehen. Ich hab mal danach gesucht und überall war die Problemlösung, dass es noch Teile von HTML in der Datei gab oder in eingebundenen Dateien. Allerdings sind bei keine anderen Dateien eingebunden und HTML gibt es auch nicht. Der Inhalt der php-datei ist das, was ich gepostet habe.
 
#5
OK, Problem ist gelöst.
1. Problem war: Zeichsatz auf UTF-8, statt UTF-8 ohne BOM
2. Problem war: Das Ding mit der Session. Das habe ich jetzt wie folgt abgefangen:
PHP:
                           // erste Anmeldung oder schon angemeldet?
                           session_start ();
                           if ( ISSET ( $_SESSION['USR'] ) )
                               {
                                   
                               }
                           else
                               {
                                   $_SESSION['USR'] = $_POST['USR'];
                               }

                           if ( ISSET ( $_SESSION['PWD'] ) )
                               {
                                   
                               }
                           else
                               {
                                   $_SESSION['PWD'] = $_POST['PWD'];
                               }                           
                           if ( ISSET ( $_SESSION['MENSCH'] ) )
                               {
                                   
                               }
                           else
                               {
                                   $_SESSION['PWD'] = $zeile['vorname'];
                               }
Gibt es da eine elegantere Lösung für? 3xIF erscheint mir irgendwie nicht sehr geschickt.
 
#6
Hi

den Grund für das "headers already sent" kennst du ja inzwischen - aber was genau sollen diese if jetzt noch?
Irgendwie seh ich das Problem nicht, das da gelöst werden soll.

Sonstiges:

Warum wird eigentlich die komplette DB-Tabelle abgefragt und dann in PHP Zeile für Zeile durchsucht? Das würde mit einem Where in SQL auch gehen - einer der Gründe, warum man überhaupt eine DB hat.

Das wird also ein Login, der nötig ist, um auf termine.php zugreifen zu können? Das Password gehört da jedenfalls nicht in die Session.

Wo ist ein session_start? Bei deiner Installation ist wohl die Autostart-Option gesetzt, aber am Onlineserver evt. nicht.

Prüft termine.php überhaupt, ob man eingeloggt ist?

Was passiert, wenn nicht alle Formularvariablen gesendet wurden? => isset

Und last but not least, deine Passwörter sind einfach so als Text in der DB gespeichert. Das ist ein ganz großer (aber leider bei Anfängern häufiger) Fehler. Siehe Beispiele zu pbkdf2 oder bcrypt.
 

Neue Beiträge