Avatar billede nugga Nybegynder
05. november 2010 - 15:42 Der er 29 kommentarer og
1 løsning

Hjælp til simpel PHP kode

Jeg er ved at bygge et login system til en hjemmeside, men da min erfaring indenfor PHP er meget begrænset har jeg valgt at bruge et script der allerede er lavet.
Jeg har hentet scriptet her fra http://www.evolt.org/node/60384
For at lige teste om det dur, har jeg lavet en lille php fil jeg har kaldt hej.php
Den skal bare tjekke om man er logget ind eller ej

<html>
<body>

    <?
    include("include/session.php");
    ?>
    <?
    if($session->logged_in){
    ?>

        Du er logget ind Logget in
    <?
    }
    else {
    ?>
    Du er ikke logget ind, venligst log in
    <?
    }
    ?>
</body>
</html>

Jeg har brugt If koden fra en fil han har lavet som eksempel på hvordan det kunne se ud, men jeg gør åbenbart noget forkert.
Resultatet bliver at browseren skriver den her linje
logged_in){ ?> Hej med dig Du er ikke logget ind, venligst log in

Det virker for mig som om koden går i stykker lige efter $session-> men jeg forstår bare ikke helt hvorfor det ikke virker.
Jeg ved godt det kan være svært at se problemet, når i ikke kender session.php, men den kan evt downloades fra linket hvis nogle har tid til at kigge på det.

Hvis der er nogle der måske kender en lidt nemmere script, som ikke behøves alle de fine funktioner så ville jeg også gerne høre fra dem.
Mit eneste krav er faktisk at det skal kunne beskytte alle PHP filer jeg laver + det skal kunne klare omkring 50 brugere, gerne hente oplysninger for en database.


På forhånd tak
Avatar billede moddi100 Seniormester
05. november 2010 - 17:17 #1
Prøv følgende:
<html>
<body>

    <?php
    include("include/session.php");

    if($session->logged_in){
    ?>

        Du er logget ind Logget in
    <?
    } else {
    ?>
    Du er ikke logget ind, venligst log in
    <?php
    }
    ?>
</body>
</html>
Avatar billede cyberman29 Nybegynder
05. november 2010 - 17:44 #2
jeg forstår ikke hvorfor han konstant tænder og slukker for php...jeg ville have skrevet den sådan her:

<html>
<body>

    <?php
    include("include/session.php");

    if($session->logged_in)
{
   
Du er logget ind Logget in

}
else {
   
    Du er ikke logget ind, venligst log in
   
    }
    ?>
</body>
</html>

Den er lidt mere overskuelig, det er bare min mening
Avatar billede webweaver Praktikant
05. november 2010 - 18:08 #3
cyberman29, du kan ikke gøre det som du har vist? :S
Så dårlig idé. Der er en grund til at han vælge at gå ind og ud af PHP, da han har nogle beskeder han vil have vist.

Hvis man skal bruge din metode, skal man vise beskeder med PHP.
echo "Du er logget ind Logget in"; ...
Avatar billede webweaver Praktikant
05. november 2010 - 18:17 #4
Sidder du med PHP5?
Avatar billede cyberman29 Nybegynder
05. november 2010 - 18:19 #5
ja okay, det var min fejl undskyld, er heller ikke den bedste til php, så kan godt glemme nogle ting, men jeg vil da sige at hvis han skrev echo der hvor han ville give nogle beskeder ville det da være mere overskueligt... men hvis jeg er helt forkert på den så undskyld



Cyberman29
05. november 2010 - 18:49 #6
Det var da et enormt login system du viser i dit link, vel nok overdimmensioneret for et simpelt job som du beskriver. 

Jeg har selv lige maatte lave et simpelt login system uden at have de store forkundskaber.  Jeg havde god hjaelp til at forstaa principperne af http://www.phpeasystep.com/phptu/6.html

Du skal have en database tabel til at gemme users og passwords, saasom:

CREATE TABLE Login(id INT, user VARCHAR(16), password VARCHAR(16));

Saa skal du have en html form hvor brugerne kan indfoere username og password og forespoerge databasen. 

Hvis der er precis en raekke i databasen der svarer til den indfoerte kombination af username og password saa saetter du en session variable, $_SESSION['login'] = "1". Saa begynder du alle de sider der skal beskyttes med denne kode:

<?
session_start();
if($_SESSION['login'] != "1") header("Location: Login.php");
?>

Forklaring:  Naar en beskyttet side aabnes og hvis sessionvariablen ikke er 1 saa sendes brugeren til Login.php eller hvad du nu kalder din login side.  Hvis sessionvariabelen er 1 faar brugeren adgang til siden.

Jeg vil vise min login og logud side her. Filen 'connect.php' indeholder forbindelsen til databasen.

Login.php
<?
if($_POST['submitLogin'])
{
  require_once('connect.php');
  $loggedIn = mysql_query("SELECT * FROM Login WHERE user = '" . $_POST['user'] . "' AND password = '" . $_POST['password'] . "'")
or die(mysql_error());
  if(mysql_num_rows($loggedIn) == 1)
  {
    session_start();
    $_SESSION['login'] = "1";
    header("Location: admin_start.php");
  }
  else echo "<script>alert('Username or password incorrect.  Please check and try again!')</script>";
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title>admin_login</title>
</head>
<body>
<form action='' method='POST'>
<table>
<tr><td>Enter username</td><td><input type='text' name='user' /></td></tr>
<tr><td>Enter password</td><td><input type='password' name='password' /></td></tr>
<tr><td>Submit login</td><td><input type='submit' name='submitLogin' value='Submit' /></td></tr>
</table>
</form>
</body>
</html>

Logout.php
<?
session_start();
session_destroy();
?>

Saa har jeg lavet en side til at oprette nye brugere og til at aendre username og eller password.  Den fylder lidt mere.  Derfor har jeg sat den her: 

http://pastebin.com/sCzNhVvX

Jeg haaber det maa vaere dig til nogen nytte.  Det at skrive det ned her var for mig en nyttig repetition af principperne.
Avatar billede nugga Nybegynder
05. november 2010 - 20:02 #7
Super tak for alle de mange svar, jeg har desværre ikke lige tid til at kigge det hele igennem nu, men jeg vil lige overveje det du har skrevet Christian Belgien.
Avatar billede ggxdg Nybegynder
06. november 2010 - 00:42 #8
Jeg ved ikke lige om det er det, men includes skal altid være det første i php, så jeg ved ikke om det roder med noget at outputte  tekst før din include.

Men prøv evt at flytte din include op, og se om det lige kunne fikse noget :)
Avatar billede webweaver Praktikant
06. november 2010 - 00:59 #9
includes skal altid være først? Hvorfor nu det?
Må jeg nu indrømme at jeg aldrig har stødt på før, og det virker fint at udføre noget PHP kode før du includer noget ...
Avatar billede moddi100 Seniormester
06. november 2010 - 16:41 #10
Hvis dit login er baseret på sessions, skal session_start() ske før noget outputtes. Derved skal filen altså includes før noget output genereres. Men ellers kan includes lige så godt være i bund som top
06. november 2010 - 16:59 #11
...som jeg viser i #6.
Avatar billede webweaver Praktikant
06. november 2010 - 17:04 #12
session_start() i toppen af filen ja. Det er jeg nu godt klar over. Det er bare ikke hvad personen skrev :)
Avatar billede nugga Nybegynder
07. november 2010 - 19:44 #13
jeg er da ret sikker på at jeg også har sat includes øverest.
Man må vel gerne begynde at bruge HTML, inden man bruger includes?
Avatar billede majbom Novice
07. november 2010 - 19:48 #14
-> #13 - ja, medmindre der er noget session_start eller andet i de filer du inkluderer som skal være før output - og det gør din session.php...
Avatar billede nugga Nybegynder
07. november 2010 - 21:13 #15
Okay alle sammen.
Jeg sad lige og legede med Christian_Belgiens metode og den virker virkeligt godt. Det er lige præcis sådan et script jeg skulle bruge.
Mit eneste problem er at det er ud som om den laver en cookie som aldrig forsviner, hvilket vil sige at hvis du har har logget ind en gang på en computer så er den computer altid logget ind.
jeg vil gerne have lavet det sådan at den automatisk logger ud efter 1 times inaktivitet.
Altså forlader man sin computer en times tid og så kommer tilbage til den igen, så skal den bede om kode og password igen.

Jeg har fundet frem til en kode der sætter en timer på sessionen
session_set_cookie_params(60*60);
Men vil denne kode også virke, så den automatisk sætter timeren tilbage til 1 time hver gang siden har været i brug? Så man ikke sidder aktiv på siden og efter en time bliver bedt om at logge ind igen.

Mange tak
07. november 2010 - 21:35 #16
Jamen det glaeder mig hvis mit indlaeg har vaeret til nytte.  Jeg laegger et svar.
Avatar billede nugga Nybegynder
07. november 2010 - 21:48 #17
Mange tak igen.
Har du nogen ide om den jeg skrev i #15?
08. november 2010 - 06:30 #18
Jeg er ikke klar over hvad konsekvensen er ved at saette en tidsbegraensning paa cookien.  Du kunne jo proeve det af med en tidsbegraensning paa 1 minut.  Men det skulle ikke vaere noedvendigt at saette en tidsbegraensning paa cookien.  Paa mit system forsvinder login'en naar jeg forlader hjemmesiden, ogsaa selv om jeg undlader at foretage logout.  Hvis jeg vil aabne hjemmesiden igen maa jeg derfor logge ind paany.  Har du testet at man paa dit system forbliver logged in? 

Saadan som jeg har forstaaet det, naar en bruger aabner en hjemmeside der starter med session_start() saa startes der en ny session med et unikt betegnelse, lad os sige ABC.  Betegnelsen bevares i en cookie saaledes at naar brugeren gaar til andre paginaer i hjemmesiden bliver session ABC koerende.  Login i den kode jeg foreslog bestaar simpelt hen i at der i session ABC oprettes en session-variabel 'login' med vaerdien 1.  Naar brugeren vil gaa til en beskyttet side checkes der om han i den bestaaende session, altsaa ABC, har oprettet session-variabel 1.  Hvis ikke, saa afvises han.  Naar brugeren har forladt hjemmesiden og starter paa ny dannes der en ny session, lad os sige DEF.  Det er saaledes irrelevant om cookien med ABC stadig bestaar.
Avatar billede nugga Nybegynder
08. november 2010 - 08:07 #19
Jeg vil lige teste den der med 1 minut, når jeg kommer hjem i eftermiddag.
jeg prøvede at gå ind på siden, og genstarte computeren og den gik bare direkte ind på siden. Så åbenbart bliver man ikke logget ud bare fordi man lukker browseren, eller for dens sags skyld computeren
Avatar billede moddi100 Seniormester
08. november 2010 - 13:12 #20
inden du kalder session_start() skal du lige sætte følgende:

...
ini_set("session.gc_maxlifetime", 60 * 60);
session_start();
...

Det vil sætte varigheden af alle dine session til 1 time (60 * 60 = 3600 sekunder).
Avatar billede nugga Nybegynder
08. november 2010 - 16:17 #21
Super virkeligt lige hvad jeg manglede.
Jeg kan desværre ikke give dig point da jeg allerede har givet dem til Christian_Belgien
Avatar billede nugga Nybegynder
08. november 2010 - 19:20 #22
Moddi100 jeg sad lige og legede lidt med hvad du havde skrevet.
jeg prøvede at sætte det ind i mine php filer, men det virker ikke desværre.
jeg åbnede hjemmesiden og loggede på, derefter lukkede jeg siden og forsøgte igen cirka en time og 10. minutter senere og jeg kom ind uden at blive bedt om password.
Jeg søgte lidt på google, og kom frem til at det styres fra filen php.ini.
Jeg fandt en måde hvor på jeg kunne se hvad der står i PHP.ini filen via min host og jeg fik det her resultat session.gc_maxlifetime    1440   
Jeg antager at det er sekunder og derfor det samme som 24 minutter, hvilket må betyde at sessionen burde blive ødelagt efter 24 minutter?
Jeg læste også at ikke alle host's tillader ændringer i PHP.ini filen, men det er sådan set også lige meget da 24min også sagtens kan gå.
Jeg kan bare ikke forstå hvorfor den så stadig logger direkte ind selvom jeg har været inaktiv i langt længere tid?
Avatar billede webweaver Praktikant
08. november 2010 - 20:22 #23
Ahh der må være noget rod et sted i din kode.
Lyder ihverfald mystisk.

Først og fremmest, har du cookies eller sessions til dit login system? Det er 2 forskellige ting.

En helt "normal" session bliver ikke husket som en cookie, og den slettes automatisk, når man lukker browservinduet eller er inaktiv i x antal minutter, alt efter hvad php.ini er sat til, eller hvad man selv sætter den til (hvis det er slået til).

Du har haft dette inde ovre kan jeg se,
session_set_cookie_params(60*60);

Fjern det og tryk log ud. Hvad sker der så, næste gang du går ind på sitet?

Alternativt, sæt dette ind,
session_set_cookie_params(0);

Det vil slette sessionen, når browservinduet lukkes ned.
Avatar billede nugga Nybegynder
08. november 2010 - 21:36 #24
Hmm, jeg har lige kigget koden igennem og checklogin.php filen ser sådan her ud.

if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}


Så ser login_success.php sådan her ud

<?
session_start();
ini_set("session.gc_maxlifetime", 60 * 60);
if(!session_is_registered(myusername)){
header("location:main_login.php");
}
?>


Kan du ikke prøve hlet præcist at ændre det kode jeg skal ændre + også at forklare om det bare skal ændres engang eller altid?
Beklager jeg er lidt uforståen, jeg kan godt nogen lunde se ideen'en i PHP koden, men jeg forstår heller ikke ret meget mere.
Avatar billede webweaver Praktikant
09. november 2010 - 14:55 #25
Checklogin.php? Det ligner nu ikke noget som hører til det Christian_Belgien postede tidligere i tråden.

Hvor har du det fra? Hvad for et login system bruger du?

Der bruges session_register istedet for $_SESSION.
Det kan være derfor du har dit problem.

session_register("myusername");

$_SESSION["myusername"] = $myusername;

Det kan dog være besværligt for dig at rette, hvis der er brugt session_register hele vejen igennem.
Avatar billede nugga Nybegynder
09. november 2010 - 17:12 #26
Hmm okay.
Jeg troede enig at Christian brugte den samme kode, som den han linkede til altså http://www.phpeasystep.com/phptu/6.html
Som er den jeg har brugt.
Har du mulighed for at se om jeg kan rette det, eller skal jeg forsøge mig med en helt ny kode?
Avatar billede webweaver Praktikant
09. november 2010 - 17:33 #27
Ahh havde ikke lige set der var linket til et login system.
Troede du rodede med det som der var postet herinde af kode.

Men det som der er linket til, ser fornuftigt ud alligevel. Det er ikke så langt. Har du prøvet at bruge ob_start i din checklogin? Som han også har i sit eksempel for PHP5. Se hvad der sker. Og så i første omgang holde dig til session_register.
Avatar billede nugga Nybegynder
09. november 2010 - 20:18 #28
Jeg prøvede og resultatet blev præcist det samme desværre :(
Avatar billede webweaver Praktikant
09. november 2010 - 22:04 #29
Og du skal selvfølgelig også have ob_end_flush() i bunden af filen. Men det regner jeg med at du har prøvet.

Så må vi prøve at udskifte session_register().

if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
session_register("myusername");
session_register("mypassword");
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}

rettes til,

if($count==1){
// Register $myusername, $mypassword and redirect to file "login_success.php"
$_SESSION["myusername"] = $myusername;
$_SESSION["mypassword"] = $mypassword;
header("location:login_success.php");
}
else {
echo "Wrong Username or Password";
}

Husk at have session_start(); i toppen af den fil.

Og sidst men ikke mindst,

session_start();
if(!session_is_registered(myusername)){
header("location:main_login.php");
}
?

rettes til,

session_start();
if(!$_SESSION["myusername"]){
header("location:main_login.php");
}
?

Hvad siger den så nu?
Avatar billede nugga Nybegynder
09. november 2010 - 22:14 #30
Det ser rigtigt lovende mange tak
Jeg får ikke lige tid til at få kigget på det i aften, men vil forsøge igen i morgen eftermiddag.
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