Ostatnimi czasy siedziałem troszkę nad php, czytałem kursy, manual php, przeglądałem to forum i udało mi się spłodzić ogólny zarys działającego logowania na sesjach.
index.php z ramkami
<? $nazwa_sesji=session_name("baza_danych"); session_start(); ?> <!DOCTYPE ... <HTML> <HEAD> ... <META> ... <TITLE>... </HEAD> <frameset rows="120,*"> <frame name="menu gorne" src="menu.php" frameborder=1 noresize> <frameset cols="20%,*%"> <frame name="menu boczne" src="list.php" frameborder=1 noresize> <frame name="okno glowne" src="main.php" frameborder=1 noresize> </frameset> </frameset> </html>
Menu boczne (list.php) oraz okno główne (main.php) zostawiam bez komentarza, bo tam powiedzmy, że nic ważnego nie ma (na razie).
Teraz menu górne (formularz do logowania lub tekst powitalny jeśli jest się zalogowanym)
menu.php
<? ?> <!DOCTYPE... <HTML> <HEAD> <META... <TITLE>... </HEAD> <body> <? echo '<p class=stand>Jesli chcesz sie wylogowac, kliknij <a href="logout.php" target="_parent">tutaj</a>.</p>'; } else { // cale echo to tabelka z opcjami do zalogowania i rejestracji - sory za bałagan echo ' <table border=0 width="100%"> <tr> <td width="40%"><p class=cent>Nie posiadasz jeszcze konta w naszym systemie?<br> <a href="register.php" target="_parent">>> Zarejestruj sie! <<</a></p></td> <td width="*"> </td> <td class=med width=60> Login:<br> Haslo:<br> </td> <td width=180> <form action="login.php" method="post" target="_parent"> <input type="text" name="login" size=10><br> <input type="password" name="password" size=10> <input type=submit value="Zaloguj"><br> </form> </td> </tr> </table> '; // koniec echo } ?> </BODY> </HTML>
Super. Teraz gwóźdź programu, czyli login.php
<? $_SESSION['login']="default_user"; $_SESSION['password']="default_pass"; $_SESSION['logged']=False; } ?> <!DOCTYPE... <HTML> <HEAD> <? $url = "index.php"; $delay = "2"; echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">'; // po $delay sekundach zostajemy przeniesieni na stronę główną niezależnie, czy ud
ało nam się zalogować czy nie ?> <META... <TITLE>... </HEAD> <body...> <? // uwaga! Ponizszy fragment kodu to czytanie z pliku; pozniej zrobie to na bazie d
anych // w pliku passwd.txt mamy: // 1;raynold;raynold; // 2;user;passwd; // itd. Oczywiscie, mozna dodac wiecej danych i oddzielac innym znakiem // i prosze nie komentować, że nie wczytuje się całego pliku od razu. Wiem ;) Ale to jest małe i nie szkodzi nikomu. To tylko przejściowe. } else { } for ($i=0; $i<count($calosc); $i++) { if (($_POST['login'] == $dane[1]) && ($_POST['password'] == $dane[2]) ) { // jeśli udało nam się zalogować na istniejącego usera, to // ustawiamy odpowiednie zmienne dla innych plików (np. menu.php) $_SESSION['logged']=True; $_SESSION['login']=$_POST['login']; $_SESSION['password']=$_POST['password']; break; } } } else { } ?> <p class=stand> Kliknij <a href="index.php">tutaj</a>, zeby powrócic do strony glownej.</p> </HTML>
Super. Jeszcze tylko wylogowanie się (w menu.php dostępna jest opcja wylogowania się tylko, jeśli $_SESSION['logged'] jest True)
logout.php
<? ?> <!DOCTYPE...> <HTML> <HEAD> <? $url = "index.php"; $delay = "2"; ?> <META>... <TITLE>... </HEAD> <BODY...> <? if ($_SESSION['logged']) { } ?> <p class=stand>Za chwile zostaniesz przekierowany na <a href="index.php">strone glowna</a>.</p> </BODY> </HTML>
Działa

- Czy to dorzucanie w każdym pliku przypisanie nazwy sesji jest konieczne, czy nazwa sesji sama automatycznie zostanie zczytana? (bez wpisywania tej nazwy mi nie działało, ale też do końca nie wiem, czy to tylko po tej poprawce zaczęło)
- Czy w każdym pliku muszę robić sprawdzanie typu -> menu.php -> linia 16, dzieląc każdy plik na dwie części: jak ma wyglądać, gdy jest zalogowany, a jak ma wyglądać, gdy nie jest?
- W pliku login.php odczytuję numery id, loginy, hasła (i inne). Wszystko cacy. Chcę się przerzucić na bazę danych (konkretnie Oracle, bez komentarzów proszę, że łatwiej w mySQL itd. Po prostu muszę to mieć w Oracle). I jest motyw taki: looknijcie na linijki 6 i 7 w login.php. Tam mam wpisanego usera i hasło, na którego mogę zalogować się domyślnie do bazy danych w celu przeszukania loginów i porównania haseł (potrzebne, gdy nikt teoretycznie nie jest zalogowany, a przecież muszę jakoś się dostać do bazy, prawda? I żeby się zarejestrować, i żeby się zalogować). Czy to tak właśnie wstępnie ma wyglądać? Prosiłbym o ewentualne małe wskazówki co z tym fantem zrobić/ jak to rozwinąć
- Czy jeśli już się zalogowałem do bazy danych jako user, już normalnie, nie jako ten defaultowy - czy muszę się logować (nie formularzem, ale czy muszę odpalać funkcje do logowania się do bazy) w każdym osobnym skrypcie php? Bo przypuszczam, że jak jest odpalony jeden skrypt, to wystarczy sie raz zalogować i można wielokrotnie kierować zapytania SQLowe do bazy w obrębie skryptu. Jednakże czy sesja przechowuje dane typu: user blabla jest cały czas zalogowany do bazy dopóki sesja nie zostanie zniszczona?
Na razie tyle pytań z mojej strony. Prosiłbym o wszelkie przydatne komentarze dotyczące sposobu logowania się, jaki przedstawiłem. Wszelka konstruktywna krytyka mile widziana. Oczywiście proszą pamiętać, że pliki są mocno okrojone, zostawione są tylko istotne rzeczy.
Pozdrawiam
Raynold