Najsampierw teoria, która jak mam nadzieje rozjaśni Wasze szare komórki. Naszym celem jest stworzenie skryptu rejestracji, logowania, edycji profilu oraz wylogowania. Całość ma znajdować się w osobnych plikach oraz posiadać mały silnik.
Teoria
System rejestracji polega na dodaniu rekordu do bazy danych. Skrypt pobiera od użytkownika takie wartości jak nick, hasło oraz email. Po przefiltrowaniu oraz sprawdzeniu danych z tablicy $_POST rozpoczyna się translacja z bazą danych. Jeśli w bazie znajduje się już rekord z podanym przez użytkownika nickiem na ekranie pojawia się stosowny komunikat, a do bazy danych nie zostaną dodane żadne wartości dlatego, że z powodów oczywistych nie może być dwóch użytkowników o identycznych nickach.
Logowanie to nic innego jak pobranie od użytkownika loginu z hasłem, a następnie sprawdzeniu czy hasło dla podanego nicku jest prawidłowe. Jeśli dane się zgadzają deklarujemy zmienną sesyjną do tablicy $_SESSION z wartościami takimi jak nick, hasło oraz pobraną z bazy range(aby w razie potrzeby odróżnić administratora od zwykłego użytkownika). Jeśli dane się nie zgadzają wyświetlamy odpowiedni komunikat i dla celów bezpieczeństwa niszczymy zmienne sesyjne funkcją session_destroy(), która będzie użyta w skrypcie wylogowywania.
Edycja profilu rozpoczyna się od sprawdzenia, czy istnieje zmienna sesyjna przy pomocy funkcji isset(). Jeśli zmienna istnieje skrypt pobiera odpowiednie dane do formularza na stronie. Po edycji pól tekstowych przez użytkownika skrypt wykonuje update bazy danych na dane odebrane z formularza. Należy oczywiście pamiętać o filtracji danych.
Wylogowanie polega jedynie na zniszczeniu zmiennych sesyjnych poprzez użycie funkcji session_destroy().
Przygotowania
Mając opanowaną teorie przystępujemy do części praktycznej kursu.
Zacznijmy od utworzenia tabeli danych o nazwie `uzytkownicy`
CREATE TABLE `uzytkownicy` (
`ID` INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
`nick` VARCHAR( 50 ) NOT NULL ,
`haslo` VARCHAR( 32 ) NOT NULL ,
`email` VARCHAR( 50 ) NOT NULL ,
`ranga` INT NOT NULL ,
`osobie` TEXT NOT NULL ,
`data` DATETIME NOT NULL
) ENGINE = MYISAM ;
Zapisujemy do niej kolejno:
- indywidualny numer ID służący do identyfikowania użytkowników
- pole nick, przechowujące nich użytkownika
- pole haslo, będzie przechowywać hash md5 użytkownika
- email przechowujący Internetowy adres email
- ranga, aby można było odróżnić administratora od zwykłego użytkownika.
- osobie, pole typu text. Będą się w nim znajdować dane podane przez użytkownika.
- data, to data rejestracji wraz z godziną.
Mając bazę danych możemy przystąpić do tworzenia szkieletu strony. Będzie się on składał z pliku index.php oraz silnik.php. Ponadto utworzymy dwa katalogi, strona oraz includes. W pierwszym będziemy trzymać pliki style.css, bottom.php i top.php. Te dwa ostatnie będą nam służyć za prowizoryczne logo oraz stopkę, aby pokazać Czytelnikowi zmiany zachodzące na stronie podczas logowania. W katalogu includes należy stworzyć pliki o nazwach edycja.php, logowanie.php, rejestracja.php i ostatni wylogowanie.php. Będą to podstrony naszego silnika.
Zawartość pliku 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" xml:lang="pl" lang="pl">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="Stylesheet" type="text/css" href="strona/style.css" />
<title>
Testowa strona przedstawiająca skrypt obsługi użytkowników.
</title>
</head>
<body>
<?
mysql_connect ("serwer", "uzytkownik", "haslo") or
die ("Blad podczas polaczenia z MySQL. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
mysql_select_db ("baza") or
die ("Blad podczas wybierania bazy. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone.");
include('strona/top.php');
include('silnik.php'); /*główny silnik - rejestracja, logowanie, edycja i wylogowanie*/
include('strona/bottom.php');
?>
</body>
</html>
Funkcja session_start() odpowiada za podtrzymywanie sesji. Bez niej nasz skrypt nie działałby prawidłowo. Myślę, że reszta kodu nie wymaga dogłębnego omówienia.
Poniżej zawartość plików z katalogu strona.
Style.css:
* {
margin: 0;
padding: 0;
}
body {
margin: 0 auto;
width: 800px;
}
bottom.php:
<?php
echo'<hr />To jest dolna część stronki';
?>
top.php:
<?php
echo'To jest górna część stronki<hr />
<h4>Menu:</h4>
<a href="?strona=logowanie">Logownaie</a>
<a href="?strona=rejestracja">Rejestracja</a>
<a href="?strona=edycja">Edycja profilu</a>
<a href="?strona=wylogowanie">Wylogowanie</a>
<hr />';
?>
Zawartość pliku silnik.php:
<?php
$get = addslashes($_GET['strona']);
switch($get) {
case '':
include('includes/logowanie.php');
break;
case 'glowna':
include('includes/logowanie.php');
break;
case 'rejestracja':
include('includes/rejestracja.php');
break;
case 'logowanie':
include('includes/logowanie.php');
break;
case 'edycja':
include('includes/edycja.php');
break;
case 'wylogowanie':
include('includes/wylogowanie.php');
break;
}
?>
Zaczynamy
Mając przygotowany szkielet zabieramy się za kodzenie właściwie 😉
Najsampierw przygotujemy skrypt rejestracji(plik rejestracja.php w katalogu includes). Poniżej działający kod wraz z kilkoma komentarzami.
<?php
if(isset($_SESSION['login'])) {
echo'Posiadasz już konto';
} else {
/*Deklaracja zmiennej $formularz*/
$formularz ='
<form action="?strona=rejestracja" method="post">
<table>
<tr>
<td width="120">
Nick
</td>
<td>
<input type="text" name="nick" maxlength="30" />
</td>
</tr>
<tr>
<td>
Hasło
</td>
<td>
<input type="password" name="haslo" />
</td>
</tr>
<tr>
<td>
Powtórz hasło
</td>
<td>
<input type="password" name="haslo2" />
</td>
</tr>
<tr>
<td>
E-mail
</td>
<td>
<input type="text" name="email" maxlength="100" />
</td>
</tr>
<tr>
<td>
Kliknij
</td>
<td>
<input type="submit" name="rejestracja" value="Rejestruj" />
</td>
</tr>
</table>
</form>
';
if(isset($_POST['rejestracja'])) { //Jeśli został wciśnięty przycisk
/*Filtracja zmiennych z tablicy $_POST*/
$nick = addslashes(htmlspecialchars($_POST['nick']));
$haslo = addslashes(htmlspecialchars($_POST['haslo']));
$haslo2 = addslashes(htmlspecialchars($_POST['haslo2']));
$email = addslashes(htmlspecialchars($_POST['email']));
/*Sprawdzanie, czy wszystkie pola zostały uzupełnione i czy są poprawne*/
if(empty($nick)) {
echo'<p>Uzupełnij pole <span>nick</span></p>';
} elseif(strlen($nick) > 50 ) {
echo'<p>Nick może składać się z maksymalnie 50 znaków</p>';
} elseif(empty($haslo)) {
echo'<p>Uzupełnij pole <span>hasło</span></p>';
} elseif(empty($haslo2)) {
echo'<p>Powtórz hasło</p>';
} elseif($haslo != $haslo2) {
echo'<p>Podane hasła różnią się</p>';
} elseif(empty($email)) {
echo'<p>Uzupełnij pole <span>E-mail</span></p>';
} elseif(strlen($email) > 50 ) {
echo'<p>E-mail może składać się z maksymalnie 50 znaków</p>';
} elseif(!preg_match('/^[a-zA-Z0-9.-_]+@[a-zA-Z0-9.-_]+.[a-z]{2,4}$/D', $email)) {
echo'<p>Podany adres <span>E-mail</span> jest nieprawidłowy.
Prawidłowy E-mail jest niezbędny w celu dokończenia procesu rejestracji.</p>';
} else { //Jeśli wszystkie pola się zgadzają zapytujemy bazę danych
/*Sprawdzanie, czy podany nick istnieje w bazie danych*/
$zapytajka_user = mysql_query("SELECT * FROM `uzytkownicy` WHERE `nick` = '$nick';");
if(mysql_num_rows($zapytajka_user) == 1) {
echo '<p>Przepraszam, taki login jest już zajęty - proszę wybrać inny nick.</p>';
} else {
/*Sprawdzanie, czy podany email istnieje w bazie danych*/
$zapytajka_email = mysql_query("SELECT * FROM `uzytkownicy` WHERE `email` = '$email';");
if(mysql_num_rows($zapytajka_email) == 1) {
echo '<p>Przepraszam, taki <span>e-mail</span> jest już zajęty. Możliwe, że posiadasz już konto w moim serwisie, bądź ktoś podał Twój adres.';
} else {
/*Dodawanie nowego użytkownika do bazy danych*/
echo '<p>Dzięki za rejestracje <span>'.$nick.'</span>, możesz się teraz <a href="?strona=glowna">zalogować</a>.</p>';
$haslo_zakodowane = md5($haslo);
$zapytanie = mysql_query("INSERT INTO uzytkownicy (nick, haslo, email, ranga, osobie, data)
VALUES ('$nick', '$haslo_zakodowane', '$email', 1, '---', now());");
}
}
}
} else { //Jeśli nie został wciśnięty przycisk wyświetlamy formularz
echo $formularz;
}
}
?>
Jeśli mamy już zarejestrowane konto należy się zalogować używając poniższego kodu:
<?php
$formularz = '
<form action="" method="post">
<input type="text" name="login" value="login" />
<input type="password" name="password" value="pass" />
<input type="submit" name="logowanie" value="Zaloguj" />
</form>
';
$login = addslashes(htmlspecialchars($_POST['login'])); //nadajemy zmiennej login wartosc z POST
$haslo = md5(addslashes(htmlspecialchars($_POST['password']))); //nadajemy zmiennej haslo wartosc z POST
if(!empty($_POST['logowanie'])) { //jesli klikniemy przycisk wykonuje sie skrypt
if(empty($login)) { //jesli nie wpisalismy loginu
echo 'Podaj login!'; //echujemy wiadomosc
}
elseif(empty($haslo)) { //jesli nie wpisalismy hasla
echo 'Podaj hasło!'; //echujemy wiadomosc
}
else { //jesli sa wpisane login i haslo
$zapytanie = mysql_query("SELECT * FROM `uzytkownicy` WHERE `nick` = '$login' AND `haslo` = '$haslo';"); //zapytujemy baze danych
while ($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) { //petla, aby pobrac wyniki
$loginzbazy = $rekord['nick']; //zapisujemy login z bazy do zmiennej
$haslozbazy = $rekord['haslo']; //zapisujemy haslo z bazy do zmiennej
$ranga = $rekord['ranga']; //zapisujemy range z bazy do zmiennej
}
if($login != $loginzbazy || $haslo != $haslozbazy) { //jesli login lub/i haslo bedzie inne niz to z bazy
echo 'Niepoprawny login lub/i haslo!'; //echujemy wiadomosc
} elseif($login == $loginzbazy && $haslo == $haslozbazy) { //jesli dane sie zgadzaja
$_SESSION['login'] = $loginzbazy; //zapisujemy login z bazy do sesji
$_SESSION['haslo'] = $haslozbazy; //zapisujemy haslo z bazy do sesji
$_SESSION['ranga'] = $ranga; //zapisujemy range z bazy do sesji
echo 'Zostałeś poprawnie zalogowany/s <b>'.$_SESSION['login'].'</b>!'; //echujemy wiadomosc
} else { //jesli wystapi nieoczekiwany blad
echo 'Wystąpił nieoczekiwany błąd. Spróbuj ponownie.'; //echujemy wiadomosc
}
}
} else { //jesli nie klikniemy przycisku wyswietlamy formularz
if(isset($_SESSION['login'])) { //jesli istnieje sesja z loginem
echo 'Jesteś już zalogowany jako<b> '.$_SESSION['login'].'</b>!'; //echujemy wiadomosc
} else { //jesli nie ma sesji z loginem
echo $formularz; //wyswietlamy formularz
}
}
?>
Pozostaje nam napisać kod odpowiedzialny za edycję danych użytkownika:
<?php
if(isset($_SESSION['login'])) {
if(!isset($_POST['edycja'])) {
$login = addslashes($_SESSION['login']);
$zapytanie = mysql_query("SELECT * FROM `uzytkownicy` WHERE nick='".$login."';");
while ($zapytanie && $rekord = mysql_fetch_assoc($zapytanie)) {
echo'<h2>Edycja danych</h2>
<form action="" method="post">
<textarea name="osobie" cols="40" rows="10">'.$rekord['osobie'].'</textarea>
<input type="submit" name="edycja" value="Edytuj dane" />
</form>
';
}
} else {
$osobie = addslashes(htmlspecialchars($_POST['osobie']));
$login = addslashes($_SESSION['login']);
mysql_query("UPDATE `uzytkownicy` SET `osobie`='$osobie' WHERE `nick`='$login'");
echo'Dane zostały zmodyfikowane pomyślnie!';
}
} else {
echo'Aby mieć dostęp do tej strony musisz być <a href="?strona=glowna">zalogowany</a>';
}
?>
A oto proste wylogowanie:
<?php
if(isset($_SESSION['login'])) {
echo'Wylogowanie przebiegło pomyślnie'.$_SESSION['login'];
session_destroy();
} else {
echo'Jesteś już wylogowany/a';
}
?>
Myślę, że kody napisałem dość czytelnie i nie będzie problemów z dostosowaniem skryptów do własnych potrzeb.
Na zakończenie
Pozostaje ostatni problem. Jak odróżnić zwykłego użytkownika od administratora? Nic trudnego. Do bazy danych należy ręcznie dodać nowy rekord z rangą np. 5. Skrypt odpowiedzialny za wyświetlanie informacji dostępnych dla administratora kształtuje się następująco:
<?php
if($_SESSION['ranga'] >= 5) {
echo'jesteś administratorem ;-)';
} else {
echo'Nie jesteś administratorem ;-(';
}
?>
To tyle, pisząc ten poradnik chciałem jedynie mniej więcej przybliżyć Wam na czym polega system rejestracja i logowanie na stronie Internetowej.
Gotowiec:
http://blog.grabowski.ostrowwlkp.pl/wp-content/uploads/2010/11/test.zip
12 marca 2010 dnia 11:30
Bardzo fajny skrypcik, ale prosiłbym bardzo o dodanie funkcji mail(), ponieważ nie do końca wiem, jak mam to zrobić. Z góry dziękuję za poświęcony czas
13 marca 2010 dnia 18:14
No brawo! ładnie napisane! U mnie wszystko działa… 😉
13 marca 2010 dnia 22:40
Nie trzeba było w switchu podawać pustego case oraz case ”glowna’
Wystarczy na końcu dać default: include(‚logowanie.php’); break;
19 marca 2010 dnia 17:40
Witam wszystkich, a jak oceniacie ten skrypcik pod względem bezpieczeństwa? i co sam autor może powiedzieć na temat bezpieczeństwa tego skryptu? bo jak wiecie w internecie jest pełno chamów którzy chcą tylko zniszczyć pracę innych ludzi. Z góry dziękuje i pozdrawiam
20 marca 2010 dnia 10:12
@Matiiii
Funckje mail() masz bardzo ładnie opisaną w manualu, wraz z przykładami http://www.php.net/manual/pl/function.mail.php
@Unnamed
Miło mi, że się podoba 😉
@Łukasz
Fakt, cenna uwaga
@Nori19
Osobiście uważam, że skrypt jest bezpieczny. Do filtracji danych użyłem funkcji addslashes() oraz htmlspecialchars(), co uniemożliwi atak XSS oraz SQLI. Skrypt sprawdza także takie drobnostki jak poprawność adresu e-mail, czy też informuje o tym, czy dany nick, bądź e-mail jest już zajęty. Hasła są szyfrowane algorytmem MD5.
Jeśli będzie potrzeba to z chęcią rozbuduje ten skrypt w niedalekiej przyszłości o weryfikacje rejestracji przez system captcha oraz dodam potwierdzenie założenia konta poprzez e-mail.
Pozdrawiam 🙂
28 marca 2010 dnia 11:51
Skrypt nie działa. Nie odczytuje wyników z bazy danych, mimo poprawnego ich wprowadzenia
28 marca 2010 dnia 14:38
@andrzejlech musisz mieć jakiś błąd, skrypt jak widać działa kolegą 😉
7 maja 2010 dnia 16:49
Witam świetny skrypt pozdrawiam link do tej strony oczywiście podam na moje
🙂 pozdrawiam
8 maja 2010 dnia 13:57
Witam, bardzo fajny skrypcik – takiego szukałem. Dzięki wielkie.
Tylko jak by jeszcze więcej o tym adminie napisać, bo nie działa mi to (zawsze pokazuje ‚jestes administratorem’) albo coś źle robię
8 maja 2010 dnia 14:31
Przeanalizuj raz jeszcze kod. Na pewno masz jakąś głupią literówkę 😉
10 maja 2010 dnia 15:13
OK, już wszystko działa, jeszcze raz wielkie dzięki
18 maja 2010 dnia 17:02
nie piszcie, że jestem idiotom, bo to wiem, ale jeżeli coś z tego zrozumiałem to góra 1% ;(
2 czerwca 2010 dnia 10:14
nie moge połączyć sie z baza tzn:
na stronie wszystko sie wyświetla i „niby działą”
wprowadziłem ręcznie przez phpMyAdmin konto z loginem i hasłem
niestety nie moge sie zalogować, nie odnajduje mojego loginu z bazy;/
tak samo nie moge zarejestrować nowego użytkownika.
chyba taki sam problem jak u andrzejlech
prosze o pomoc
2 czerwca 2010 dnia 14:40
@olodsw – sprawdź proszę wielkość liter loginu oraz poprawne dane dotyczące połączenia z MySQL
6 czerwca 2010 dnia 19:31
Mam taki problem ze jak zmienie w style.css
body {
margin: 0 auto;
width: 800px;
}
na
body {
background: url(bg.jpg);
font-family:
Tahoma,sans-serif;
font-size: 12px;
color: #000; }
To edycja.php raz sie pokazuje a raz nie o co chodzi?
6 czerwca 2010 dnia 20:05
Zmiana styli CSS nie ma wpływu na działanie skryptu
30 listopada 2010 dnia 14:49
Mi nie działa 😮 wszędzie błąd wychidzi 😮
czy może ktoś rzucić to na jakiegoś up’a?
Chyba źle to robię :O
30 listopada 2010 dnia 15:57
Porozmawialiśmy sobie i jednak działa 😉
16 grudnia 2010 dnia 18:22
witam
bardzo dobry skrypt mi wszystko dziala bardzo prosze tylko o to jakby ktos mi mogl zroic cos w stylu moj profil zeby bylo widac jak wyglada i to co inni beda widzieli
4 stycznia 2011 dnia 07:57
Witam
A może zastsosowanie tej sesji po zalogowaniu, na jakieś przykładowej podstronie… W sensie, jesli zalogowany to widzi więcej, jak nie to… coś
4 stycznia 2011 dnia 14:07
Przykładem tego typu strony jest chociażby logowanie. Jeśli sesja istnieje, to wyświetla się komunikat, że jest się zalogowanym. Jeśli sesja nie istnieje, to wyświetla się formularz logowania.
4 stycznia 2011 dnia 12:15
tzn jak teraz chce dodac przekierowanie na strone glowna po poprawnym zalogowaniu: do pliku logowanie.php dodaje linijkę:
header(‚Location: http://localhost/mainbaza.php‚);
i pokazuje mi błąd:
Warning: Cannot modify header information – headers already sent by (output started at C:Program FilesVertrigoServwwwindex.php:)
o co tu biega? chyba chodzi o session_start(), no ale tego nie moge wywalic …
4 stycznia 2011 dnia 14:08
Może chodzi o umieszczenie funkcji ob_flush() na początku pliku. http://php.net/manual/en/function.ob-flush.php
5 stycznia 2011 dnia 08:09
byłbyś tak miły i mógł napisać, gdzie to dokładnie wstawić?
6 stycznia 2011 dnia 22:32
Na początku pliku 🙂
10 stycznia 2011 dnia 12:50
Hmm ok po dodaniu na początku pliku index.php:
przekierowuje po zalogowaniu na stronę mainbaza.php …
header(‚Location: http://localhost/mainbaza.php‚);
jednak, gdy jestem na tej stronce (to jest strona główna zawierająca linki do innych stron-takie menu). Klikam na odnośnik do innej stronki, na której mam kodzik opatrzony w klamry:
if(isset($_SESSION[‚login’])) {
moj kod strony
}
else {
echo’Aby mieć dostęp do tej strony musisz być zalogowany‚;
}
jednak zawsze przechodzi do else… Co moze byc przyczyna?
10 stycznia 2011 dnia 13:31
Najprawdopodobniejszą przyczyną występowanie takiego błędu logicznego to brak funkcji session_start() na początku pliku, do którego chcesz przejść i sprawdzić, czy sesja istnieje. Innym błędem może być fakt, że sesja o nazwie ‚login‚ nie istnieje.
12 stycznia 2011 dnia 08:19
No tak, ale przecież sesja u mnie zaczyna się od zalogowania, tzn nie potrzebuję rozpoczynać nowej sesji w tym pliku.php ponownie, ponieważ powinien już widzieć zmienną login, tak jak np widzi to strona edycja.php…
13 stycznia 2011 dnia 14:01
session_start() ma za zadanie podtrzymać istniejące sesje. Jeśli wejdzie się do pliku, w którym nie ma tej funkcji, to tak jakby nie było sesji.
13 stycznia 2011 dnia 14:45
czyli oprocz tego ze dam w skrypcie logowania session_Start() to musze jeszcze dac w kazdym pozostalym pliku? Myslalem, ze tylko w jednym sie daje..
14 stycznia 2011 dnia 07:25
Człowiek uczy się całe życie 😉
14 stycznia 2012 dnia 18:30
Witam, wszysztko fajnie super:) ale.. rangi cos nie dzialaja;/
sprawdzalem zmieniajac od 1 do 10 numerki, i niestety zawsze wypisane jest, „jestes administratorem” nawet jezeli jestem wylogowany… co tu moze byc nie tak? bardzo prosilbym o poomoc:)
14 stycznia 2012 dnia 18:34
Sprawdź co masz w $_SESSION[‚ranga’]. Pewnie w tym leży problem. Administrator powinien mieć większą rangę, niżeli zwykły użytkownik.
if($_SESSION['ranga'] == 5) { echo "ranga to 5";}
14 stycznia 2012 dnia 18:47
wybacz, ze pytam, ale gdzie mam to sprawdzic? w pliku?
bo sciagnalem, ta paczke, ktora jest na samyym dole tutoriala, wrzucilem, i chcialem sprawdzic, czy pokaze poprawnie wartosci… wybacz, ale poczatkujacy webmajster jestem:)
14 stycznia 2012 dnia 18:52
Rozumiem. Wejdź zatem do utworzonej przez Ciebie tabeli w PhpMyAdmin i zmień rangę dla użytkownika, który ma być administratorem z „1” na „10”. Nie zapomnij, że każdy plik, w którym mają być sesje musi posiadać na początku < ?php session_start(); ?>
14 stycznia 2012 dnia 19:11
tak, pamietam:)
hm, wiec zmienilem.. i jest teraz tak:
jezeli wykonam jakikolwiek numer od 1 do 10, i jestem zalogowany, to widze napis: nie jestes administratorem.
po wylogowaniu, wchodzac na ta strone, na ktorej ma byc ta informacja, dostaje informacje, ze jestem administratorem..
zawsze jest jakis problem:P
14 stycznia 2012 dnia 19:16
aha, po usunieciu z tego pliku session start, niezaleznie od numerow czy wylogowania, ponownie pokazuje zawsze i wszedzie, ze „jestes admisnistratorem”..
14 stycznia 2012 dnia 19:16
Widzę błąd w moim skrypcie… W ifie jest zły warunek, zmień go na taki
if($_SESSION['ranga'] >= 5) {
Ranga nadawana jest przy logowaniu. Najpierw zmień rangę w bazie danych (na 10), a następnie zaloguj się na to konto, aby nowa ranga była zapisana w sesji. To powinno pomóc.
PS. Jeśli nie będziesz zalogowany, bądź Twoja ranga nie będzie >=5 to wyświetli się napis, że nie jesteś administratorem.
Jeśli dalej będą problemy to sprawdź czy sesja istnieje (w tym pliku, w którym sprawdzasz rangę admina)
if(isset($_SESSION['ranga']) && !empty($_SESSION['ranga'])) { echo"jest ok"; }
14 stycznia 2012 dnia 19:30
ooo no wlasnie:) zastanawialo mnie to, gdyz po rejestracji byle jakiej osoby zawsze przeciez dostawal range 1, wiec adminowa:) dzieki piekne!
zmienilem jak napisales, i teraz ponizej 5 to zwykly user, a 5 i wiecej to admin.
a jeszcze jedno pytanie, bo chcialbym dorobic sobie tutaj panel administratora, do edycji uzytkownikow, zmieniania im rangi z usera na admina, jak i pozniej dodac panel z newsami, i innymi takimi… wiec tylko do tego sprawdzania, na kazdej stronie, dodac opcje dla rangi? czy jakos inaczej to ma wygladac?
a jeszcze jedno pytanko, czy jezelibym chcial zrobic range moderator, czyli cos pomiedzy, to jest taka mozliwosc by jakos to tu dorobic? oczywiscie nie gmerajac, za duzo w kod?
14 stycznia 2012 dnia 19:36
Ad. 1. Tak dokładnie tak ma to wyglądać. Sprawdzając rangę wiesz, czy możesz wyświetlić panel admina, czy też nie.
Ad. 2. Możesz wykorzystać rangi jako
1 – zwykły user
2 – VIP
3 – moderator
4 – wice admin
5 – admin
6 – komeniusz 🙂
A następnie sprawdzać w kodzie wartość sesji z rangą w zależności od której wyświetlisz dany element, bądź nie.
Np.
if($ranga >= 4) { kod }
Kod będzie dostępny tylko dla użytkowników z rangą 4 i wyższą.
14 stycznia 2012 dnia 19:40
reweka! mega dzieki:)
jeszcze mam pytanko jezeli bym chcial tylko dla danej rangi ustalic cos, to zamiast >=4 moge uzyc samego =4 ?
14 stycznia 2012 dnia 19:41
Konkretniej to ==
Jak najbardziej tak 🙂
14 stycznia 2012 dnia 19:53
no to super:)
ale teraz nowe pytanie znow mi wyskoczylo…
jezeli chcialbym, aby menu zmienialo sie wraz ze zmiana osoby (z odpowiednia ranga), to mozna jakos ten top zmodyfikowac do tego? nie wiem, moze uzywajac tego:
if($ranga >= 4) { menu dla 4 }
i tak dla kazdej rangi osobno?
14 stycznia 2012 dnia 20:08
switch($ranga){
case 1:
menu dla rangi 1;
break;
case 2:
menu dla rangi 2;
break;
[...]
default:
menu dla innych rang, badz osob niezalogowanych
}
Zrób jak CI wygodniej 🙂
14 stycznia 2012 dnia 20:24
hmmm ale w top.php?
bo probowalem, ale cos nie bardzo to idzie.. :/
14 stycznia 2012 dnia 20:31
wiec, zrobilem tak na test, zakladajac, ze mam range „3”:
<?php
switch($ranga){
case 1:
echo 'menu dla rangi 1';
break;
case 2:
echo 'menu 2';
break;
case 3:
echo 'Edycja profilu
Wylogowanie‚;
break;
default:
echo ‚Menu:
Logownaie
Rejestracja‚;
break;
}
?>
i jak jestem zalogowany, to widze: Logowanie, Rejestracja Już jestes zalogowany….
hmm.. co jest nie tak?
14 stycznia 2012 dnia 20:36
A przypisałeś zmiennej $ranga jakąś wartość?
$ranga = $_SESSION['ranga'];
14 stycznia 2012 dnia 20:47
ah! widzisz, bledy poczatkujacych:) sadzilem, ze jednak skads juz to pobiera:P
ale juz smiga pieknie:)
to na dzis mi tyle wystarczy:) dzieki wielkie!
ale czuje, ze bede mial jescze wiele pytan.. 😀
14 stycznia 2012 dnia 23:13
ajj, a jednak nie moge dzis przestac:P
zastanawiam sie nad wprowadzeniem opcji zmiany hasla, i dodaniem avataru do profilu, plus zrobienie proflu usera, takiego publicznego.
najwiekszy problem to z haslem bede mial… bo jest ono kodowane w md5 :/ i nie mam pojecia jak sie do tego zabrac.. moze jakies wskazowki? bo zwykle update to bez sensu chyba? bo wtedy ono po zmianie, nie zostanie zakodowane..
a ja pobawie sie z avatarami i profilami 🙂
15 stycznia 2012 dnia 10:19
Zmiana hasła powinna polegać na:
1. Pobierasz od użytkownika aktualne hasło
2. Szyfrujesz wprowadzone hasło $haslo = md5($_POST[‚haslo’]);
3. Porównujesz wprowadzone hasło z tym w bazie danych
Jeśli hasło wprowadzone zgadza się z tym w bazie:
4. Pobierasz nowe hasło i potwierdzenie nowego hasła
$nowe_haslo = md5($_POST[‚nowe_haslo’]);
$nowe_haslo_2 = md5($_POST[‚nowe_haslo_2’]);
Jeśli i te hasła się zgadzają if($nowe_haslo == $nowe_haslo_2) robisz update do bazy danych z wartością $nowe_haslo.
23 lutego 2013 dnia 00:32
W jakim pliku znajdę ten kod ??
if($_SESSION['ranga'] >= 5) {
echo'jesteś administratorem ';
} else {
echo'Nie jesteś administratorem ;-(';
}
23 lutego 2013 dnia 13:47
Obawiam się, że w żadnym z dostępnych w gotowcu
12 stycznia 2014 dnia 23:22
Skrypt działa prawidłowo, lecz mam problem.
Pomimo tego, że mam rangę 5 wyświetla mi się informacja „Nie jesteś administratorem”.
17 stycznia 2014 dnia 22:03
Sprawdź, czy aby na pewno – echo $_SESSION[‚ranga’]
2 lutego 2014 dnia 15:01
Bardzo fajny gotowy skrypt. Ale jeśli się zaloguję poprawnie i kliknę na zakładkę ?strona=logowanie to wyświetla mi się „Jesteś już zalogowany jako !”. A to oznacza, że gubi się gdzieś zmienna $_SESSION[‚login’]. $_SESSION[‚haslo’] i $_SESSION[‚ranga’] wyświetla się poprawnie. Oznacza to, że gdzieś $_SESSION[‚login’] zostaje błędnie nadpisana. Jakieś pomysły co do tego?
8 lutego 2014 dnia 12:05
W trakcie testów nie wykryłem tego błędu. W kodzie również nie widzę żadnego, spróbuj się wylogować i zalogować jeszcze raz.
9 lutego 2014 dnia 18:05
Taki błąd miałem tylko na webservie. Na hostingu już problemu nie było. Tak więc nie było tematu 🙂
2 lutego 2014 dnia 15:10
Aha i warto dodać:
mysql_query(„SET CHARSET utf8”);
mysql_query(„SET NAMES `utf8` COLLATE `utf8_polish_ci`”);
6 stycznia 2016 dnia 12:53
Mam taki błąd:
” Blad podczas wybierania bazy. Jesli mozesz to poinformuj o tym administracje. Sprobuj takze odswiezyc strone. ”
Co należy zrobić aby już nie występował? 🙂
6 stycznia 2016 dnia 17:49
Podaj prawidłowe dane do bazy danych 🙂