Avatar billede carlos123 Nybegynder
15. december 2003 - 23:54 Der er 43 kommentarer og
2 løsninger

Glemmer sessions imellem forskellig sider

Hej alle
Ok,jeg er ved at være syg oven i bolden, mit problem er:
Jeg har en index side, som indeholder nogle tabeller som igen indeholder nogle php sider.
en af disse tabeller henter indhold fra en loginform hvor jeg sætter nogle sessions variabler, og det virker sådan set fint nok, men når jeg så skal have indlæst en ny side i en af de andre tabeller glemmer vises login siden igen, altså som om at de session variabler ikke er gemt rigtig: her er lidt kode hvis der er nogen af jer der kan gennemskue den

Index.php

<?php
    session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type"    content="text/html; charset=iso-8859-1"    />
        <meta http-equiv="Content-Language" content="da" />
        <meta name="KeyWords" content="x" />
        <meta name="Description" content="x" />
        <title></title>

        <!-- stylesheet    start-->
        <link rel="stylesheet" href="styles2.css" type="text/css"/>
        <!-- stylesheet    start-->
   
       
       
        </head>
    <body >
        <table width="100%" cellspacing="0" cellpadding="0" >
            <tr>
               
                <td align="center">
               
               
               
               
                    <table cellpadding="0" cellspacing="0" width="760"  border="0" >
                        <colgroup>
                            <col width="510" />
                            <col width="125" />
                        </colgroup>

                        <!-- Top start -->
                        <tr >
                            <td colspan="2"    id="topcolor">
                                <img src="img/header.gif" width="760" alt = "header.gif" />
                            </td>
                        </tr>

                        <!-- Top end -->
                        <tr>
                            <td colspan="2"    class="menu" align="center">
                                <a href="index.php" class="vlink">Startside</a>
                                <a href="?page=contacts.php" class="vlink">Kontakt os</a>
                                <a href="?page=news.php" class="vlink">Nyheder</a>
                                <a href="?page=links.php" class="vlink">Links</a>
                                <a href="?page=foredrag.php" class="vlink">Foredrag</a>
                                <a href="?page=admin.php" class="vlink">Admin</a>
                                <a href="?page=personal.php" class="vlink">Mine foredrag</a>
                            </td>
                        </tr>

                        <!-- Main start    -->
                        <tr>
                            <td valign="top" >
                            <div class="test"> <!--test madsen -->         
                                <table width="100%" height="600" cellspacing="0" cellpadding="5"
                                style="border-color=silver; height=700px;" class="StdColor" border="1" >
                                    <tr >
                                        <td valign="top" align="left">
           
                                            <?php
                                                if(file_exists($_GET[page]))
                                                    include($_GET[page]);
                                                else
                                                    include('news.php');
                                            ?>
                                        </td>
                                    </tr>
                                </table>
                                </div>
                            </td>

                            <!-- Main end -->
                            <td valign="top">
                               
                                <table width="100%" height="600"  cellspacing="0"
                                cellpadding="5"    class="StdColor" border    = "1" style="border-color=silver;">
                                    <tr>
                                        <td align="left" valign="top" >
                                            <?php
                                                include('logintest.php');
                                            ?>
                                        </td>
                                    </tr>

                                    <tr>
                                        <td align="left" valign    = "top"    >
                                            <strong>Nyheder:</strong>
                                            <br />
                                            <?php
                                                // print news
                                                include('news.php');

                                                // write counter                                               
                                                $visitors = counter_query();
                                                echo "visitors:    $visitors";

                                            ?>
                                            <!--<p>
                                          <a href="http://validator.w3.org/check/referer"><img
                                              src="http://www.w3.org/Icons/valid-xhtml10"
                                          alt="Valid XHTML 1.0!" height="31" width="88"    /></a>
                                        </p>-->
   
                                        </td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </table>
                <!--</div>-->
                </td>
           
           
            </tr>
        </table>
    </body>   
</html>


logintest.php
<?php
session_start();

if ($userid && $password)
{
    $db_conn = mysql_connect("localhost","dummy","dummyuser");
    mysql_select_db("www", $db_conn);
    $query = "SELECT * FROM users WHERE username = '$userid' and password = '$password'";
    $result= mysql_query($query, $db_conn);
    if (mysql_num_rows($result)>0)
    {
        $_SESSION["valid_user"]=$userid;
    }
}
?>
<html>
<body>
<?
    if (isset($_SESSION["valid_user"]))
    {
        echo "Du er loggede ind som: $valid_user <br>";
        echo "<a href=\"logout.php\">Log ud<a/><br>";
    }
    else
    {
        if (isset($userid))
        {
            echo "Kunne ikke logge dig ind";
        }
        else
        {
            echo "Du er ikke loggede ind.<br>";
        }
        ?>
        <form method="post" action="<?php echo $php_self ?>">
        <input type="text" name="userid"><br />
        <input type="password" name="password"><br />
        <input type="submit" value="login"><br />
        </form>
        <?php
    }
?>
</body>
</html>

Dette bliver kørt på en Windows Xp maskine med PHP 4.3.4

Håber der en eller flere der kan hjælpe mig :-)

mvh Carl
Avatar billede googolplex Novice
16. december 2003 - 00:08 #1
Både din index-side og din logintest indeholder session_start(), jeg ved ikke om det har nogen betydning, men jeg kan ikke lige se fejlen...
Avatar billede googolplex Novice
16. december 2003 - 00:09 #2
Du kører ikke med register_globals = off ??
Avatar billede erikjacobsen Ekspert
16. december 2003 - 00:13 #3
Du blander ikke links med www.domæne.dom og domæne.dom ??
Avatar billede Slettet bruger
16. december 2003 - 00:16 #4
Jeg kunne ikke lige finde fejlen, men vil lige advare dig om denne konstruktion:

if(file_exists($_GET[page]))
include($_GET[page]);
else
include('news.php');

Det er meget farligt at lave det på denne måde. Du kan jo ikke være sikker på, at brugeren ikke har skrevet http://dinserver/index.php?page=c:/Dokumenter/hemmeligtekst.txt i adresselinien.

Husk, at du kan aldrig stole på data, der kommer fra nettet.
Avatar billede carlos123 Nybegynder
16. december 2003 - 00:19 #5
register_globals er on, og resultatet er det samme selvom jeg fjerner session_start() i logintest.php
Avatar billede carlos123 Nybegynder
16. december 2003 - 00:20 #6
sandbox hvad kunne du anbefale i stedet for?

mvh Carl
Avatar billede googolplex Novice
16. december 2003 - 00:26 #7
Du kan evt. gemme dine sider i et array og så tjekke om $_GET['side'] findes i dit array;

$godkendte = array('nyheder', 'links', 'foredrag', 'osv');

if (in_array($_GET['side'], $godkendte))
{
  $side = $_GET['side'];
}
else
{
  $side = 'forside';
}
Avatar billede googolplex Novice
16. december 2003 - 00:29 #8
Jeg ville desuden sætte register_globals = off, du kan rodde dig ud i en masse ubehageligheder hvis den er sat til on!.
Avatar billede Slettet bruger
16. december 2003 - 00:33 #9
lav et array:

$sider['contacts.php']='contacts.php';
$sider['news.php']='news.php';
$sider['links.php']='links.php';
og så videre...

Der, hvor du skal indkludere den, gør du således:

if(isset($sider[$_GET['page']]))
include($sider[$_GET['page']]);
else
include('news.php');


Så kunne du for eksempel nøjes med at have $sider['contacts'] i stedet for $sider['contacts.php'], og bare sige page=contacts i linket.

Dette er bare en måde at gøre det på. Der findes mange andre. Denne er bare den, der kræver færrest arbejde at indføre i dit nuværende system.
Avatar billede Slettet bruger
16. december 2003 - 00:37 #10
Og jeg kan se, at googolplex har foreslået noget i samme stil.
Avatar billede googolplex Novice
16. december 2003 - 00:41 #11
sandbox: Hvilken måde er egentlig bedst at tjekke om noget findes i et array, min eller din ? Har nemlig ikke set din før, den ser fiks ud :P
Avatar billede carlos123 Nybegynder
16. december 2003 - 00:50 #12
i php.ini filen er der noget specielt der skal sættes der f.eks session.use_tran_sid eller har det ikke nogen betydning her?

Tusind tak googolplex og sandbox for at på pege den kæmpe fejl i midt design, ja og løse den selvfølgelig.
Avatar billede Slettet bruger
16. december 2003 - 00:50 #13
Min tjekker for eksistensen af et specifikt element, hvorimod dit gennemser hele arrayet. Med så små arrays vi arbejder med her, tvivler jeg på at forskellen er mærkbar.

Ved store arrays vil min nok kræve mere RAM, da der er både nøgler og indhold, der fylder. Din vil til gengæld kræve mere CPU, da den jo skal se hele listen igennem.
Avatar billede Slettet bruger
16. december 2003 - 00:58 #14
carlos123: Jeg har ikke session.use_tran_sid slået til. Det er kun nødvendigt, hvis brugeren har cookies slået fra og man ikke selv skriver et sessionID på de relevante links. Jeg kræver at brugerne har tillader cookies.


googolplex: En mere væsentlig forskel er, at med min metode kan teksten i linket være forskellig fra filnavnet.

Hvis $sider['buh']='contacts.php'; så kan index.php?page=buh skaffe contacts-siden.
Avatar billede carlos123 Nybegynder
16. december 2003 - 01:20 #15
Min logintest.php side virker ikke hvis jeg slå register_globals off hvis det altså har nogen betydning :-)
Avatar billede googolplex Novice
16. december 2003 - 01:32 #16
carlos123: Nej, men det er nemt at løse og alternativet er værre!!

Hvis du sætter register_globals off, skal du bare 'hente' dine variabler således inden du kan bruge dem:

$fornavn = $_POST['fornavn'];
$page = $_GET['page'];

Alternavtivet er, folk fx kan sende følgende:

www.domaene.dk/dinside.php?logget_ind=true

Så har du pludselig en variabel der hedder $logget_ind = true på din side...så må vi håbe at du ikke bruger den til at tjekke om brugeren er logget ind!!

Håber du kan sikkerhedsbristen i dette :)
Avatar billede TRoXa Novice
16. december 2003 - 01:45 #17
Jeg ser ingen

session_register("valid_user");

i nogen af filerne. Hvis den session variabel ikke er registreret kan den heller ikke huske den udover i login scriptet.

OG så ved jeg ikke om du bruger andre session variabler, men de skal så også registreres med samme funktion.
Avatar billede carlos123 Nybegynder
16. december 2003 - 01:48 #18
er det ikke det samme og skrive
$_SESSION["valid_user"];

som at skrive session_register?

mvh Carl
Avatar billede googolplex Novice
16. december 2003 - 01:51 #19
Jo, du bør ikke bruge session_resister().

Men du skal skrive:

$_SESSION["valid_user"] = 'something'; - Men det gør du jo også.
Avatar billede TRoXa Novice
16. december 2003 - 01:51 #20
ikke med mindre det er en ny ting.
Avatar billede googolplex Novice
16. december 2003 - 01:51 #21
Kan vi se din side, vil gerne se fejlen i effekt?
Avatar billede TRoXa Novice
16. december 2003 - 01:52 #22
okay så er jeg forkert på den :)
Avatar billede TRoXa Novice
16. december 2003 - 01:52 #23
googolplex  > hvorfor ikke bruge session_register ? :)
Avatar billede googolplex Novice
16. december 2003 - 01:56 #24
Fra manualen:

<?php
// Use of session_register() is deprecated
$barney = "A big purple dinosaur.";
session_register("barney");

// Use of $_SESSION is preferred, as of PHP 4.1.0
$_SESSION["zim"] = "An invader from another planet.";

// The old way was to use $HTTP_SESSION_VARS
$HTTP_SESSION_VARS["spongebob"] = "He's got square pants.";
?>
Avatar billede googolplex Novice
16. december 2003 - 01:57 #25
Fordi det ikke virker med register_globals OFF og du BØR bruge register_globals OFF, som jeg også skrev tidligere. Stort set alle webhoteller har den dog sat til ON - fordi ellers virker folks sider ikke mere og det kan de jo ikke ha' :(
Avatar billede TRoXa Novice
16. december 2003 - 02:00 #26
Underligt .. jeg kører med register_globals OFF men bruger session_register og det virker fint, men må hellere følge moden og gå over til den anden metode :) Man lærer noget nyt hver dag hehe :)
Avatar billede carlos123 Nybegynder
16. december 2003 - 02:01 #27
Ok, den er oppe og køre nu så i kan have et look see ;-)

http://81.7.147.95:5599/

der er en bruger der heder test og password er test

beklager det lidt useriøse indhold :-)
DTU er et meget sørgeligt sted :-) så man kommer nemt til at kede sig og så bliver man sådan lidt plat tror jeg.
Avatar billede googolplex Novice
16. december 2003 - 02:02 #28
Tjaa, har faktisk også haft det til at virke, så det var sikkert noget vrøvl jeg lige sagde :P Men session_register() er old fashion og vi kan jo lige så godt være med på moden :)
Avatar billede googolplex Novice
16. december 2003 - 02:03 #29
Men læs her:

http://dk.php.net/manual/en/function.session-register.php

Ved ikke hvorfor det kan funke alligevel...
Avatar billede TRoXa Novice
16. december 2003 - 02:05 #30
kører du den på din egen computer ? Hvis ja så læs videre .. hvis nej så bare ignorer denne kommentar :)

Hvis ja, kører du med apache webserver i windows ?

Hvis ja, så husk at oprette en mappe i en af følgende steder (kun en af dem virker .. kan bare ikke huske hvilken)

1. c:\temp
2. c:\tmp
3. c:\winnt\temp
4. c:\winnt\tmp

Det kunne godt se ud som om den ikke gemmer dine sessions
Avatar billede googolplex Novice
16. december 2003 - 02:09 #31
Prøv lige det her:

if ($userid && $password)

Ændres til:

if ($userid != '' && $password != '')

Tror ikke det hjælper, men kan ikke se den fejl :(
Avatar billede googolplex Novice
16. december 2003 - 02:10 #32
Ja, tror troxa har ret!!
Avatar billede carlos123 Nybegynder
16. december 2003 - 02:10 #33
Hey troxa det virkede kraftedme, så er det til pointgivningen :-)
Kan man dele point i mellem personer, for jeg synes googoplex også skal have nogle point, eller skal man oprette et nyt spg?
Avatar billede TRoXa Novice
16. december 2003 - 02:12 #34
Bonus :) Men jeg ved ikke hvordan man deler points .. sidst jeg gjorde det kom jeg til at give alle points til en forkert =/ hehe
Avatar billede googolplex Novice
16. december 2003 - 02:13 #35
Du kan dele under avanceret, så kan du give som du har lyst. Ellers kan du oprette et nyt.

Jeg lægger et svar, du er velkommen til at afvise :)
Avatar billede googolplex Novice
16. december 2003 - 02:13 #36
Jeg skal indrømme jeg aldrig havde set den fejl! Den skriver jeg mig lige bag øret :)
Avatar billede TRoXa Novice
16. december 2003 - 02:13 #37
Jeg kom lige i tanke om, at jeg selv havde haft det problem en del gange :) hehe
Avatar billede googolplex Novice
16. december 2003 - 02:15 #38
Ellers kan du bare markere alle dem du vil give point og tryk accepter, men så deles pointene lige og det er ikke altid det man vil. Med avanceret bestemmer du :)
Avatar billede googolplex Novice
16. december 2003 - 02:15 #39
troxa: Jaaa, sådan er det jo når man bruger windows ;) Men godt husket!
Avatar billede googolplex Novice
16. december 2003 - 02:16 #40
Takker for point, sov godt :)
Avatar billede carlos123 Nybegynder
16. december 2003 - 02:16 #41
jeg takker for hjælpen, til alle indvolverede, nu kan jeg sove godt i nat :-)
Avatar billede TRoXa Novice
16. december 2003 - 02:16 #42
Jeg har ikke fået taget mig sammen til at lave en linux server endnu til mine lokale projekter hehe, så jeg kører med dejlige æhmm .. okay ikke dejlige .. men kører med windows :P hehe
Avatar billede TRoXa Novice
16. december 2003 - 02:17 #43
Tak ilm :) Det var en god ting at jeg var med til at redde din nattesøvn .. så kan en af os da sove ;) hehe
Avatar billede carlos123 Nybegynder
16. december 2003 - 02:28 #44
jeg kommer sq nok ikke til at sove forløbig alligevel, skal lige have det til at virke med register_globals off :-) men jeg kom meget tættere på mit mål her i aften :-)
Avatar billede TRoXa Novice
16. december 2003 - 02:38 #45
bare lige for at hjælpe lidt mere :)


Index.php

<?php
    session_start();
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type"    content="text/html; charset=iso-8859-1"    />
        <meta http-equiv="Content-Language" content="da" />
        <meta name="KeyWords" content="x" />
        <meta name="Description" content="x" />
        <title></title>

        <!-- stylesheet    start-->
        <link rel="stylesheet" href="styles2.css" type="text/css"/>
        <!-- stylesheet    start-->
   
       
       
        </head>
    <body >
        <table width="100%" cellspacing="0" cellpadding="0" >
            <tr>
               
                <td align="center">
               
               
               
               
                    <table cellpadding="0" cellspacing="0" width="760"  border="0" >
                        <colgroup>
                            <col width="510" />
                            <col width="125" />
                        </colgroup>

                        <!-- Top start -->
                        <tr >
                            <td colspan="2"    id="topcolor">
                                <img src="img/header.gif" width="760" alt = "header.gif" />
                            </td>
                        </tr>

                        <!-- Top end -->
                        <tr>
                            <td colspan="2"    class="menu" align="center">
                                <a href="index.php" class="vlink">Startside</a>
                                <a href="?page=contacts.php" class="vlink">Kontakt os</a>
                                <a href="?page=news.php" class="vlink">Nyheder</a>
                                <a href="?page=links.php" class="vlink">Links</a>
                                <a href="?page=foredrag.php" class="vlink">Foredrag</a>
                                <a href="?page=admin.php" class="vlink">Admin</a>
                                <a href="?page=personal.php" class="vlink">Mine foredrag</a>
                            </td>
                        </tr>

                        <!-- Main start    -->
                        <tr>
                            <td valign="top" >
                            <div class="test"> <!--test madsen -->         
                                <table width="100%" height="600" cellspacing="0" cellpadding="5"
                                style="border-color=silver; height=700px;" class="StdColor" border="1" >
                                    <tr >
                                        <td valign="top" align="left">
           
                                            <?php
                                                if(file_exists($_GET[page]))
                                                    include($_GET[page]);
                                                else
                                                    include('news.php');
                                            ?>
                                        </td>
                                    </tr>
                                </table>
                                </div>
                            </td>

                            <!-- Main end -->
                            <td valign="top">
                               
                                <table width="100%" height="600"  cellspacing="0"
                                cellpadding="5"    class="StdColor" border    = "1" style="border-color=silver;">
                                    <tr>
                                        <td align="left" valign="top" >
                                            <?php
                                                include('logintest.php');
                                            ?>
                                        </td>
                                    </tr>

                                    <tr>
                                        <td align="left" valign    = "top"    >
                                            <strong>Nyheder:</strong>
                                            <br />
                                            <?php
                                                // print news
                                                include('news.php');

                                                // write counter                                               
                                                $visitors = counter_query();
                                                echo "visitors:    $visitors";

                                            ?>
                                            <!--<p>
                                          <a href="http://validator.w3.org/check/referer"><img
                                              src="http://www.w3.org/Icons/valid-xhtml10"
                                          alt="Valid XHTML 1.0!" height="31" width="88"    /></a>
                                        </p>-->
   
                                        </td>
                                    </tr>
                                </table>
                            </td>
                        </tr>
                    </table>
                <!--</div>-->
                </td>
           
           
            </tr>
        </table>
    </body>   
</html>


logintest.php
<?php
session_start();

if (isset($_POST['userid']) && isset($_POST['password']))
{
    $db_conn = mysql_connect("localhost","dummy","dummyuser");
    mysql_select_db("www", $db_conn);
    $query = "SELECT * FROM users WHERE username = '$_POST[userid]' and password = '$_POST[password]'";
    $result= mysql_query($query, $db_conn);
    if (mysql_num_rows($result)>0)
    {
        $_SESSION["valid_user"]=$_POST['userid'];
    }
}
?>
<html>
<body>
<?
    if (isset($_SESSION["valid_user"]))
    {
        echo "Du er loggede ind som: $_SESSION[valid_user]<br>";
        echo "<a href=\"logout.php\">Log ud<a/><br>";
    }
    else
    {
        if (isset($_SESSION['userid']))
        {
            echo "Kunne ikke logge dig ind";
        }
        else
        {
            echo "Du er ikke loggede ind.<br>";
        }
        ?>
        <form method="post" action="<?=$php_self?>">
        <input type="text" name="userid"><br />
        <input type="password" name="password"><br />
        <input type="submit" value="login"><br />
        </form>
        <?php
    }
?>
</body>
</html>
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