• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP Header klappt nicht

_R_A_L_F_

Mitglied
Hallo,

habe ein simples Login - Script mit PHP gebaut und möchte bei erfolgreichem Login eine Weiterleitung auf eine bestimmte Seite erreichen aber die header - Funktion klappt nicht.

Hier der Code:

PHP:
// Session starten
session_start();

// Zugangsdaten
$benutzername = 'admin';
$passwort     = '123';

// Variablen deklarieren
$_SESSION['angemeldet'] = false;
$fehlermeldung = '<H3>Deine Anmeldung war fehlerhaft!</H3>';

// Formular abgeschickt?
if (isset( $_POST['login'] ))
{
    // Maskierende Slashes aus POST Array entfernen
    if (get_magic_quotes_gpc())
    {
        $_POST = array_map( 'stripslashes', $_POST );
    }
    // Benutzereingabe mit Zugangsdaten vergleichen
    if (strtolower( $benutzername ) == strtolower( trim( $_POST['benutzer'] )) &&
        $passwort == trim( $_POST['passwort'] ))
    {
        // Wenn die Anmeldung korrekt war Session Variable setzen
        // und auf die Seite weiterleiten hier als Beispiel ebay.de (auch das klappt nicht)
        $_SESSION['angemeldet'] = true;
        header ("Location: http://www.ebay.de");
        exit;
    }
    else
    {
        // Wenn die Anmeldung fehlerhaft war, Fehlermeldung ausgeben
        echo $fehlermeldung;
    }
}

?>

<form id="loginform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">

<label for="passwort">Benutzername  </label> <br />
<input type="text" name="benutzer" id="benutzer" value="" /><br />
<label for="passwort">Passwort </label><br />
<input type="password" name="passwort" id="passwort" value="" /><br /><p>
<input type="submit" name="login" id="login" value="Anmelden" /> <br />
</form>

Gibts da irgendwelche Besonderheiten damit die header - Funktion klappt? Hab nämlich bei Google nicht mehr dazu gefunden, als das, dass es so gehen soll.

Danke
 
Werbung:
Hallo,

klar, keine Ausgabe vor head() weiterleitung.

Dein code sieht aber so aus als ob da nicht EVA-Prinzip (eingabe-verarbeitung-ausgabe).
Du hast den PHP code mitten im HTML code also wirst wohl ausgaben vorher haben.

Wenn php error an hättest würde PHP dir das auch sagen :O).

Cheffchen
 
Werbung:
Danke für den Tipp Cheffchen, dass das Problem an der Ausgabe zuvor vor der header - Funktion nicht zulässig ist und deshalb die Weiterleitung nicht klappt. Aber das Problem ist, ich weiß nicht wie ich dies umgehen kann? Als Weiterleitungsmöglichkeit bietet PHP ja nur die header - Funktion meines wissens aber wie muss ich das dann anstellen, dass bei erfolgreicher Anmeldung auf der admin.php Seite der Benutzer auf die edit.php Seite weitergeleitet wird?

Den Tipp von bdt600 hab ich auch umgesetzt und jetzt statt:

PHP:
<?php echo $_SERVER['PHP_SELF']; ?>

folgendes geschrieben:

PHP:
<?php echo $_SERVER['SCRIPT_NAME']; ?>
 
PHP:
<?php

// Session starten
session_start();
// Zugangsdaten
$benutzername = 'admin';
$passwort     = '123';
// Variablen deklarieren
$_SESSION['angemeldet'] = false;
$fehlermeldung = '';
// Formular abgeschickt?
if (isset( $_POST['login'] ))
{
    // Maskierende Slashes aus POST Array entfernen
    if (get_magic_quotes_gpc())
    {
        $_POST = array_map( 'stripslashes', $_POST );
    }
    // Benutzereingabe mit Zugangsdaten vergleichen
    if (strtolower( $benutzername ) == strtolower( trim( $_POST['benutzer'] )) &&
        $passwort == trim( $_POST['passwort'] ))
    {
        // Wenn die Anmeldung korrekt war Session Variable setzen
        // und auf die Seite weiterleiten hier als Beispiel ebay.de (auch das klappt nicht)
        $_SESSION['angemeldet'] = true;
        header ("Location: http://www.ebay.de");
        exit;
    }
    else
    {
        // Wenn die Anmeldung fehlerhaft war, Fehlermeldung ausgeben
        $fehlermeldung = '<H3>Deine Anmeldung war fehlerhaft!</H3>';
    }
}
?>
<html>
  :
  :
  :
<?php echo $fehlermeldung; ?>

    <form id="loginform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
    
    <label for="passwort">Benutzername  </label> <br />
    <input type="text" name="benutzer" id="benutzer" value="" /><br />
    <label for="passwort">Passwort </label><br />
    <input type="password" name="passwort" id="passwort" value="" /><br /><p>
    <input type="submit" name="login" id="login" value="Anmelden" /> <br />
    </form>
:
:
</html>
 
Also Problem hab ich mittlerweile gelöst, Danke für eure Hilfe ;)

Trotzdem noch die Frage:
Kann ich diese Weiterleitung noch anderweitig lösen?
 
Zuletzt bearbeitet:
Werbung:
Einen weiterleitungs Header zu setzen ist IMHO die beste Option. Man kann die weiterleitung jedoch deaktivieren, weshalb man vorsichtshalber immer noch einen Link anzeigen sollte, welcher einem auf die richtige Seite führt.

Off Topic
Das selbe Prinzip gilt übrigens für JavaScript lösch links. Man schreibt immer gerne so etwas wie:

HTML:
<a href="seite.php?aktion=loeschen" onclick="confirm('Wirklich löschen?');">Löschen</a>

sollte aber lieber soetwas schreiben

HTML:
<a href="seite.php?aktion=wirklich_loeschen" onclick="if (confirm('wirklich löschen?')) { return true; } else { window.location.href = "seite.php?aktion=loeschen"; return false; }">Löschen</a>
Off Topic End

Andere möglichkeiten wären eine weiterleitung per HTML Meta tag, was praktisch ein Header ist aber in HTML Codiert wird. (Beispiel: <meta http-equiv="refresh" content="1; URL=http://www.beispiel.de/">)
Allerdings ist diese Variante genau so blöd wie die beliebten <metahttp-equiv="Content-Type"content="text/html; charset=utf-8"> welche genau so gut lieber als header definiert werden sollten.

Als letzte und schätzungsweise schlechteste alternative kannst du einfach folgendes ausgeben:

Code:
<script>window.location.href="www.example.com"</script>

Hat den Nachteil, dass es ganz leicht deaktiviert werden kann. Aber auch den vorteil, dass du es überall im code schreiben kannst, auch nachdem du schon etwas ausgegeben hast. (was aber kein wirklicher vorteil ist weil du dir dadurch erlaubst schlechter zu programmieren als du es tun solltest.)

Fußnote
@Cheffchen hat es schonmal gesagt aber hier nochmal etwas detalierter.
Du solltest dir immer zum frühst möglichen Zeitpunkt bewust sein, was genau du machen willst auf der aktuellen Seite.
Du empfängst allen Input und machst dir anhand dessen sofort klar was die gewünschte aktion ist. Wenn du weiterleiten willst wirst du das schon wissen müssen, bevor du überhaupt irgendetwas ausgibst.
Es macht einfach vieles einfacher wenn du alles in einer geregelten Laufbahn klärst und das Ausgeben der eigentlichen Seite so lange wie möglich hinauszögerst.
 
Zurück
Oben