Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP+MySQL]Pomoc przy skrypcie
Forum PHP.pl > Forum > Gotowe rozwiązania
Lerno
Od dluzszego czasu pisalem skrypty w php oparte na plikach, dzialaly dobrze i sie sprawdzaly. Teraz jednak chce liznac bazy danych np: mysql. Napisalem jakis czas temu logowanie i chcialbym teraz je przerobic na mysql. Stworzylem baze i tabele w mysqlu i teraz pisze pod nia skrypt. Niedziala. Tzn. logowanie dziala niby, ale po tym jak sie zaloguje jakbym gubil sesje, albo raczej polaczenie z baza, czy... cos tam innego sie psuje. W kazdym razie logowanie przebiega poprawnie, ale po zalogowaniu czego bym nie zrozobil zwraca mi ze jestem niezalogowany i koniec. Moze trzeba zapisywac w bazie stan? Na plikach dzialalo mi w takiej postaci, na mysqlu juz nie.

Oto skrypt (miedzy /**/ umiescilem tez kod ktory pobiera dane z pliku i uzywajac tej weryfikacji zamiast bazy skrypt bedzie dzialal poprawnie.)

  1. <?php
  2.  $zalogowany = &#092;"false\";
  3.  if(isset($_POST['login'])) $login = $_POST['login'];
  4.  else  $login = @$_SESSION['login'];
  5.  if(isset($_POST['pass'])) $pass = $_POST['pass'];
  6.  else  $pass = @$_SESSION['pass'];
  7.  
  8.  $db_info['host'] = &#092;"localhost\";
  9.  $db_info['user'] = &#092;"xxx\";
  10.  $db_info['pass'] = &#092;"xxx\";
  11.  $db_info['db']  = &#092;"xxx\";
  12.  $db_connection = mysql_pconnect($db_info['host'], $db_info['user'], $db_info['pass']) or die(mysql_error());
  13. if(!$db_connection) $db_status = false;
  14.  $db_select = mysql_select_db($db_info['db'], $db_connection) or die(mysql_error());
  15. if(!$db_select) $db_status = false;
  16.  
  17.  if((isset($_POST['login']))&amp;&amp;(isset($_POST['pass']))){
  18. $login = addslashes($_POST['login']);
  19. $pass = addslashes($_POST['pass']);
  20. if(!isset($db_status) || $db_status !== false){
  21.  $query = mysql_query(&#092;"SELECT * FROM `user` WHERE `login`='\".$login.\"' AND `pass`='\".$pass.\"';\");
  22.  if(mysql_num_rows($query) == 1){
  23. $zalogowany = &#092;"true\";
  24. $_SESSION['login'] = $login;
  25. $_SESSION['pass'] = $pass;
  26. $wiersz = mysql_fetch_array($query);
  27. $_SESSION['name'] = $wiersz['name'];
  28. $_SESSION['email'] = $wiersz['email'];
  29. $user_logged = $wiersz['level'];
  30.  }
  31. }  
  32.  }
  33.  /*
  34.    // wczytujemy liste userow z pliku oraz dokonujemy weryfikacji
  35.    if(file_exists('users.dat')){
  36. $users_file = file('users.dat');
  37. $users_amount = count($users_file);
  38.  // haszujemy haslo
  39. $passmd5 = md5($pass);
  40.  
  41. while(list($key, $val) = each($users_file)){
  42.  $user_line = explode('||', trim($val));
  43.  if(($user_line[1] == $login)&amp;&amp;($user_line[2] == $passmd5)){
  44. $zalogowany = \"true\";
  45. $_SESSION['login'] = $login;
  46. $_SESSION['pass'] = $pass;
  47. $user_logged = $user_line;
  48.  }
  49. }
  50.    }
  51.    */
  52.  // jesli sie niezalogowal
  53.  if($zalogowany == &#092;"false\"){
  54. echo '<dl><dt>Logowanie</dt><dt>•<a href=\"index.php?id=1\">Zaloguj</a></dt></dl>';
  55. $text = '';
  56. if(isset($_GET['id']) == &#092;"1\"){
  57.  // form logowania
  58.  echo'<div >Zaloguj się.</div><div ><form action=\"index.php\" method=\"post\"><div>&amp;nbsp;</div><div >Login:<br /> <input class=\"pola_input\" type=\"password\" name=\"login\" value=\"\" /></div><div >Hasło:<br /> <input class=\"pola_input\" type=\"password\" name=\"pass\" value=\"\" /><br /><input type=\"submit\" value=\"Zaloguj\" /></div></form></div>';
  59. }
  60.  }
  61.  // jesli sie zalogowal to
  62.  if($zalogowany == &#092;"true\"){
  63. //opcja wylogowania
  64. echo '<dl><dt><span>Wylogowanie</span></dt><dt><span>•</span> <a href=\"index.php?id=logout>Wyloguj</a></dt><dt>&amp;nbsp;</dt>';
  65. if(@$_GET['id'] == 'logout'){
  66.  echo 'Wylogowano użytkownika. W celu ponownego zalogowania kliknij <a href=\"index.php?id=1\" title=\"przelogowanie\">tutaj</a>';
  67. }
  68. // ustanawiamy poziom dostepu
  69. if($user_logged == '1')  $status = 'update';
  70. else if($user_logged == '2')  $status = 'moderatorek';
  71. else if($user_logged == '3')  $status = 'adminek';
  72. else{
  73.  echo 'Zostałeś/łaś wylogowany/a! W celu próby ponownego zalogowania się kliknij <a href=\"adm.php?id=1\" title=\"Zaloguj się\">tutaj</a>.';
  74. }
  75.  
  76. if($status == 'update'){
  77.  echo '<dt><span>Podstawowe</span></dt><dt><span>•</span> <a href=\"'. $_SERVER[&#092;"PHP_SELF\"] .'?id=1\">Dzial</a></dt>';
  78.  if(@$_GET['id'] == &#092;"1\"){
  79. echo 'Sztama!';
  80.  }
  81. }
  82. // itd...
  83.  }
  84. ?>


Moze widzicie co robie zle. Z gory dzieki.


__________________
Moderated by Bakus: Wykorzystuj właściwe znaczniki BBCode
Strzyzyk_MC
Wiesz co.... Bardzo probowalem sie skupic ale skrypt jak dla mnie malo czytelny i strasznie zamotany.... Nie lepiej bedzie zrobic od nowa dla logowania na db ?tongue.gif

A tak na logike... Jesli Ci "gubi" logowanie to zobacz czy poprawnie zostaja zapisane zmienne w sesjach.. Jesli sa dobrze zapisywane to wiadomo ze cos z ich odczytem jest zle ... Wszystko niby na chlopski rozum a moze wiele pomoc winksmiley.jpg
Lerno
Od nowa chetnie bym napisal, ale wlasnie nie wiem za bardzo w czym tkwi problem.
Bo tu sie loguje, podejrzewam ze chodzi bardziej o polaczenie z baza, niz sesje. Chociaz... kurcze nie wiem.

Skrypt poprostu:
-sprawdza czy sa dane wpisane z formularza, lub czy istnieje sesja.
-potem polaczenie z baza
-jak sa zmienne to sprawdza czy baza znajdzie wynik odpowiedni
-jak znajdzie to przypisuje dane do sesji i dalej to juz wiadomo...

Po zalogowaniu jednak kazde przejscie na strone inna to zmienna ustawiona po skutecznym logowaniu na true zmienia sie na false ($zalogowany).

Moze ktos inny wie gdzie tkwi blad?
Strzyzyk_MC
No to moze zrob tak:
Nie wiem jak przechodzisz do kolejnych stronek ale zrob w ten sposob: index.php?action=jaka_nazwa i teraz w tym samym pliku dodaj np. cos takiego:
  1. <?php
  2. if(zalogowany) {
  3.  switch($_GET['action']) {
  4.  case 'jaka_nazwa':
  5.  include('strona.inc.php');
  6.  break;
  7. }
  8. } else {
  9. echo &#092;"Niestety ale musisz sie zalogowac\";
  10. }
  11. ?>


Chodzi mi o to ze poprostu to czy ktos jest zalogoany czy nie, nie wychodzi poza glowny plik czyli np. index.php
Jesli zrobisz cos takiego i nie bedzie dzialac tzn. ze zle tworzysz sejse, albo zle porownujesz...

Acha i jeszcze jedno tongue.gif
Samo logowanie zrob np. w ten sposob.... Akrypt pobiera login i haslo, nastepnie jest wykonywane zapytanie do bazy typu: "SELECT login FROM tabela WHERE login='$login' AND pass=password('$pass')"
i w tej chwili jak otrzymasz zapytanie zwroci Ci login tzn. ze sie zgadza i wtedy robisz np. takie cos:
$_SESSION['login'] = $login (ten login co otrzymales z bazy danych)
i teraz w skrypcie ktory napisalem wyzej w funkcji if gdzie napisalem zalogowany wpisujesz np. tak:
if(isset($_SESSION['login'])) {
.....
}

Mam nadzieje ze chociaz troszke mnie zrozumiales:P Godzina pozna wiec moze troszke niejasno napisalem, niemniej wydaje mi sie ze troche mozna z tego wyniesc winksmiley.jpg

Pozdro smile.gif
Lerno
smile.gif

Nie chcialo ci sie spojrzec na skrypcik ktory wkleilem w 1 poscie smile.gif
Mam 2 pliki:
index.php -> pelni role szablonu i includuje plik (register.php)
register.php -> powyzszy kod, w ktorym:

Jesli logowanie przebieglo pomyslnie to oznacza ze zmienna $zalogowany = true;
Kod
if($zalogowany == "true"){

Po zalogowaniu daje opcje przejscia do podstrony panelu:
Kod
echo '<dt><span>Podstawowe</span></dt><dt><span>•</span> <a href="'. $_SERVER["PHP_SELF"] .'?id=1">Dzial</a></dt>';
         if(@$_GET['id'] == "1"){
            echo 'Sztama!';
         }


Wiec niby jest to o czym pisales. :|
Strzyzyk_MC
So... Zamiast przypisywac do zmiennej zalogowany true i false proponuje zrobic tak jak mowilem tzn. zeby zapytanie zwracalo login i jak zwroci to przypisac je do sesji i sprawdzac czy sesje istnieje... W koncu to jest zmienna superglobalna i nie bedzie trzeba sie martwic na przyszlosc...
Po 2 nie wiem skad to sie wzielo w ogole:
  1. <?php
  2.  
  3. if($user_logged == '1')  $status = 'update';
  4. else if($user_logged == '2')  $status = 'moderatorek';
  5. else if($user_logged == '3')  $status = 'adminek';
  6.  
  7. ?>

tzn gdzie masz te zmienne ? z bazy je bierzesz?

Pozdro
Lerno
Kod
if((isset($_POST['login']))&amp;&amp;(isset($_POST['pass']))){      
      $login = addslashes($_POST['login']);
      $pass = addslashes($_POST['pass']);
      if(!isset($db_status) || $db_status !== false){
         $query = mysql_query("SELECT * FROM `user` WHERE `login`='".$login."' AND `pass`='".$pass."';");
         if(mysql_num_rows($query) == 1){
            $zalogowany = "true";
            $_SESSION['login'] = $login;
            $_SESSION['pass'] = $pass;
            $wiersz = mysql_fetch_array($query);
            $_SESSION['name'] = $wiersz['name'];
            $_SESSION['email'] = $wiersz['email'];
            $user_logged = $wiersz['level'];
         }
      }  
   }


Jak widzisz tutaj do $user_logged po zalogowaniu przypisuje dane z bazy. Te dane to numerki ktore oznaczaja poziom dostepu/uprawnienia. Dalej przypisuje tym numerka juz poprostu wartosci aby np zamiast "2" wyswietlic "Administrator" i po to jest $status. Potem tez w zaleznosci od tego jaki ma gosc status dostaje takie opcje uzytkownika jakie sie mu naleza.

A co do logowania to na poczatku sprawdzam czy jest zmienna loginu i hasla tzn wypelnil formularz logowania, jesli nie to sprawdz czy istnieje sesja.
  1. <?php
  2.  
  3.  $zalogowany = &#092;"false\";
  4.  if(isset($_POST['login'])) $login = $_POST['login'];
  5.  else  $login = @$_SESSION['login'];
  6.  if(isset($_POST['pass'])) $pass = $_POST['pass'];
  7.  else  $pass = @$_SESSION['pass'];
  8.  
  9. ?>
Strzyzyk_MC
No ok, i co dalej sie wychacza ? Jesli tak to napisz jak wpisujesz przejscie do innej strony...
Lerno
Napisalem od nowa, starajac sie analizowac krok po kroku no i chyba to dalo efekt, bo zdaje sie ze dziala. Chcialbym sie teraz zapytac czy ta metoda jaka ponizej zamieszcze jest BEZPIECZNA! Prosze o wszelkie opinie, nawet jakies "polslowka", najwyzej poszukam i zglebie temat. Chcialbym poprostu miec pewnosc, czy nie mozna tego byle jakim trickiem obejsc ot tak.

index.php
  1. <?
  2. if(isset($_SESSION['name'])){
  3. echo 'Zalogowany ' . $_SESSION['name'].'<br />';
  4. echo '<p><a href=\"'.$_SERVER[&#092;"PHP_SELF\"].'?id=1\">menu 1</a><br />';
  5. echo'<a href=\"'.$_SERVER[&#092;"PHP_SELF\"].'?id=logout\">Wyloguj</a></p>';
  6.  
  7. if(@$_GET['id'] == &#092;"1\") echo 'Test';
  8. if(@$_GET['id'] == &#092;"logout\"){
  9. echo 'Wylogowano';
  10. };
  11. }
  12. else{
  13. echo 'Niezalogowany';
  14. //wyswietlamy formularz
  15. echo '<form action=\"submit.php\" method=\"post\">
  16. Login: <input type=\"text\" name=\"login\" /><br />
  17. Hasło: <input type=\"password\" name=\"pass\" /><br />
  18. <input type=\"submit\" value=\"Zaloguj\" />
  19. </form>
  20. ';
  21. }
  22. ?>
  23. </body>
  24.  
  25. </html>


submit.php
  1. <?php
  2.  
  3. require('config.php'); 
  4. if((isset($_POST['login']))&&(!empty($_POST['login']))&&(isset($_POST['pass']))&&(!empty($_POST['pass']))){
  5. $login = $_POST['login'];
  6. $pass = $_POST['pass'];
  7. echo 'Dane jakie podales: ' . $login . ' i ' . $pass . '.<br />';
  8. $query = mysql_query(&#092;"SELECT * FROM `users` WHERE `login`='\".$login.\"' AND `pass`='\".$pass.\"';\");
  9. if(mysql_num_rows($query) == 1){
  10. // przypisuje do sesji jego login i pass
  11. $_SESSION['login'] = $login;
  12. $_SESSION['pass'] = $pass;
  13. // dodatkowo przypisuje inne dane dotyczace tego usera do sesji
  14. $wiersz = mysql_fetch_array($query);
  15. $_SESSION['name'] = $wiersz['name'];
  16. $_SESSION['email'] = $wiersz['email'];
  17. echo 'Zalogowales sie '.$_SESSION['name'] . ' o e-mail`u '. $_SESSION['email'].'<br />';
  18. echo '<a href=\"index.php?id=1\">menu 1</a>';
  19. }
  20. else{
  21. echo 'Nie ma takiego uzytkownika!';
  22. }
  23. }
  24. else{
  25. echo 'Nie podales danych!';
  26. }
  27.  
  28. ?>


config.php
  1. <?
  2. $db_info['host'] = &#092;"localhost\";
  3. $db_info['user'] = &#092;"xxx\";
  4. $db_info['pass'] = &#092;"xxx\";
  5. $db_info['db']  = &#092;"xxx\";
  6. $db_connection = mysql_connect($db_info['host'], $db_info['user'], $db_info['pass']) or die('ble');
  7. $db_select = mysql_select_db($db_info['db'], $db_connection) or die('ble2');
  8. ?>
Strzyzyk_MC
No i dla mnie lajt smile.gif Bledow chyba nie ma (chodz moge sie mylic tongue.gif ). Wykorzystaj teraz to dobrze do przechodzenia przez strony i bedzie lajt winksmiley.jpg
Pozdro
Lerno
Strzyzyk dzieki za helpa smile.gif

Oczywiscie powinno byc jeszcze przed sprawdzaniem danych usera z info w bazie dodane addslashes(); To chyba uniemozliwi atak SQL injection, ale nie jestem pewien winksmiley.jpg

Mam nadzieje ze ktos z bardziej zaawansowanych ludzikow napisze tu cos wiecej o bezpieczenstwie powyzszego skryptu. Nadzieja matka glupich, ale co tam... smile.gif

Jeszcze raz dzieki za helpa Strzyzyk.
Strzyzyk_MC
N/p. Poza tym przed sprawdzeniem powinno byc chyba stripslashes a nie addslashes ?tongue.gif

Pozdr winksmiley.jpg
popbart
Cytat
Oczywiscie powinno byc jeszcze przed sprawdzaniem danych usera z info w bazie dodane addslashes(); To chyba uniemozliwi atak SQL injection, ale nie jestem pewien winksmiley.jpg

Polecam mysql_escape_string" title="Zobacz w manualu PHP" target="_manual
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-2024 Invision Power Services, Inc.