Avatar billede damholdt Nybegynder
12. februar 2006 - 22:16 Der er 31 kommentarer og
1 løsning

Hvid skærm ved forkert logon

Jeg har følgende problem. Se evt. http://www.damholdt.dk/musikal/index2.php.

Jeg kan fint nok logge på med den emailadresse og kode som er oprettet i databasen, men lige så snart jeg taster forkert emailadresse/kode (ja, eller ingen for den sags skyld) får jeg bare en helt hvid skærm uden source.

Koden ser ud som følger:

---------------------------------------------
<?php
require 'db.inc.php';
$head_message = "Du er ikke logget ind i øjeblikket. Benyt loginboksen herunder hvis du vil logge ind.";
session_start();

# Allerførst finder vi ud af om brugeren allerede er logget på
if(isset($_SESSION[email])) {
    $login = true;
} else {
    $login = false;
};

# Ønsker brugeren af logge ud, så skal dette naturligvis ske som det første
if ($login && $_GET['logout']) {
    unset($_SESSION['email'], $_SESSION['password'], $_SESSION['name'], $_SESSION['lastonline'], $_SESSION['id']);
    $login = false;
};

# Hvis ikke brugeren er logget ind undersøger vi om loginboksen er udfyldt
if (!$login) {
    if (isset($_POST['login_email'], $_POST['login_password'])) {
   
        # Vi starter sessions og hiver variablerne ud af formen...
        $login_email = $_POST['login_email'];
        $login_password = md5($_POST['login_password']);
       
        # ...og kontrollerer om brugeren eksisterer i databasen
        open_db();
        $login_result = mysql_query("SELECT * FROM musikal_users WHERE user_email = '$login_email' AND user_password = '$login_password'") or die(mysql_error());
        $user_row = mysql_fetch_object($login_result) or die(mysql_error());
        close_db();
        if (!empty($user_row) && $user_row->user_email == $login_email && $user_row->user_password == $login_password) {
           
            # Yes yes. Brugeren er god nok! Så logger vi ind og sætter sessions
            $login = true;   
            $_SESSION['email'] = $login_email;
            $_SESSION['password'] = $login_password;
            $_SESSION['name'] = $user_row->user_firstname . ' ' . $user_row->user_surname;
            $_SESSION['lastonline'] = $user_row->user_lastonline;
            $_SESSION['id'] = $user_row->user_id;
           
            # Hvis det er første gang brugeren logger på registrerer vi det i databasen
            if (!$user_row->user_active) {
                open_db();
                mysql_query("UPDATE musikal_users SET user_active = 1 WHERE user_email = '$login_email'") or die(mysql_error());
                mysql_query("UPDATE musikal_users SET user_activated = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
                close_db();       
                echo "<script language=\"javascript\" type=\"text/javascript\">alert('Dette er første gang du logger på MusiKal. Dit abonnement startes nu.');</script>";
               
                # Og vi ændrer lastonline-beskeden
                $head_message = 'Hej ' . $_SESSION['name'] . '! Dette er første gang du logger på. [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
                $kill_head = true;
            };
           
            # Vi retter logintidspunkt i databasen
            open_db();
            mysql_query("UPDATE musikal_users SET user_lastonline = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
            close_db();
           
        # Hvis email og kode ikke passer sammen, så sender vi brugeren tilbage med besked om at ændre fejlen
        } else {
            echo "<script language=\"javascript\" type=\"text/javascript\">alert('Fejl i email og/eller adgangskode. Ret fejlen og prøv igen!');</script>";
            header('Location: $PHP_SELF');   
        };
    };
};   

# Hvis brugeren er logget ind eller bliver det vha. ovenstående skal vi skabe adgang til de hemmelige ting
if($login) {

    # Vi skal lige have styr på tidspunktet og lavet velkomstbeskeden
    if (!$kill_head) {
        $datefromdb = $_SESSION['lastonline'];
        $year = substr($datefromdb,0,4);
        $mon  = substr($datefromdb,4,2);
        $day  = substr($datefromdb,6,2);
        $hour = substr($datefromdb,8,2);
        $min  = substr($datefromdb,10,2);
        $sec  = substr($datefromdb,12,2);
        $orgdate = date("j/n-Y, \k\l. H:i.s ",mktime($hour,$min,$sec,$mon,$day,$year));
        $head_message = 'Hej ' . $_SESSION['name'] . '! Du var sidst online d. ' . $orgdate . ' [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
    };
};
?>
---------------------------------------------

På forhånd tak!
Avatar billede zappa Nybegynder
12. februar 2006 - 22:35 #1
Et hurtigt gæt er at der mangler "'" i
...
if(isset($_SESSION[email])) {
...
Avatar billede nielle Nybegynder
12. februar 2006 - 22:40 #2
Du får sikkert en fejlmeddelelse som du bare ikke ser pga. serverens opsætning.

Grunden til at du får en fejlmeddelelse, er at man ikke kan bruge header() efter at man har udskrevet noget til skærmen, og det forsøger du at gøre her:

echo "<script language=\"javascript\" type=\"text/javascript\">alert('Fejl i email og/eller adgangskode. Ret fejlen og prøv igen!');</script>";
header('Location: $PHP_SELF');
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:42 #3
Hmm... Nope. Har lige rettet det, men fejlen er der stadig...
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:44 #4
Ja, det gælder forøvrigt også nielle's svar. Har fjernet headeren, men det snurrer stadig ikke.
Avatar billede nielle Nybegynder
12. februar 2006 - 22:49 #5
Inden at jeg jager videre efter fejlen, vil jeg lige påpege at det er frygteligt ineffektivt at åbne og lukke adgangen til databasen for hver query.
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:52 #6
Hmm... Bedre at åbne i starten, og lukke i bunden af filen? Eller rettere, kan man det?
Avatar billede nielle Nybegynder
12. februar 2006 - 22:53 #7
Ja :^)
Avatar billede nielle Nybegynder
12. februar 2006 - 22:54 #8
Hvad får du egentlig hvis du laver en Vis Kilde på den blanke side?
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:54 #9
Hmm... Det laver jeg lige om.
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:56 #10
Høps... Du har jo ret :o))
Avatar billede damholdt Nybegynder
12. februar 2006 - 22:57 #11
Før fik jeg en helt blank side, men efter disse ændringer skriver den:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=windows-1252"></HEAD>
<BODY></BODY></HTML>

Se evt. på www.damholdt.dk/musikal/index2.php
Avatar billede damholdt Nybegynder
12. februar 2006 - 23:01 #12
Det er da heller ikke noget jeg mindes at have skrevet... (???)
Avatar billede nielle Nybegynder
12. februar 2006 - 23:06 #13
Det har ikke noget med fejlen at gøre, men...

Når du laver dette:

$login_result = mysql_query("SELECT * FROM musikal_users WHERE user_email = '$login_email' AND user_password = '$login_password'") or die(mysql_error());

- så får du kun rækker ud som rent faktisk opfylder betingelserne i WHERE-delen. Derfor er det også overflødigt med de to sodste betingelser i din efterfølgende if-sætning:

if (!empty($user_row) && $user_row->user_email == $login_email && $user_row->user_password == $login_password)

I øvrigt kan du spørge på om der blev fundet nogle rækker ved at teste værdien af mysql_num_rows():

http://dk.php.net/manual/da/function.mysql-num-rows.php
Avatar billede nielle Nybegynder
12. februar 2006 - 23:08 #14
> Det er da heller ikke noget jeg mindes at have skrevet... (???)

Nej, det har du heller ikke. Det er en default-værdi der bliver udskrevet (af din server) hvis du ikke selv udskriver noget som helst.
Avatar billede damholdt Nybegynder
12. februar 2006 - 23:09 #15
Hehe... Du er rigtig i ilden i aften :o) Tak for tippet. Jeg tror jeg er ved at være lidt træt siden jeg kan overse den!
Avatar billede nielle Nybegynder
12. februar 2006 - 23:12 #16
Prøv at rette denne her:

if (!empty($user_row) && $user_row->user_email == $login_email && $user_row->user_password == $login_password)

- til dette:

if ($user_row) !== false)
Avatar billede nielle Nybegynder
12. februar 2006 - 23:16 #17
Altså:

if ($user_row !== false)
Avatar billede damholdt Nybegynder
12. februar 2006 - 23:18 #18
Det gør ingen forskel - desværre
Avatar billede nielle Nybegynder
12. februar 2006 - 23:19 #19
Må desværre smutte for i aften. Men kan du ikke lige poste din kode som den ser ud nu?
Avatar billede damholdt Nybegynder
12. februar 2006 - 23:20 #20
Koden er nu optimeret til følgende (men fejlen er der stadig):
------------------------------------
<?php
require 'db.inc.php';
open_db();
$head_message = "Du er ikke logget ind i øjeblikket. Benyt loginboksen herunder hvis du vil logge ind.";
session_start();

# Allerførst finder vi ud af om brugeren allerede er logget på
if(isset($_SESSION['email'])) {
    $login = true;
} else {
    $login = false;
};

# Ønsker brugeren af logge ud, så skal dette naturligvis ske som det første
if ($login && $_GET['logout']) {
    unset($_SESSION['email'], $_SESSION['password'], $_SESSION['name'], $_SESSION['lastonline'], $_SESSION['id']);
    $login = false;
};

# Hvis ikke brugeren er logget ind undersøger vi om loginboksen er udfyldt
if (!$login) {
    if (isset($_POST['login_email'], $_POST['login_password'])) {
   
        # Vi starter sessions og hiver variablerne ud af formen...
        $login_email = $_POST['login_email'];
        $login_password = md5($_POST['login_password']);
       
        # ...og kontrollerer om brugeren eksisterer i databasen
        $login_result = mysql_query("SELECT * FROM musikal_users WHERE user_email = '$login_email' AND user_password = '$login_password'") or die(mysql_error());
        $user_row = mysql_fetch_object($login_result) or die(mysql_error());
        $user_row_count = mysql_num_rows($login_result);
        if ($user_row !== false && $user_row_count == 1) {
           
            # Yes yes. Brugeren er god nok! Så logger vi ind og sætter sessions
            $login = true;   
            $_SESSION['email'] = $login_email;
            $_SESSION['password'] = $login_password;
            $_SESSION['name'] = $user_row->user_firstname . ' ' . $user_row->user_surname;
            $_SESSION['lastonline'] = $user_row->user_lastonline;
            $_SESSION['id'] = $user_row->user_id;
           
            # Hvis det er første gang brugeren logger på registrerer vi det i databasen...
            if (!$user_row->user_active) {
                mysql_query("UPDATE musikal_users SET user_active = 1 WHERE user_email = '$login_email'") or die(mysql_error());
                mysql_query("UPDATE musikal_users SET user_activated = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
                echo "<script language=\"javascript\" type=\"text/javascript\">alert('Dette er første gang du logger på MusiKal. Dit abonnement startes nu.');</script>";
               
                # ...og vi ændrer lastonline-beskeden så vi undgår nogle dumme beskeder
                $head_message = 'Hej ' . $_SESSION['name'] . '! Dette er første gang du logger på. [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
                $kill_head = true;
            };
           
            # Vi retter logintidspunkt i databasen
            mysql_query("UPDATE musikal_users SET user_lastonline = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
        };           
       
        # Hvis email og kode ikke passer sammen, så sender vi brugeren tilbage med besked om at ændre fejlen
        if ($user_row_count == 0) {
            echo "<script language=\"javascript\" type=\"text/javascript\">alert('Fejl i email og/eller adgangskode. Ret fejlen og prøv igen!');</script>";
        };
    };
};   

# Hvis brugeren er logget ind eller bliver det vha. ovenstående skal vi skabe adgang til de hemmelige ting
if($login) {

    # Vi skal lige have styr på tidspunktet og lavet velkomstbeskeden
    if (!$kill_head) {
        $datefromdb = $_SESSION['lastonline'];
        $year = substr($datefromdb,0,4);
        $mon  = substr($datefromdb,4,2);
        $day  = substr($datefromdb,6,2);
        $hour = substr($datefromdb,8,2);
        $min  = substr($datefromdb,10,2);
        $sec  = substr($datefromdb,12,2);
        $orgdate = date("j/n-Y, \k\l. H:i.s ",mktime($hour,$min,$sec,$mon,$day,$year));
        $head_message = 'Hej ' . $_SESSION['name'] . '! Du var sidst online d. ' . $orgdate . ' [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
    };
};
close_db();       
?>
------------------------------------
Avatar billede damholdt Nybegynder
12. februar 2006 - 23:20 #21
Tak for forsøget :o)
Avatar billede nielle Nybegynder
13. februar 2006 - 08:44 #22
Prøv denne version:

<?php
require 'db.inc.php';
open_db();
$head_message = "Du er ikke logget ind i øjeblikket. Benyt loginboksen herunder hvis du vil logge ind.";
session_start();

# Allerførst finder vi ud af om brugeren allerede er logget på
if (isset($_SESSION['email']))
{
    $login = true;
}
else
{
    $login = false;
};

# Ønsker brugeren af logge ud, så skal dette naturligvis ske som det første
if ($login && $_GET['logout'])
{
    unset($_SESSION['email'], $_SESSION['password'], $_SESSION['name'], $_SESSION['lastonline'], $_SESSION['id']);
    $login = false;
};

# Hvis ikke brugeren er logget ind undersøger vi om loginboksen er udfyldt
if (!$login)
{
    if (isset($_POST['login_email'], $_POST['login_password']))
    {
        # Vi starter sessions og hiver variablerne ud af formen...
        $login_email = $_POST['login_email'];
        $login_password = md5($_POST['login_password']);
       
        # ...og kontrollerer om brugeren eksisterer i databasen
        $login_result = mysql_query("SELECT * FROM musikal_users WHERE user_email = '$login_email' AND user_password = '$login_password'") or die(mysql_error());
        $user_row_count = mysql_num_rows($login_result);
        $user_row = mysql_fetch_object($login_result) or die(mysql_error());
        if ($user_row_count == 1)
        {
            # Yes yes. Brugeren er god nok! Så logger vi ind og sætter sessions
            $login = true;   
            $_SESSION['email'] = $login_email;
            $_SESSION['password'] = $login_password;
            $_SESSION['name'] = $user_row->user_firstname . ' ' . $user_row->user_surname;
            $_SESSION['lastonline'] = $user_row->user_lastonline;
            $_SESSION['id'] = $user_row->user_id;
           
            # Hvis det er første gang brugeren logger på registrerer vi det i databasen...
            if (!$user_row->user_active)
            {
                mysql_query("UPDATE musikal_users SET user_active = 1 WHERE user_email = '$login_email'") or die(mysql_error());
                mysql_query("UPDATE musikal_users SET user_activated = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
                echo "<script language=\"javascript\" type=\"text/javascript\">alert('Dette er første gang du logger på MusiKal. Dit abonnement startes nu.');</script>";
               
                # ...og vi ændrer lastonline-beskeden så vi undgår nogle dumme beskeder
                $head_message = 'Hej ' . $_SESSION['name'] . '! Dette er første gang du logger på. [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
                $kill_head = true;
            };
           
            # Vi retter logintidspunkt i databasen
            mysql_query("UPDATE musikal_users SET user_lastonline = NOW() WHERE user_email = '$login_email'") or die(mysql_error());
        }
        else
        {
            # Hvis email og kode ikke passer sammen, så sender vi brugeren tilbage med besked om at ændre fejlen
            echo "<script language=\"javascript\" type=\"text/javascript\">alert('Fejl i email og/eller adgangskode. Ret fejlen og prøv igen!');</script>";
        };
    };
};   

# Hvis brugeren er logget ind eller bliver det vha. ovenstående skal vi skabe adgang til de hemmelige ting
if ($login)
{
    # Vi skal lige have styr på tidspunktet og lavet velkomstbeskeden
    if (!$kill_head)
    {
        $datefromdb = $_SESSION['lastonline'];
        $year = substr($datefromdb, 0, 4);
        $mon  = substr($datefromdb, 4, 2);
        $day  = substr($datefromdb, 6, 2);
        $hour = substr($datefromdb, 8, 2);
        $min  = substr($datefromdb, 10, 2);
        $sec  = substr($datefromdb, 12, 2);
        $orgdate = date("j/n-Y, \k\l. H:i.s", mktime($hour, $min, $sec, $mon, $day, $year));
        $head_message = 'Hej ' . $_SESSION['name'] . '! Du var sidst online d. ' . $orgdate . ' [<a href="' . $PHP_SELF . '?logout=1" class="logout">log ud</a>]';
    };
};
close_db();       
?>
Avatar billede damholdt Nybegynder
13. februar 2006 - 09:30 #23
Hmm. Hvad har du ændret... Skifter det ud efter morgenmaden.
Avatar billede damholdt Nybegynder
13. februar 2006 - 10:58 #24
Gjorde ingen forskel...
Avatar billede damholdt Nybegynder
13. februar 2006 - 11:11 #25
Trin for trin ved at udelukke har jeg fundet ud af at fejlen ligger i kodestumpen der hiver brugeren ud af databasen, altså:
----------------------------------------------------------
# ...og kontrollerer om brugeren eksisterer i databasen
$login_result = mysql_query("SELECT * FROM musikal_users WHERE user_email = $login_email' AND user_password = '$login_password'") or die(mysql_error());
$user_row = mysql_fetch_object($login_result) or die(mysql_error());
$user_row_count = mysql_num_rows($login_result) or die(mysql_error());
----------------------------------------------------------
Hvad kan fejlen være?
Avatar billede damholdt Nybegynder
13. februar 2006 - 11:12 #26
Ups... der forsvandt lige en ' før $login_email under kopieringen.
Avatar billede nielle Nybegynder
13. februar 2006 - 12:47 #27
1) Du kan prøve at udskrive dine SQL-sætninger før at de udføres - måske indeholder de bare ikke det du forventede:

$sql = "SELECT * FROM musikal_users WHERE user_email = '$login_email' AND user_password = '$login_password'";
echo "DEBUG: " . $sql . "<br>";
login_result = mysql_query() or die(mysql_error());

1b) Prøv også at afskyde den udskrevne SELECT direkte imod databasen via phpmyadmin og se hvad der kommer ud af det.

2) Prøv at lægge din kode om til at bruge mysql_fetch_assoc() i stedet for mysql_fetch_object(). I min mening giver det ofte kode som er nemmere at læse, og dermed også nemmere at gennemskue for mulige fejl, samt at vedligeholde.
Avatar billede damholdt Nybegynder
13. februar 2006 - 15:16 #28
Så lykkedes det - vha. en stor kodeomlægning og brug af mysql_fetch_assoc() ville skidtet som jeg ville. Laver du ikke lige et svar så jeg kan give dig pointene?

Tak for hjælpen!
Avatar billede nielle Nybegynder
13. februar 2006 - 18:08 #29
Svar :^)
Avatar billede nielle Nybegynder
13. februar 2006 - 18:08 #30
... doh ...
Avatar billede damholdt Nybegynder
15. februar 2006 - 15:09 #31
Jamen værsgo' og tak for hjælpen!
Avatar billede nielle Nybegynder
15. februar 2006 - 17:11 #32
Takker for point :^)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester