Avatar billede cool_casper Nybegynder
02. januar 2005 - 21:52 Der er 15 kommentarer og
1 løsning

Sessions bliver ikke registreret

Jeg har lidt problemer med mit login-system. Jeg bruger PHP sessions til at registrere info om den bruger der er logget ind, men den bliver ved med at sige jeg ikke er logget ind. Det virker på min egen server på Windows XP lokalt, men når jeg lægger det på en ekstern server så virker det ikke.

http://www.visitme.dk/symaskinehuset/admin.php
Brugernavn: casper
Password: casper

Jeg har lavet login-tjekket lidt om så den ikke viderestiller, men i stedet for udskriver at den ikke er logget ind. :o)

De login-funktioner jeg har lavet og bruger ser sådanne ud:
<?
function check_admin()
{
    if (!logged_in())
    {
        //redirect('?');
        echo 'ER IKKE LOGGET IND!';
    }
}

function logged_in()
{
    if (isset($_SESSION['smh_username']) AND isset($_SESSION['smh_password']) AND isset($_SESSION['smh_last_login']))
    {
        return true;
    }else{
        return false;
    }
}

function do_login($user_id)
{
    if ($user_id == '') return false;
    $query = "SELECT a.username, a.last_login, a.password, UNIX_TIMESTAMP(a.last_login) last_login FROM admin a WHERE a.id = " . $user_id;
    $result = db_query($query);
    $user = mysql_fetch_array($result);
    $_SESSION['smh_username'] =         $user['username'];
    $_SESSION['smh_password'] =         $user['password'];
    $_SESSION['smh_last_login'] =         $user['last_login'];
    mysql_query(db_query("UPDATE admin SET last_login = NOW() WHERE id = " . $user_id));
}

function do_logout()
{
    unset($_SESSION['smh_user']);
    unset($_SESSION['smh_password']);
    unset($_SESSION['smh_last_login']);
}
?>
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 21:59 #1
Prøv en
<? session_start(); ?>
allerøverst i dit script.
Avatar billede cool_casper Nybegynder
02. januar 2005 - 22:03 #2
Den har jeg med. Det jeg har inkluderet er bare mine admin-funktioner og dermed bare en lille del af sitet. :o)
Så den skulle være i orden, men er det noget galt med den måde jeg gemmer mine variabler i sessions siden de ikke bliver gemt? Alle de tre sessions jeg prøver at gemme er tomme når jeg når til admin.php?mode=admin
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 22:12 #3
Det har du også kan jeg se - jeg havde slået cookies fra på visitme.dk. Den kommer
i hvert fald på første side.

Det kan være noget med hvordan du behandler data fra din <form>
Avatar billede cool_casper Nybegynder
02. januar 2005 - 22:26 #4
Hmm.. Ja, det kan godt være. Men hvad gør jeg forkert? :o)
Jeg tror jeg har stirret mig blind på en evt. fejl fra min side..
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 22:37 #5
Jeg kan ikke se hele din kode. Men jeg kan da se at du laver sjove ting med dine sessions.
Det er fuldt tilstrækkeligt at opbevare en $_SESSION['loggetind']='jaja' som indikation
på man er logget ind, og slet ikke nødvendigt, og en smule usikkert, at opbevare
passwords i din sessions-variabler.

Så ja, der er nok noget galt ;)
Avatar billede cool_casper Nybegynder
02. januar 2005 - 22:47 #6
Okay, det skal jeg huske. Jeg har fjernet password-sessionen.

Jeg tror ikke den får gemt mine data i sessionen, er der andre måder at gemme sessions på som jeg kan lege med?
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 23:04 #7
Jeg tror ikke det er den eneste kode du har ;) Skal vi ikke bare kigge på hvordan du håndterer de data der kommer fra din <form> ?
Avatar billede cool_casper Nybegynder
02. januar 2005 - 23:13 #8
hehe, nej.. Jeg er ved at rive håret af mig selv snart - har sgu kæmpet med denne fejl i alt for lang tid nu! :o)

admin.php:

<?
$page_title = 'Adminstration';
include('includes/top.php');

$mode = get('mode');
$sec = get('sec');
$id = get('id');
$page = get('page',1);
$pr_page = 10;
$count = 0;

switch ($mode)
{
case 'admin':
    check_admin();
   
    if ($sec == 'savecreate')
    {
        $name = post('name');
        $text = post('text');
       
        if ($name != '' AND $text != '')
        {
            mysql_query(db_query("INSERT INTO news (name,text,date) VALUES('" . $name . "','" . $text . "',NOW())"));
            redirect('?mode=admin&sec=created');
        }
    }else if ($sec == 'saveedit')
    {
       
    }else if ($sec == 'delconfirm')
    {
       
    }
   
    if ($sec == 'create')
    {
        ?>
        <strong>Opret nyhed</strong>
        <form action="?mode=admin&sec=savecreate" method="post">
        <table border="0" style="width: 100%;">
        <tr>
            <td>Overskrift</td>
            <td><input type="text" name="name"></td>
        </tr>
        <tr>
            <td style="vertical-align:top;">Tekst</td>
            <td><textarea name="text" cols="40" rows="5"></textarea></td>
        </tr>
        <tr>
            <td></td>
            <td><?=submit('Gem!');?></td>
        </tr>
        </table>
        </form>
       
        <?
    }else if ($sec == 'edit')
    {
   
    }else if ($sec == 'del')
    {
   
    }else{
        ?>
       
        <table border="0" style="width:100%; ">
        <tr>
            <?
            if ($sec == 'created')
            {
            ?>
            <td style="width:70%;" class="green">
                Din nyhed er nu oprettet!
            </td>
            <?
            }else{
            ?>
            <td style="width:70%;">
                Du er nu logget ind. Herfra kan du oprette, redigere eller slette nyheder p&aring; sitet.
            </td>
            <?
            }
            ?>
            <td style="width:30%;">
                <table border="0" style="width:100%; border: 1px solid silver;" class="footer">
                <tr>
                    <td>Brugernavn:</td>
                    <td><?=ucfirst($_SESSION['smh_username'])?></td>
                </tr>
                <tr>
                    <td>Password:</td>
                    <td>******</td>
                </tr>
                <tr>
                    <td>Sidste&nbsp;login:</td>
                    <td style=""><?=danish_date('d-m-Y',$_SESSION['smh_last_login'])?></td>
                </tr>
                </table>
            </td>
        </tr>
        </table>
        <br />
        <br />
        <table border="0" style="width:100%; " cellspacing="0" cellpadding="5">
        <tr>
            <td colspan="3" style="text-align:center; "><a href="?mode=admin&sec=create">Opret nyhed</a></td>
        </tr>
       
    <?
    $query_strip = "SELECT n.id, n.name, UNIX_TIMESTAMP(n.date) date_raw, DATE_FORMAT(n.date, '%d-%m-%Y') date FROM news n ORDER BY n.date DESC";
    $query = $query_strip . " LIMIT " . ($pr_page*($page-1)) . ',' . $pr_page;
    $result = db_query($query);
    $num_rows = mysql_num_rows(db_query($query_strip));
    $pages_total = ceil(divide($num_rows,$pr_page));
    if ($page > $pages_total) redirect('?');
    echo '
    <tr>
        <td colspan="3" align="center" class="small">Side ' . $page . ' af ' . $pages_total . '<br /><br /></td>
    </tr>
    <tr>
            <td width="25%" class="table_header">Dato</td>
            <td width="50%" class="table_header">Navn</td>
            <td width="25%" class="table_header"></td>
    </tr>
    ';
    while ($news = mysql_fetch_array($result)){
        $news_id =             $news['id'];
        $news_name =         $news['name'];
        $news_date_long =     ucfirst(danish_date('l \d. j. F Y \k\l. H:i',$news['date_raw']));
        $news_date =         $news['date'];
       
        echo '
    <tr onclick="gotourl(\'?mode=admin&sec=edit&id=' . $news_id . '\');" onmouseover="colorIN2(this);" onmouseout="colorOUT2(this);">
        <td><a title="' . $news_date_long . '" class="none">' . $news_date . '</a></td>
        <td>' . $news_name . '</td>
        <td><a href="nyheder.php?id=' . $news_id . '">Vis</a>
        &nbsp;
        <a href="?mode=admin&sec=del&id=' . $news_id . '">Slet</a></td>';
        echo '
    </tr>
    ';
    $count++;
    }
   
    echo '
    <tr>
        <td colspan="8" align="center" class="small">';
        if ($page != 1){
            echo '<a href="?mode=admin&page=' . ($page-1) . '">&lt;&lt; Forrige</a>';
        }else{
            echo '<span class="gray">&lt;&lt; Forrige</span>';
        }
        echo '<img src="images/spacer.gif" width="15" height="1" alt="" />';
        for ($i = 1; $i <= $pages_total; $i++)
        {
            if ($page == $i)
            {
                echo ' ' . $i;
            }else{
                echo ' <a href="?mode=admin&page=' . $i . '">' . $i . '</a>';
            }
        }
        echo '<img src="images/spacer.gif" width="15" height="1" alt="" />';
        if ($num_rows > ($count+($pr_page*($page-1)))){
            echo '<a href="?mode=admin&page=' . ($page+1) . '">N&aelig;ste &gt;&gt;</a>';
        }else{
            echo '<span class="gray">N&aelig;ste &gt;&gt;</span>';
        }
        echo '</td>';
    echo '
    </tr>
    ';
        ?>
        <tr>
            <td colspan="3" style="text-align:center; "><a href="?mode=logout">Log ud</a></td>
        </tr>
        </table>
        <?
    }
    break;
case 'login':
    $username = post('username');
    $password = post('password');
   
    if ($username == '' OR $password == '') redirect('?mode=fejl');
   
    $result = db_query("SELECT a.id FROM admin a WHERE a.username = '" . $username . "' AND a.password = '" . $password . "'");
    if (!$admin = mysql_fetch_array($result))
    {
        redirect('?mode=fejl');
    }else{
        do_login($admin['id']);
        redirect('?mode=admin');
    }       
    break;
   
default:
    ?>
   
    <form action="?mode=login" method="post">
    <table border="0" style="width:50%;">
    <tr>
        <td>Brugernavn</td>
        <td><input type="text" name="username" id="username" size="20" /></td>
    </tr>
    <tr>
        <td>Password</td>
        <td><input type="password" name="password" size="20" /></td>
    </tr>
    <tr>
        <td></td>
        <td><?=submit('Login!')?></td>
    </tr>
    <?
    if ($mode == 'fejl')
    {
        echo '
        <tr>
            <td class="red" colspan="2">Ugyldig login!<br /><br /></td>
        </tr>
        ';
    }
    else if ($mode == 'logout')
    {
    do_logout();
        echo '
        <tr>
            <td class="red" colspan="2">Du er nu logget ud!<br /><br /></td>
        </tr>
        ';
    }
    ?>
    </table>
    </form>
    <script type="text/javascript">
    window.onload=document.getElementById('username').focus();
    </script>
    <?
    break;
}
?>


<?
include('includes/bottom.php');
?>
Avatar billede erikjacobsen Ekspert
02. januar 2005 - 23:26 #9
Hvis dine post() og get() metoder ellers er lavet som man skulle forvente, kan jeg ikke
se problemer i det umiddelbart (ud over det jeg har anført).

Hvilken version af PHP kører du med, der hvor det giver problemer?
Avatar billede cool_casper Nybegynder
02. januar 2005 - 23:41 #10
function get($name, $value = '')
{
    return isset($_GET[$name]) ? $_GET[$name] : $value;
}

function post($name, $value = '')
{
    $nameval = isset($_POST[$name]) ? $_POST[$name] : $value;
    return addslashes($nameval);
}


http://visitme.dk/phpinfo.php
Avatar billede erikjacobsen Ekspert
03. januar 2005 - 00:00 #11
Ja, ok, som forventet. 4.1.2 er lidt mølædt, men burde være ok her. $_SESSION kom i 4.1.0.
Men der har været en lang række sikkerhedsopdateringer siden, så en opgradering
kan meget varmt anbefales!!

Men jeg kan lige nu ikke se hvad der skal til for at løse problemet. Prøv at
sætte en masse testudskrifter ind for at se hvor den kommer hen, og hvad
variabler indeholder.
Avatar billede erikjacobsen Ekspert
03. januar 2005 - 00:04 #12
Øhm, du er hosted hos cliche på en Windows platform med den version af PHP?
Det er en ret dårlig kombination alt i alt (ikke cliche i sig selv...*g*).
Jeg tror jeg opgiver fremtidig hjælp. Prøv at oprette en konto hos fx www.1go.dk
og prøv det der.
Avatar billede cool_casper Nybegynder
04. januar 2005 - 00:13 #13
Jeps, Cliche er ikke ligefrem det allerbedste har jeg erfaret. :S

Jeg har prøvet at skrive lidt variabler ud. Og dataerne fra login-formen kommer fint ind og den henter også de rigtige data. Men de bliver ikke gemt. Hvis jeg på admin.php sætter "$_SESSION['smh_username'] = 'test';" ind så virker det fint. Dvs. at hvis jeg gemmer min session på den samme side virker det. Men hvis jeg så skifter til en anden side og prøve at hente noget fra den session jeg lige har gemt så er strengen tom!
Er det fordi det er Windows Platform eller hvordan?
Avatar billede cool_casper Nybegynder
04. januar 2005 - 00:40 #14
Det virker på http://grunki.1go.dk.. Der må være noget galt med Cliche. Lorte-webhotel!!
Avatar billede erikjacobsen Ekspert
04. januar 2005 - 09:21 #15
Nu har cliche vist igennem længere tid forsøgt at få deres kunder væk fra PHP på
Windows. Det var blot noget de startede med fra første færd, og blev klogere.
Så hvis du hopper over på deres PHP løsning på (vistnok) Linux, så skulle det såmænd nok trille igen.
Avatar billede cool_casper Nybegynder
04. maj 2005 - 19:59 #16
lukketid
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