Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Sesje logowanie i rangi
Forum PHP.pl > Forum > Przedszkole
Kalysto
Witam. Mam taki problem otóż staram się napisać skrypt logowania oparty na rangach (user, admin, mod). Rangi są zawarte w MYSQL. Wygląda to tak iż w bazie w tabeli są kolumny admin, mod (INT) jeśli wpiszesz 1 to jesteś adminem lub modem, jeśli 0 to nie. Ale problem leży w tym że nie wiem zbytnio jak napisać skrypt w logowaniu który sprawdzałby czy użytkownik jest admin, mod lub user i uruchamiał sesję wraz z odpowiednimi prawami. Proszę o wskazówki i pomoc:)

Jeśli temat umieściłem w złym miejscu najmocniej przepraszam iż jestem tu nową osobą.
kill15
przypisz do innej sesji rangę a potem np

  1.  
  2. $ranga = $_SESSION['ranga'];
  3. // tu np
  4.  
  5. $admin = '1';
  6. $user = '0';
  7. $mod = '2';
  8.  
  9.  
  10. if($ranga == '$admin')
  11. {
  12. echo "jestem adminem !!";
  13. }
  14. elseif ($ranga == '$user')
  15. {
  16. echo "jestem tylko userem :(";
  17. }
  18. elseif ($ranga == "$mod")
  19. {
  20. echo "jestem modem";
  21. }
  22. else
  23. {
  24. echo "nie jestem żadnym z powyższych";
  25. }



Tutaj skrypt rejestracji/logowania z mysql:

http://www.eioba.pl/a/1u8h/rejestracja-i-logowania-phpmysql

W pliku login zrób sobie zapytanie dodatkowe pobierające range i przypisz do sesji wynik.

  1. $zapytanie2= mysql_num_rows(mysql_query("SELECT ranga FROM user WHERE login='$konto' and password ='$password'"));
  2. //i dalej w tym przypadku w warunku if ($ile==1) dajesz jeszcze
  3.  
  4. $_SESSION['ranga']=$zapytanie2;


W rejestracji:

  1. $zapytanie="INSERT INTO user (login,password,ranga) VALUES('$konto','$password','0')"; //0 to będzie twoja ranga user


To jest do tego skryptu który podałem ale myślę że nie sprawi Ci problemu wstawić to do swojego
lukaskolista
Cytat
przypisz do innej sesji rangę a potem
nie bardzo... po cholere? Robisz tabela z relacja N:N z tabela uzytkownikow w ktorej robisz relacje user - ranga i pozniej pobieraz wszystkie ranki dla zalogowanego usera i sprawdzasz, czy ma wymagana range do wykonania konkretnej akcji.
kill15
lukaskolista
z tego:
Cytat
uruchamiał sesję wraz z odpowiednimi prawami.

zrozumiałem że chce rangę do sesji dałem odp a po co mu tak questionmark.gif to mnie nie obchodzi smile.gif
Kalysto
Chodzi mi konkretnie o to że miałem gdzieś kiedyś skrypt lecz zgubiłem. I działał na zasadzie właśnie true, false na dwóch kolumnach w tabeli admin, mod. I gdy sie logowałeś, to w trakcie logowania sesja sprawdzała czy jestes admin czy mod i przekierowywała dalej wyświetlając odpowiednio PA lub PM. Nie wiem czy to zrozumiałe co napisałem ;/
Ulysess
po 1pierwsze typ dla pola rangi to tinyint bo po co zakres od ~-2,1 do 2,1 mld skoro mozna miec od -127 do 127 ?
po 2 ja to bym zrobil tak.. masz tabele users i tam trzymasz id_acc login haslo e-mail czy tam jakie chcesz dane i dodatkowo 2 tabele rangi i w niej trzymal bys id_acc ( id_acc z tabeli rangi jest rowne id_acc z tabeli users) oraz range czyli np 1 admin 2 gm 3 mod czy jakie tam chcesz. I przy logowaniu po tym jak sprawdzisz czy login i haslo jest poprawne sprawdzasz czy w tabeli rangi wystepuje id danego konta jesli tak to pobierasz wartosc czyli czy to admin ........ jesli nie ma takiego id w tabeli rangi to przekierowywujesz na podstrone dla zwyklych jesli jest to sprawdzasz jaki to typ konta i tez przekierowywujesz na strone ktora tobie pasuje.

gdybyś nie wiedział użyj tej funkcji przy sprawdzaniu czy dane id wystepuje w tabeli rangi -> mysql_num_rows - funkcja Toie zwroci wartosc czy te id wystepuje w tej tabeli , jesli zwroci 0 tzn ze nie ma w niej takiego id.

dodam jeszcze tyle ze chyba LEFT JOINa mozna uzyc przy sprawdzaniu czy id jest ale tu nie mam pewnosci i nie chce ci mieszac wink.gif oraz tinyint mozesz zastapic enum (jak kto lubi)
Kalysto
Tak wygląda moja tabelka.

  1. --
  2. -- Struktura tabeli dla `konta`
  3. --
  4.  
  5. CREATE TABLE IF NOT EXISTS `konta` (
  6. `nr` int(11) NOT NULL AUTO_INCREMENT,
  7. `login` varchar(20) NOT NULL,
  8. `haslo` varchar(20) NOT NULL,
  9. `email` varchar(50) NOT NULL,
  10. `mod` int(1) NOT NULL DEFAULT '0',
  11. `admin` int(1) NOT NULL DEFAULT '0',
  12. PRIMARY KEY (`nr`)
  13. ) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;
  14.  
  15. --
  16. -- Zrzut danych tabeli `konta`
  17. --
  18.  
  19. INSERT INTO `konta` (`nr`, `login`, `haslo`, `email`, `mod`, `admin`) VALUES
  20. (1, 'Test', 'test', 'test@test.pl', 0, 0);


A tak wygląda mój plik login.php :

  1. <?php
  2. ?>
  3. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
  4. "http://www.w3c.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  5. <html xmlns="http://www.w3c.org/1999/xhtml" xml:lang="pl" lang="pl">
  6. <head>
  7. <meta http-equiv="content-type" content="text/html; charset=iso-8859-2" />
  8. <title>#</title>
  9. </head>
  10. <body>
  11. <br><br><br><br><br><br><br><br><br>
  12. <?
  13.  
  14. include("config.php");
  15.  
  16. if(isset($_SESSION['zalogowany'])) {
  17. echo "Witam, ".$_SESSION['login'];
  18. }else{
  19.  
  20. if(isset($_POST['wyslij'])) {
  21.  
  22.  
  23. if(mysql_num_rows(mysql_query("SELECT login, haslo
  24. FROM konta WHERE login = '".$_POST['login']."'
  25. && haslo = '".$_POST['haslo']."' ")) > 0) {
  26.  
  27.  
  28. if(mysql_num_rows(mysql_query("SELECT nr FROM konta
  29. WHERE login = '".$_POST['login']."'
  30. && haslo = '".$_POST['haslo']."' ")) > 0 ) {
  31.  
  32. $_SESSION['zalogowany'] = true;
  33. $_SESSION['login'] = $_POST['login'];
  34. $_SESSION['haslo'] = $_POST['haslo'];
  35.  
  36. echo "<hr><center>";
  37. echo 'Zostałeś zalogowany. Za chwilę zostaniesz przeniesiony na stronę <a href="index.php">główną</a>.';
  38. echo "<script>setTimeout('document.location = \"index.php\"', 1000);</script>";
  39. echo "</center><hr>";
  40.  
  41.  
  42.  
  43.  
  44. } else {
  45.  
  46. echo "Złe hasło, proszę spróbować ponownie";
  47. }
  48. } else {
  49. echo "Nie ma takiego użytkownika";
  50. }
  51. } else {
  52.  
  53. ?>
  54. <form method='POST' action='logowanie.php'>
  55. <b>nazwa uzytkownika:</b> <input type='text' name='login'><br>
  56. <b>haslo:</b> <input type='password' name='haslo'><br>
  57. <input type='submit' value='Wyœlij' name='wyslij'>
  58. </form>
  59.  
  60. <?php
  61. }
  62. }
  63. ?>




i nie mam pojęcia co i jak mam dopisać żeby sprawdzało i odpowiednio nakierowywało na rangi żeby potem w indexie móc dać
  1.  
  2. if ($_SESSION['admin'] == 1) {
  3. print "PA";
  4. }
  5. if ($_SESSION['mod'] == 1) {
  6. print "PM";
  7. }

etc. lub coś podobnego do tego.

Nie wiem czy to sensowne, ale chce to zrobić w jednej tabeli a nie bawić sie w relacje czy inne pierdółki na bazie 15 tabel.



Ulysess
co do Twojego skryptu po 1 po co 2x dajesz praktycznie te samo zapytanie czyli wpierw wyciagasz login i haslo a poźniej nr ? - zrob to w 1
po2 do sesji ja bym proponowal przypisac zalogowany = 1; $_SESSION['user_id'] = $wynik_z_bazy

co do rangi to daj to zapytanie nad sesjami gdzie tworzysz zmienne i zrob tak ze dajesz:
SELECT `ranga` from `rangi` WHERE `id_acc` = $id_pobrane_z_zapytania

nastepnie dajesz
$wynik = mysql_num_rows($zapytanie);

if($wynik > 0)
{
$ranga = mysql_fetch_assoc($zapytanie);
$_SESSION['ranga'] = $ranga['ranga'];
}
kill15
no ludzie po co wy sobie życie utrudniacie questionmark.gif

zamiast admin i mod w tabeli zrób sobie 1 kolumne nazwij ją ranga daj jej typ int albo varchar
jak int to 1 - mod , 2 - admin.
Gdy już user jest zalogowany to robisz zapytanie
  1. $zapranga=mysql_query("SELECT ranga FROM konta WHERE login='$login'");
  2.  
  3. $rang=mysql_fetch_array($zapranga);
  4.  
  5.  
  6. if ($rang['ranga'] == '2' ) // jeśli wybrales varchar to za 2 daj admin
  7. {
  8. echo "admin";
  9. }
  10. elseif($rang['ranga'] == '1') // jeśli wybrales varchar to za 2 daj mod
  11. {
  12. echo "mod";
  13. }
  14. else
  15. {
  16. echo "zwykle szaraki i pustaki";
  17. }
Ulysess
Cytat(kill15 @ 17.04.2011, 01:28:19 ) *
no ludzie po co wy sobie życie utrudniacie questionmark.gif


może po to aby było wydajnie questionmark.gif

skoro w polu ranga będą trzymane wartości 1-5 a niech bedzie nawet 1-10 to po jakiego ...... ustawiać typ int questionmark.gif :|

2) przypuśćmy masz 100 tyś uzytkownikow/kont z tego 99 tyś 990 to zwykli użytkownicy a pozostała 10 to mod,gm,admin - widzisz sens trzymania pola ranga w takiej tabeli questionmark.gif pomijajac fakt że tak łatwiej , wygodniej..
kamaZ
ja u siebie zrobilem osobny plik: "uprawnienia.php",
w którym to nadaje wlasnie uprawnienia,
wyglada to nastepujaco:
  1. Uzytkownicy: <br /> <select name="uzytkownicy">
  2. <?php
  3. $sql = "SELECT * FROM users";
  4. $result = $mq($sql) or die(mysql_error());
  5.  
  6. while ($row = mysql_fetch_object($result)) //1
  7. {
  8. echo "<option value=\"$row->id\">$row->login</option>";
  9. }
  10. ?>
  11. </select>
  12.  
  13. <select name="uprawnienia"> //2
  14.  
  15.  
  16.  
  17. <option value="0" name="nazwa0">Uzytkownik</option>
  18. <option value="1" name="1">Admin głowny</option>
  19. <option value="2" name="2">Mod 1</option>
  20. <option value="3" name="3">Mod 2</option>
  21. <option value="4" name="4">Mod 3</option>
  22. <option value="5" name="5">Mod 4</option>
  23.  
  24. </select>
  25.  
  26. <input type="submit" name="subupr" value="ok">
  27. </form>
  28.  
  29. <table>
  30. <tr>
  31. <td>user<td> <td>0</td>
  32. </tr>
  33. <tr>
  34. <td>glowny<td> <td>1</td>
  35. </tr>
  36. <tr>
  37. <td>Mod1<td> <td>2</td>
  38. </tr>
  39. <tr>
  40. <td>Mod2<td> <td>3</td>
  41. </tr>
  42. <tr>
  43. <td>Mod 3<td> <td>4</td>
  44. </tr>
  45. <tr>
  46. <td>Mod 4<td> <td>5</td>
  47. </tr>
  48. </table>
  49.  
  50.  
  51.  
  52.  
  53. <?php
  54.  
  55. if (isset($_POST['subupr'])) { // jezeli zostal wyslany formularz
  56. $uprawnienie = $_POST['uprawnienia']; //3
  57. $user = $_POST['uzytkownicy'];
  58.  
  59. $sql = "UPDATE users SET uprawnienia = '$uprawnienie' where id = '$user'" or die (mysql_error()); //4
  60. $wynik = $mq ($sql);
  61. }
  62.  
  63. ?>

1. wyszukuje uzytkownikow w bazie danych aby ich wyswietlic w selekcie
2. Kolejny select - juz z konkretnymi uprawnieniami
3. zmienna $uprawnienie przyjmuje wartosc wyslanemu uprawnieniu
4. I juz aktualizacja tabeli w bazie danych - gdzie uprawnienia przyjmuje wartosc wyslanemu uprawnieniu

Teraz kolej na przypisanie jeszcze sesjii:
  1.  
  2. $sql1 = "SELECT * FROM users where login ='$login' AND haslo ='$haslo' AND uprawnienia ='1'";
  3.  
  4. $wynik1 = $mq($sql1);
  5.  
  6. if (mysql_fetch_assoc($wynik1)) { // jezeli uprawnienie ma wartosc 1 to sesja admin przyjmuje wartosc 1
  7. $_SESSION['admin'] = 1;

I teraz w kazdej podstronie do ktorej dostep ma miec admin dajemy
  1. <?php
  2. if (@$_SESSION['admin'] == 1)
  3. { echo"do tego ma dostep tylko admin";
  4. }
kill15
Cytat(Ulysess @ 17.04.2011, 09:24:48 ) *
może po to aby było wydajnie questionmark.gif

hmm:


Cytat
Nie wiem czy to sensowne, ale chce to zrobić w jednej tabeli a nie bawić sie w relacje czy inne pierdółki na bazie 15 tabel.
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.