Login - Mit PHP und MySQL

joergi4711

Grünschnabel
Hallo!
Ich verzweifle seit gestern an einem Login Script.

PHP:
<?php session_start();
    include 'includes/db.php';
    if(isset($_SESSION['user']) && isset($_SESSION['password']) == true){
        $sel_sql = "SELECT * FROM users WHERE user_email = '$_SESSION[user]' AND user_password = '$_SESSION[password]'";
        if($run_sql = mysqli_query($conn,$sel_sql)){
            if(mysqli_num_rows($run_sql) == 1 ){
               
            } else {
                header('Location:../index.html');
            }
        }
    } else {
        header('Location:../index.html');
    }
?>

Der Login funktioniert, auch die Session funktioniert!
Wenn ich aber session_destroy() ausführe ist die Session zerstört kann aber trotzdem diese Datei aufrufen. Obwohl sie ja zur Location ../index.html führen solle wenn die Session nicht vorhanden ist.
Habe schon alles durchprobiert. Habt ihr eine Idee?
 
Hi,

kommt nach der Zeile 15 noch HTML? Nach dem header() immer ein exit() oder so was einbauen, das hat mich auch schon öfters ausgetrickst.
Wird das SQL ausgeführt?
Stell mal das error_reporting auf E_ALL, bzw. das display_errors auf "on".

Grüsse,
BK
 
Danke für die Antwort!
benutze leider einen Provider bei dem ich error_reporting nicht umstellen kann.
Das SQL wird ausgeführt und danach kommt noch HTML.
Habe jetzt ein exit() eingebaut, und es funktioniert soweit. Also Es wird kein HTML mehr angezeigt, sobald ich mich einlogge aber schon!
Kann das sein das header() irgendwie nicht funktioniert?
 
Hi,

ich denke dass der Fehler primär an dem If in Zeile 5 liegt.
Siehe hier auch die Doku zu dem mysqli_query(): http://www.php.net/mysqli_query

Dein If frägt ja quasi auf einen boolean ab, aber die Abfrage liefert eine Object zurück. Ich vermute dass du hier abfragen willst, ob das SELECT erfolgreich war. Dann müsstest du das so schreiben:
PHP:
$run_sql = mysqli_query($conn,$sel_sql);
if($run_sql !== FALSE) {

Zu dem header('Location: ...'). Manche (die meisten?) Browser ignorieren eine Header-Weiterleitung, wenn die Seite noch HTML-Content schickt. Wenn man aber als Programmierer eine solche Weiterleitung einbaut, dann will man ja eigentlich nach der Weiterleitung abbrechen, sprich, ein exit() einbauen.

Das error_reporting kannst du auch direkt über eine .htaccess oder in deinem Script einschalten:
http://stackoverflow.com/a/6128036/1164913
http://stackoverflow.com/a/16933735/1164913

Mir fällt noch etwas anderes (hat vermutlich nichts mit dem Problem zu tun) auf:
- Du verwendest vom Benutzer veränderbare Parameter direkt im SQL, ohne Sicherung (SQL-Injection!)
- Du schreibst deine Session-Array Variablen direkt innerhalb deiner "..." (schlecht lesbar)
- Ich würde dir empfehlen, dich etwas in PreparedStatements einzulesen (Sicherheit, Standard)

Grüsse,
BK
 
Habe jetzt error_reporting.

Code:
<?php session_start();
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);
    include 'includes/db.php';
    if(isset($_SESSION['user']) && isset($_SESSION['password']) == true){
        $sel_sql = "SELECT * FROM users WHERE user_email = '$_SESSION[user]' AND user_password = '$_SESSION[password]'";
        $run_sql = mysqli_query($conn,$sel_sql);
            if($run_sql !== FALSE) {               
            } else {
                header('Location:../index.html');
                exit();
            }
       
    } else {
        header('Location:../index.html');
        exit();
    }
?>

Jetzt zeigt er mir diese Fehlermeldung:

Warning: Cannot modify header information - headers already sent by (output started at /index.php:1) in /index.php on line 16
 
Hi,

klassischer Fehler: Du kannst die Header nur verändern, wenn noch keine Daten zum Client gesendet wurden. Sprich: Vor dem header() darf nichts anderes (echo, oder Daten ausserhalb der <?php-Tags) stehen.
Hier ist oft auch das File-Encoding (UTF-8) Schuld, wenn hier das BOM gesetzt ist. Dies darf nicht da sein.

Grüsse,
BK
 

Neue Beiträge

Zurück