Witam!
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>
<frame name="menu gorne" src="menu.php" frameborder=1 noresize>
<frame name="menu boczne" src="list.php" frameborder=1 noresize> <frame name="okno glowne" src="main.php" frameborder=1 noresize>
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>
<?
if (isset($_SESSION['logged']) && ($_SESSION['logged']==True) ) { echo '<p class=cent>Witaj na stronie, <b>'.$_SESSION['login'].'!</b></p>'; 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
<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<?
if (!isset($_SESSION['logged']) || ($_SESSION['logged']==False) ) { $_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.
$file=fopen("passwd.txt","w"); }
else {
$file=fopen("passwd.txt", "r"); $calosc=file('passwd.txt'); }
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;
}
}
if (isset($_SESSION['logged']) && ($_SESSION['logged']==True)) { echo "<p class=stand>Witaj, ".$_SESSION['login']."!</p>"; }
else {
echo ("<p class=stand>Nie ma takiego uzytkownika, lub podales bledne haslo</p>"); }
?>
<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";
echo '<meta http-equiv="refresh" content="'.$delay.';url='.$url.'">'; ?>
<META>...
<TITLE>...
</HEAD>
<BODY...>
<?
if ($_SESSION['logged']) {
echo "<p class=stand>Zalogowany jako: ".$_SESSION['login'].". Nastepuje wylogowanie...</p>"; echo "<p class=stand>Zostales wylogowany</p>"; }
?>
<p class=stand>Za chwile zostaniesz przekierowany na <a href="index.php">strone glowna</a>.</p>
</BODY>
</HTML>
Działa

Super, cieszę się. Nie było aż tak źle, nawet samemu to wszystko zrobiłem. No ale znając życie, część rzeczy można zrobić lepiej itd. Teraz moje pytania i problemy:
- 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?
W
index.php widać jeszcze plik
list.php - tam będą różne linki, które po kliknięciu będą odpalały różne skrypty w ramce
okno glowne. Oczywiście, tylko dla zalogowanych userów.
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
Ten post edytował Raynold 12.01.2006, 16:06:05