Avatar billede smolle Nybegynder
31. marts 2006 - 15:29 Der er 26 kommentarer og
1 løsning

Spørgsmål til artikel om loginsystem

Jeg har prøvet at sætte et simpelt login-system op efter artiklen her på siden kaldet "Loginsystem med PHP4, klasser, sessions og MySQL database". Jeg har dog lidt problemer.
For at teste om man er logget ind bruger jeg det stykke kode der står i artiklen. Det vil serveren dog ikke godtage. Først får jeg en fejl om, at der er et uventet ; i linjen:

if($Login->CheckLogin($_SESSION['Username'], $_SESSION['Password']);

Det er vel for så vidt også rigtigt nok, da der jo ikke skal semikolon efter if-sætninger (fejl i artiklen?). Jeg sletter så semikolonnet og prøver igen, men nu siger den, at den følgende { er uventet, hvilket jeg ikke kan se meningen i! Der skal da bruges { og } til at beskrive hvad der skal gøres hvis if-sætningen er opfyldt?
Avatar billede hmortensen Nybegynder
31. marts 2006 - 15:33 #1
Der skal to ) til sidst:
if($Login->CheckLogin($_SESSION['Username'], $_SESSION['Password']))
{
  // Gør noget
}
Avatar billede smolle Nybegynder
31. marts 2006 - 15:48 #2
Ja, se det hjalp jo straks på det. Nu får jeg så bare følgende fejl i stedet:

Warning: session_start() [function.session-start]: Cannot send session cookie - headers already sent by (output started at /web/www/frac/users/omegacommunity/test.php:14) in /web/www/frac/users/omegacommunity/login.php on line 2

Warning: session_start() [function.session-start]: Cannot send session cache limiter - headers already sent (output started at /web/www/frac/users/omegacommunity/test.php:14) in /web/www/frac/users/omegacommunity/login.php on line 2

Og ja, den kommer to gange.
Avatar billede hmortensen Nybegynder
31. marts 2006 - 16:14 #3
Du må ikke have noget udskrift før kaldet til session_start();

Fejlen fortæller at du udskriver noget på linie 14 i test.php
Avatar billede smolle Nybegynder
31. marts 2006 - 16:34 #4
Okay. Det begynder at ligne noget :D Der er dog lige lidt problemer endnu. Hver gang jeg går ind på en side hvor den skal kontrollere brugernavn og adgangskode kommer den med beskeden om, at de indtastede oplysninger ikke passer sammen. Jeg har oprettet en enkelt bruger i Users tabellen, men selvom jeg prøver at logge ind med den bruger får jeg stadig den oplysning.
Kunne selvfølgelig fjerne den echo der udskriver fejlmeddelelsen, men det er jo ikke meningen, plus at man jo tilsyneladende stadig ikke er logget ind.
Avatar billede hmortensen Nybegynder
31. marts 2006 - 17:13 #5
Har du skrevet dit kodeord i cleartext eller som md5 hashet værdi ?
Avatar billede smolle Nybegynder
31. marts 2006 - 17:17 #6
Øhh... Der må du nok lige hjælpe mig der. Altså, jeg har bare fulgt artiklen jeg omtalte før, til punkt og prikke. Ved ikke hvad det betyder for passwordet.
Avatar billede hmortensen Nybegynder
01. april 2006 - 09:37 #7
Hvordan har du indsat din brugere i databasen ?
Avatar billede smolle Nybegynder
01. april 2006 - 09:54 #8
Jeg gik bare ind via phpmyadmin, valgte min tabel og sagde indsæt og så intastede jeg et brugernavn og et password i de dertil egnede felter.
Avatar billede hmortensen Nybegynder
01. april 2006 - 15:01 #9
Ok, kodeordet skal md5 hashes, da dit script laver en sammenligning med det indtastede som md5 hash.

Du kan køre den her update i phpmyadmin, og så burde det virke.

UPDATE tabel SET kodeord = MD5(kodeord)
Avatar billede smolle Nybegynder
01. april 2006 - 15:15 #10
Okay. Nu kan den da i hvert fald skille mellem hvad der er rigtigt og forkert indtastet, men det er irriterende, at den fortæller at man har indtastet forkert brugernavn og adgangskode hver gang man går ind på en side. Hvis man indtaster det korrekte brugernavn og adgangskode, så får man desuden denne fejl:

Warning: Cannot modify header information - headers already sent by (output started at /web/www/frac/users/omegacommunity/members.php:14) in /web/www/frac/users/omegacommunity/login.php on line 72

På linje 72 prøver den at kalde en header der ser således ud:

header("location: /");

Hvad skal man da skrive i den location?
Avatar billede hmortensen Nybegynder
01. april 2006 - 15:59 #11
Header kaldet er rigtigt nok, det er fordi du har output i linie 14 i members.php
Avatar billede smolle Nybegynder
01. april 2006 - 16:08 #12
Ja, okay. Den skriver det også på min index, men det eneste jeg kalder er en include, der inkluderer min menu! Kan man slet ikke kalde noget på den side hvor login-formen er?
Avatar billede hmortensen Nybegynder
01. april 2006 - 16:55 #13
Nu ved jeg ikke hvordan din side er bygget op, men det giver ingen mening at sende output til klienten, for derefter at videresende til en anden side.

Hvis du skiller dit design og data behandling ad, burde du ikke støde ind i problemet.
Avatar billede smolle Nybegynder
01. april 2006 - 17:04 #14
Min index fil ser således ud:

<?
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
    <title>Omega Community</title>
    <link rel="stylesheet" type="text/css" href="style.css">
    <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=iso-8859-1">
</head>

<body>

<table class="basic" align="center" valign="top" cellpadding="0" cellspacing="0">
    <tr>
        <td valign="top" align="center">
            <? include('menu.php'); ?>
            <br>
            <table align="center" valign="top">
                <tr>
                    <td valign="top">
                        <table class="index" align="left" valign="top">
                            <tr>
                                <td class="headline">&nbsp;Forsiden
                                </td>
                            </tr>
                            <tr>
                                <td class="main" valign="top">
                                    <table>
                                        <tr>
                                            <td class="main" valign="top" colspan="2">
                                            Her vil man kunne læse nyheder, der har reference til Omega.
                                            <br><br>
                                            </td>
                                        </tr>
                                        <tr>
                                            <td class="headline_small" valign="top">
                                            omegacommunity.frac.dk er åben!
                                            </td>
                                            <td class="headline_small" align="right" valign="top">
                                            01-04-06
                                            </td>
                                        </tr>
                                        <tr>
                                            <td class="news" valign="top" colspan="2">
                                            Så er domænet registreret og siden er åben. Indtil videre er der ikke meget indhold på siden, men det skal nok komme. I øjeblikket arbejder jeg meget på at få et loginsystem til at virke, sådan at medlemmer af Omega kan logge ind på siden og gøre brug af de service, der kommer til at være på siden.
                                            </td>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                        </table>
                    </td>
                    <? include('rightframe.php'); ?>
                </tr>
            </table>
        </td>
    </tr>
</table>

</body>
</html>

Så inkluderer jeg bare de to menu.php, login.php og rightframe.php. rightframe.php er den fil der indeholder login-formen og den ser således ud:

                    <td valign="top">
                        <table class="poll" align="left" valign="top">
                            <tr>
                                <td class="headline">&nbsp;Afstemning
                                </td>
                            </tr>
                            <tr>
                                <td class="main" valign="top">
                                    <table>
                                        <tr>
                                            <td class="main" valign="top">
                                            Her vil der blive afholdt afstemninger for communitiets medlemmer.<br><br>
                                            </td>
                                        </tr>
                                    </table>
                                </td>
                            </tr>
                            <tr>
                                <td class="headline">&nbsp;Login
                                </td>
                            </tr>
                            <tr>
                                <td class="main" valign="top">
                                    <?
                                    include('login.php');
                                    ?>
                                    <?
$Login = new Login;
if($Login->CheckLogin($_SESSION['Username'], $_SESSION['Password']))
    {
    echo "Du er logget ind.";
    }
else
    {
    echo "Du er ikke logget ind.";
    }
?>
                                </td>
                            </tr>
                        </table>
                    </td>

Du kan se siden på http://omegacommunity.frac.dk/index.php og hvis du vil prøve at logge ind er det brugernavn Test og password test.
Avatar billede hmortensen Nybegynder
01. april 2006 - 17:44 #15
login.php ville nok være mere interesant.

Den indeholder både formen og login logikken ?
Avatar billede smolle Nybegynder
01. april 2006 - 17:56 #16
login.php ligner som sagt ret meget den fra artiklen. Har bare sat session_start() i toppen af siderne i stedet for login.php. Og så har jeg selvfølgelig indsat mit brugernavn, password osv. til databasen, men du kan da godt få den alligevel. Here you go:

<?
class Login
    {
    var $Host = '***.***.***.*;
    var $Username = '***********';   
    var $Password = '***********';   
    var $Database = '***********';
   
    function Login()       
        {
        mysql_connect($this->Host, $this->Username, $this->Password) or die(mysql_error());
        mysql_select_db($this->Database) or die(mysql_error());
        }
       
        function ShowForm($Username = '')
            {
            return "
            <table>
                <tr>
                    <td class=\"main\" valign=\"top\">
                    <form name=\"LoginForm\" method=\"post\" action=\"\">
                    Brugernavn:
                    </td>
                </tr>
                <tr>
                    <td class=\"main\" valign=\"top\">
                    <input type=\"text\" name=\"Username\" value=\"". $Username ."\">
                    </td>
                </tr>
                <tr>
                    <td class=\"main\" valign=\"top\">
                    Kodeord:
                    </td>
                <tr>
                    <td class=\"main\" valign=\"top\">
                    <input type=\"password\" name=\"Password\">
                    <input type=\"submit\" name=\"Send\" value=\"Log ind\">
                    </form>
                    </td>
                </tr>
            </table>";       
            }
        function CheckLogin($Username, $Password)       
            {
            $Username = preg_replace("#[^a-zA-Z0-9-_\.]#", "", $Username);
            $Query = mysql_query("SELECT * FROM Users WHERE username='". $Username ."' AND password='". $Password ."'");
            $Row = mysql_fetch_object($Query);
           
            if(!empty($Row) && $Row->password == $Password && $Row->username == $Username)           
                {
                $_SESSION['Username'] = $Username;           
                $_SESSION['Password'] = $Password;
                return true;
                }
            else
                {
                echo "<script language=\"javascript\" type=\"text/javascript\">alert('Dine loginoplysninger passede ikke sammen.');</script>";
                return false;
                }
            }
        }
    ?>
    <?
    $Login = new Login;
   
    if(!isset($_SESSION['Username']))
        {
        $Password = md5($_POST['Password']);       
       
        if($Login->CheckLogin($_POST['Username'], $Password))
            {
            header("location: /");       
            }
        echo $Login->ShowForm($_POST['Username']);   
        }
    ?>
Avatar billede hmortensen Nybegynder
01. april 2006 - 18:09 #17
Jeg har ikke læst artiklen, men hvis den er opbygget sådan, synes jeg den er utrolig ringe lavet.

Ville nok vælge at skrive login scriptet om, og så skille design og data behandling ad.
Avatar billede smolle Nybegynder
01. april 2006 - 18:13 #18
Hmm... Okay. Jeg tror også at artiklen er bygget på, at login-scriptet ligger på en side for sig selv og at den så bare tjekker på alle andre sider. Jeg ville bare prøve at implementere login-formen på siden, sådan som du kan se... Men hvis ikke det kan implementeres på en given side, er det jo ikke meget værd. Kunne man ikke lave noget med en javascipt-popup, hvor loginformularen så var i, som når man havde indtastet brugernavn og password opdaterede siden bagved? Så ville man jo kunne have login.php liggende helt for sig selv og så bare åbne den med javascript i et popupvindue. Håber du forstår ;)
Avatar billede Slettet bruger
01. april 2006 - 21:40 #19
hmortensen: design og databehandling _er_ adskilt i artiklen.
Avatar billede Slettet bruger
01. april 2006 - 21:45 #20
Og jeg vil meget gerne have uddybet din kommentar i artiklen, da jeg finder den, omend ikke vag, ukorrekt.
Avatar billede hmortensen Nybegynder
01. april 2006 - 21:52 #21
Der er HTML i både ShowForm og CheckLogin metoden. Så forsvinder OO'en lidt.
Avatar billede Slettet bruger
01. april 2006 - 22:05 #22
Der bliver ingen steder nævnt, at systemet indeholder objekt orienteret php.
Avatar billede Slettet bruger
01. april 2006 - 22:05 #23
- Hvorfor jeg bestemt mener, at dit grundlag for en så ekstremt negativ vurdering bortfalder.
Avatar billede smolle Nybegynder
01. april 2006 - 22:43 #24
Rolig nu gutter :P Kan i give mig et svar på, om jeg overhovedet på nogen måde kan bruge systemet på min side eller skal jeg forsøge mig på en helt anden måde? Evt. et link til en tutorial der viser det step-by-step.
Avatar billede Slettet bruger
01. april 2006 - 23:16 #25
hmortensen: mine kommentarer her er udelukkende tilrettet dine kommentarer til artiklen, og skal på ingen måde tolkes som kritik af din person, da jeg intet har imod dig, men tværtimod beundrer din indsats herinde på eksperten.
Avatar billede Slettet bruger
01. april 2006 - 23:16 #26
.. Det var ikke et svar.
Avatar billede smolle Nybegynder
13. december 2006 - 11:11 #27
Jeg tager pointene tilbage i mangel på svar...
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

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